【发布时间】:2017-09-08 08:27:15
【问题描述】:
我正在尝试使用下面的代码将文件夹中的 pdf 文件合并并输出到一个新文件中,但显然生成的文件似乎已损坏。
public Boolean MergeForm(String destinationFile, String sourceFolder)
{
try
{
using (MemoryStream stream = new MemoryStream())
using (Document doc = new Document())
using (PdfCopy pdf = new PdfCopy(doc, stream))
{
doc.Open();
PdfReader reader = null;
PdfImportedPage page = null;
foreach (var file in Directory.GetFiles(sourceFolder))
{
reader = new PdfReader(file);
for (int i = 0; i < reader.NumberOfPages; i++)
{
page = pdf.GetImportedPage(reader, i + 1);
pdf.AddPage(page);
}
pdf.FreeReader(reader);
reader.Close();
}
using (FileStream streamX = new FileStream(destinationFile, FileMode.Create))
{
stream.WriteTo(streamX);
}
}
return true;
}
catch (Exception)
{
return false;
}
}
谁能发现问题出在哪里?谢谢。
【问题讨论】:
-
这看起来很像最近的问题using PdfCopy to merge pdf files 的副本。为什么不使用
AddDocument()方法而不是循环遍历不同的页面,一次只添加一页?您使用的是最新版本的 iText 吗? -
然而,主要问题是您正在编写文件的那一刻。当您执行
stream.WriteTo(streamX)时,Document实例尚未关闭。这意味着写入streamX的PDF 不完整。缺少大量信息(例如交叉引用表、字体、PDF 预告片)。只有当docClose()发生时,该信息才会添加到stream。在您的情况下,当达到}括号 afterstream.WriteTo(streamX)之一时,这会隐式发生。 -
@BrunoLowagie 我正在使用 itextsharp 5.5.12.0。顺便说一句,如何修改代码以使用 AddDocument?我会看看你在这里分享的另一个线程,谢谢。
-
您是否阅读了我参考的答案中的代码?您会发现类似这样的内容:
reader = New PdfReader(file); copy.AddDocument(reader); reader.Close();无需遍历页面! -
@BrunoLowagie 哎呀,我在写完答案后才看到你的第二条评论......