Vb.net pdf格式的海量数据导出

Vb.net pdf格式的海量数据导出,vb.net,pdf,itext,export-to-pdf,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(

我试着导出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.IEElement”

在这条线上 myDocument.Add(硬件)

我使用内存流是因为在使用没有内存流的代码时数据量很大,然后显示内存不足异常,因此我使用内存流,现在显示不同的错误文档
对象中的
Add()
方法只接受实现
IElement
接口的参数。您正在传递一个
HtmlTextWriter
对象。该对象与iText完全无关。你会认为这是可行的,这真是令人惊讶

在这个问题中,正如您先前发布的问题(其中一些问题已被删除)一样,您指的是HTML。您在中使用了
HTMLWorker
,并且删除了问题

如果要将HTML转换为PDF,应升级到iText 7并使用。查看教程,了解如何将HTML转换为PDF:

然而,在对这个答案的评论中,您写道:我没有将HTML格式的数据导出为PDF格式。好吧,如果这是真的,那么为什么在代码中引用HTML?这很让人困惑

此外,您还可以编写我在代码中创建虚拟网格视图并在其中绑定数据。不幸的是,您没有给我们任何关于虚拟网格视图格式的信息。我想,这是你自己“发明”的东西,但如果是这样,你怎么认为iText可以神奇地理解你发明的虚拟网格视图呢

我开始回答这个问题时说
Add()
方法只接受实现
IElement
接口的对象。既然您正在谈论网格,那么使用iText table元素可能会很有趣。在iText 5中,有一个名为
PdfPTable
的对象;在iText 7中,该对象仅被命名为
Table

许多拥有大型数据集的人,首先创建这样一个表对象,然后将其添加到
文档中。这并不总是明智的,因为对象在内存中不断累积,最终导致
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();
如您所见,iText 7代码更加直观。我们创建了一个包含3列的表,第二个参数(
true
)表示我们将添加一个非常大的表。我们添加页眉、页脚,然后将表添加到文档中。然后我们添加1000行,但是我们每50行刷新一次表。刷新可用内存,避免内存耗尽。完成后,我们将
完成()
表格

所有这些都记录在官方网站上您无需发明自己的网格视图。正如您所发现的,创建自己的网格视图是不可能的


同样重要:你说iTextSharp,我说iText。我们两人的意思都是一样的:iText Group生成的PDF库,可用于从C#code创建PDF文档。只有您使用的是旧名称,而我们根据一个商标的建议尽量避免使用该名称,该商标告诉我们,有一家名为夏普的公司不喜欢其他公司在与公司无关的品牌背景下使用夏普一词所以请停止说您正在使用iTextSharp;你在用iText

我没有将HTML格式的数据导出为pdf格式。。我在代码中创建虚拟网格视图,并在其中绑定数据。。我点击按钮直接导出pdf格式的数据。。。如果我在这个问题上有错误,那么我会提出问题,这并不意味着你总是否决我的问题。。在开发领域,你们可能比我更有经验,但这并不意味着你们会通过否决别人的问题来帮助他们……”好的,请解释一下为什么要使用
HtmlTextWriter
对象。为什么您认为这是有意义的,为什么您认为将这样一个对象添加到iText
文档
实例中会有效?你们在哪里找到了让你们相信会有用的东西?向下投票的问题是为了保持堆栈溢出干净。它的目的是劝阻不认真的人,比如学生使用堆栈溢出让别人做作业,或者阻止懒惰的开发人员让别人为他们做工作。在您的情况下,堆栈溢出不能代替教育。当然,你可以从Stack Overflow中学到很多东西,但是Stack Overflow并不能取代获得计算机科学学位。出于某种原因,你不理解给出的答案。要么你是出于恶意,要么你没有受过足够的教育去理解。@user123我再给你一次学习的机会。我会更新我的答案,如果你不(想)理解这个解释,我会放弃你。根据我的经验,我知道如果我放弃了你,其他很多人也会放弃你。。。。Dim GridView1作为新的GridView我没有在页面中显示该网格我已经更新了答案。如果你是一个认真的开发人员,你将停止使用iTextSharp这个词,你将升级到iText 7,你将从教程中学习,而不是试图重新发明轮子。
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();