繁体   English   中英

在大型数据集上拆分PDF文件-为每一定数量的行/页创建多个PDF文件C#

[英]Split PDF file on large dataset - Create multiple PDF files for every certain number of rows/pages C#

我有一个89k行的大型数据集,需要将其导出到PDF文件。 使用我当前的代码,我可以导出30k行,但是当我增加.Take超过30k时,会出现“文档无页面”错误。 现在我要实现的是为数据集中的每30k行创建一个PDF文档,以便

from this 89k rows..
file a -> 30k rows
file b -> 30k rows
file c -> 29k rows

也就是说,只要有行/记录将文件创建拆分为您获得的每30k行。 这是我当前的代码

var list = conStrings.GetReport().Take(30000); //get rows from DB/table

WebGrid grid = new WebGrid(source: list, canPage: false, canSort: false);            
        string gridHtml = grid.GetHtml(
                                        tableStyle: "webgrid-table",
                                        headerStyle: "webgrid-header",                                            
            columns: grid.Columns(
                    grid.Column("q_barcode", "Barcode"),
                    grid.Column("q_description", "Description"),
                    grid.Column("q_sellprice","Price", format: (item) => new HtmlString("€" + Convert.ToString(item.q_sellprice))),
                    grid.Column("unitCost","Unit Cost", format: (item) => new HtmlString("€" + Convert.ToString(item.unitCost))),
                    grid.Column("VatRate","Vat Rate %", format: (item) => new HtmlString(Convert.ToString(item.VatRate + "%"))),
                    grid.Column("grossProfit","GP %", format: (item) => new HtmlString(Convert.ToString(item.grossProfit + "%")))
                )
            ).ToString();


using (var ms = new MemoryStream())
{
//iTextSharp Document which is an abstraction of a PDF but **NOT * *a PDF
using (var doc = new Document())
{
    //writer that's bound to our PDF abstraction and our stream  
    using (var writer = PdfWriter.GetInstance(doc, ms))
    {
        // open the document for writing
        doc.Open();

        // read html data to StringReader 
        //using (var srHtml = new StringReader(gridHtml))
        using (var msCss = new MemoryStream(Encoding.UTF8.GetBytes(webgridstyle)))
        {
            using (var srHtml = new MemoryStream(Encoding.UTF8.GetBytes(gridHtml)))
            {
                iTextSharp.tool.xml.XMLWorkerHelper.GetInstance()
                    .ParseXHtml(writer, doc, srHtml, msCss);
            }
        }

        doc.Close();
    }
}

  myBytes = ms.ToArray();
}

var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "PDF_Report_"+timestamp+".pdf");

System.IO.File.WriteAllBytes(testFile, myBytes);

因此,从这段代码中,我想说

var list = conStrings.GetReport(); //get data from DB regardless of size

并每30k行/或500页(例如)创建一个文档。 什么是实现这一目标的最佳方法?

您可以在具有不同HTML代码段的同一iText文档上多次运行ParseXhtml方法。

我对WebGrid不熟悉,但是我认为您应该能够多次调用Take()并将结果存储在List中。 然后,您可以遍历此HTML代码段列表,然后每个HTML代码段调用ParseXhtml()。

当它们到达分页结果的末尾时,这将导致表无法填充页面。 您还可以使用XML解析合并HTML代码段。

尝试这样:

var batchedList = conStrings.GetReport()
.Select((data,index) => new {data, index})
.GroupBy(item => item.index / 30000)
.Select(grp => grp.Select(x => x.data));

foreach(var list in batchedList)
{
    {{INSERT RESET OF YOUR METHOD HERE}}
}

这应该将“ conStrings.GetReport()”的结果分为30k组,然后遍历结果

显然这行:

var list = conStrings.GetReport().Take(30000); //get rows from DB/table

在foreach循环内将不需要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM