pdf itextsharp中的大量数据导出

时间:2017-09-14 05:22:46

标签: vb.net pdf itext export-to-pdf

我尝试导出PDF中的数据有大量数据所以当我导出..我不会从gridview导出数据但实际上我在这里创建虚拟gridview代码并绑定该网格中的数据..我不显示数据页面中的网格..我尝试下面的代码

    Private Sub ExportGridToPDF()
        Using myMemoryStream As New MemoryStream()

            Dim myDocument As New iTextSharp.text.Document(iTextSharp.text.PageSize.A1, 10.0F, 10.0F, 10.0F, 0.0F)
            ' Dim myDocument As New iTextSharp.text.Document()
            Dim myPDFWriter As PdfWriter = PdfWriter.GetInstance(myDocument, myMemoryStream)

            myDocument.Open()

            ' Add to content to your PDF here...

            Dim sw As New StringWriter()
            Dim hw As New HtmlTextWriter(sw)
            GridView1.AllowPaging = False
            GridView1.DataBind()
            GridView1.RenderControl(hw)
            ' We're done adding stuff to our PDF.
            myDocument.Add(hw)
            myDocument.Close()

            Dim content As Byte() = myMemoryStream.ToArray()

            ' Write out PDF from memory stream.
            Using fs As FileStream = File.Create("eport_PDF.pdf")
                fs.Write(content, 0, CInt(content.Length))
            End Using
        End Using
End Sub

当我运行时显示错误

System.InvalidCastException:无法将类型为“System.Web.UI.HtmlTextWriter”的对象强制转换为“iTextSharp.text.IElement”。

就行了 myDocument.Add(HW)

我使用内存流因为数据庞大,当我使用没有内存流的代码然后显示错误内存异常,所以我使用内存流,现在显示不同的错误

1 个答案:

答案 0 :(得分:1)

Add()对象中的Document方法仅接受实现IElement接口的参数。您正在传递HtmlTextWriter个对象。该对象与iText完全无关。你会认为这可行的,真是太神奇了。

在这个问题中,与之前发布的问题(其中一些已被删除)一样,您可以参考HTML。您在Add image using itextsharp中使用了HTMLWorker,删除了问题Out Of Memory Exception error itext sharp

如果要将HTML转换为PDF,则应升级到iText 7并使用pdfHTML add-on。查看教程,了解HTML到PDF转换的完成方式:{​​{3}}

在对此答案的评论中,您写道:我没有将HTML中的数据导出为PDF格式。好的,如果这是真的,那么为什么呢?你在代码中引用了HTML?这非常令人困惑。

此外,您编写我在代码中创建虚拟网格视图并将数据绑定在其中。不幸的是,您没有向我们提供有关该虚拟网格格式的任何信息-view 。我认为,这是你发明的东西"你自己,但如果是这样的话,你怎么认为iText可以神奇地理解你发明的虚拟网格视图

我开始回答说Add()方法只接受实现IElement接口的对象。由于您正在谈论网格,因此使用iText表元素可能会很有趣。在iText 5中,有一个名为PdfPTable的对象;在iText 7中,该对象简称为Table

许多拥有大型数据集的人首先创建这样的表对象,然后将其添加到Document。这并不总是明智的,因为对象不断积累在内存中,最终导致OutOfMemoryException。对于大型数据集,您应该将表标记为大元素,然后逐渐添加表。

在iText 5中,代码如下所示:

Document document = new Document();
FileStream stream = new FileStream(fileName, FileMode.Create);
var pdfWriter = PdfWriter.GetInstance(document, stream);
document.Open();
PdfPTable table = new PdfPTable(4);
table.Complete = false;
for (int i = 0; i < 1000000; i++) {
    PdfPCell cell = new PdfPCell(new Phrase(i.ToString()));
    table.AddCell(cell);
    if (i > 0 && i % 1000 == 0) {
        document.Add(table);
    }
}
table.Complete = true;
document.Add(table);
document.Close();

我们将1000000个单元格添加到包含4列的表中,但我们每1000个单元格添加一次表格(因此每250行)。这意味着内容会定期从内存中刷新,从而避免使用OutOfMemoryException

由于您似乎是iText的新手,请帮个忙,并升级到使用iText 7. iText 5处于维护模式,这意味着该版本不会添加任何新功能。例如:如果有人要求您生成PDF 2.0文件(几个月前发布了PDF 2.0规范),您将不得不抛弃所有iText 5代码,重新开始,因为只有iText 7才会支持PDF 2.0。

iText 7中的大表功能将在https://developers.itextpdf.com/content/itext-7-converting-html-pdf-pdfhtml

的末尾讨论
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
Document document = new Document(pdf);
Table table = new Table(new[] {1f, 1f, 1f}, true);
table.AddHeaderCell("Table header 1");
table.AddHeaderCell("Table header 2");
table.AddHeaderCell("Table header 3");
table.AddFooterCell("Table footer 1");
table.AddFooterCell("Table footer 2");
table.AddFooterCell("Table footer 3");
document.Add(table);
for (int i = 0; i < 1000; i++)
{
    table.AddCell($"Row {i + 1}; column 1");
    table.AddCell($"Row {i + 1}; column 2");
    table.AddCell($"Row {i + 1}; column 3");
    if (i % 50 == 0)
    {
        table.Flush();
    }
 }
 table.Complete();
 document.Close();

如您所见,iText 7代码更加直观。我们创建一个包含3列的表,第二个参数(true)表示我们将添加一个非常大的表。我们添加一个标题,添加页脚,然后将表格添加到文档中。然后我们添加1000行,但每50行我们Flush()一次。刷新可用内存,避免内存不足。完成后,我们Complete()表格。

所有这些都记录在官方网站上!您无需创建自己的网格视图。如您所知,发明自己的网格视图无法正常工作

同样重要:你说iTextSharp,我说iText。我们俩的意思相同:iText Group制作的PDF库可用于从C#代码创建PDF文档。只有你使用旧名称,而我们试图根据商标的建议避免使用该名称,该商标告诉我们,有一家名为夏普的公司并不认识其他公司在上下文中使用夏普这个词与公司无关的品牌。 所以请停止说你正在使用iTextSharp;您正在使用iText!