【问题标题】:Creating PDf consisting of multiple Pages with itext 7使用 itext 7 创建由多个页面组成的 PDf
【发布时间】:2021-10-03 16:30:59
【问题描述】:

我正在使用 itext 7 从 Html 文件中创建多页 PDf。

MemoryStream finalDocumenStream = new MemoryStream();
StampingProperties documentProperties = new StampingProperties();
documentProperties.UseAppendMode();
PdfDocument finalPDfDocument = new PdfDocument(new PdfWriter(finalDocumenStream),
documentProperties);

我在一个数组上的 foreach 中循环并调用此方法来创建文档:

CustomTagWorkerFactory customTagWorkerFactory = new CustomTagWorkerFactory(page);
Document pDFdocument = HtmlConverter.ConvertToDocument(htmltext, new PdfWriter(stream), 
converterProperties);

我想将文档保存到 finalPdfDocumet

pDFdocument.GetPdfDocument().CopyPagesTo(1, 
pDFdocument.GetPdfDocument().GetNumberOfPages(), finalPDfDocument);

在 foreach() 之后,我返回了 finalDocumenStream;我期待着把所有的文件都放在这里。 我想从我的 .Net Api 控制器返回 Pdf Stream: return File(pdfStream, "application/pdf");

我无法合并迭代内部的流并将文档返回给客户端。

我做错了什么?有什么建议吗? 感谢您的帮助?

【问题讨论】:

  • 首先请注意,使用PdfWriter 创建的PdfDocument 实例通常一方面包含未完成的对象,另一方面已经将数据写入PdfWriter。因此,您无法将页面从它们干净地复制到其他文档。通常会抛出这样的异常......因此,要组合此类文档,最初将它们定位到MemoryStream,完成后关闭它们,并仅基于初始化的PdfReader 构造一个新的PdfDocument MemoryStream.
  • @mkl 非常感谢您的回答。我尝试了以下但得到“找不到 PDF 标题”:pDFdocument.GetPdfDocument().CopyPagesTo(1, pDFdocument.GetPdfDocument().GetNumberOfPages(), finalPDfDocument); pdfWriter.GetOutputStream().CopyTo(finalDocumenStream); finalPdfDocuments.Add( new PdfDocument(new PdfReader(finalDocumenStream)))
  • 获取PdfWriter 输出流没有帮助,因为在作者的文档关闭之前它不包含任何完整的内容。有关我的评论的更详细版本,请参阅我的答案。

标签: html .net api pdf itext7


【解决方案1】:

首先请注意,使用PdfWriter 创建的PdfDocument 实例通常一方面包含未完成的对象,另一方面已经将数据写入 PdfWriter。因此,您无法将页面从它们干净地复制到其他文档中。

当您尝试从那时起进行复制时,通常甚至会抛出一个异常。您可能会捕获并忽略此类异常吗?

因此,要合并此类文档,首先将它们定位到 MemoryStream,完成后关闭它们,然后仅基于用 MemoryStream 初始化的 PdfReader 构造一个新的 PdfDocument

PdfDocument fullDocument = new PdfDocument(...);
...
MemoryStream ms = new MemoryStream();
PdfDocument partialDoc = new PdfDocument(new PdfWriter(ms));
[... add content to partialDoc ...]
partialDoc.Close();
partialDoc = new PdfDocument(new PdfReader(ms.ToArray()));
partialDoc.CopyPagesTo(1, partialDoc.GetNumberOfPages(), fullDocument);
partialDoc.Close();
...
fullDocument.Close();

【讨论】:

  • 感谢您的帮助,非常感谢 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2017-04-13
  • 2012-09-06
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多