【发布时间】:2014-08-07 01:09:45
【问题描述】:
我有 3 个 pdf 模板,我填写并保存到内存流中,它们将它们合并为 1 个 pdf 到内存流中。生成的合并 pdf 未展平。我尝试阅读合并的 pdf 并将其展平,但它说“找不到 pdf 标头签名”。有没有办法从内存流中展平合并的 pdf。 这是我迄今为止尝试过的,但没有成功。
var mergedPdf = MergePDFs(AllPdfs);
MemoryStream flattenedMergedPdf = new MemoryStream();
PdfReader Finalpdf = new PdfReader(mergedPdf);
PdfStamper StampFinalMerged = new PdfStamper(Finalpdf,flattenedMergedPdf);
StampFinalMerged.FormFlattening=true;
return flattenedMergedPdf;
我用来合并 pdf 的方法(在 SO 上找到)如下:
public MemoryStream MergePDFs(List<byte[]> pdfFiles)
{
if (pdfFiles.Count > 1)
{
PdfReader finalPdf;
Document pdfContainer;
PdfCopy pdfCopy;
MemoryStream msFinalPdf = new MemoryStream();
finalPdf = new PdfReader(pdfFiles[0]);
pdfContainer = new Document();
pdfCopy = new PdfSmartCopy(pdfContainer, msFinalPdf);
pdfContainer.Open();
for (int k = 0; k < pdfFiles.Count; k++)
{
finalPdf = new PdfReader(pdfFiles[k]);
for (int i = 1; i < finalPdf.NumberOfPages + 1; i++)
{
((PdfSmartCopy)pdfCopy).AddPage(pdfCopy.GetImportedPage(finalPdf, i));
}
pdfCopy.FreeReader(finalPdf);
}
//tried this here but no success
// PdfReader FinalRead = new PdfReader(finalPdf);
//MemoryStream FinalMS = new MemoryStream();
//var finalStamper = new PdfStamper(FinalRead, FinalMS);
//finalStamper.FormFlattening = true;
pdfCopy.CloseStream = false;
pdfCopy.Close();
finalPdf.Close();
//return FinalMS
return msFinalPdf;
}
任何帮助将不胜感激。谢谢
【问题讨论】:
-
我尝试阅读合并的 pdf 并将其展平,但它说“找不到 pdf 标头签名”。 - 如果它这么说,那么
mergedPdf流似乎不是提供适当的 PDF。如果您将该流的内容存储到磁盘,您会得到什么? -
您的
bytes是如何获得的?您是在MemoryStream上使用ToArray()还是GetBuffer()?另外,我强烈建议不要传递MemoryStreams,而只传递原始字节。
标签: pdf itextsharp itext