要制作由许多PDF的第一页组成的PDF,请使用以下代码:
using (FileStream fs = new FileStream(Path.Combine(pathPorducedPDFs, "function1.pdf"), FileMode.Create))
using (Document document = new Document(PageSize.A2))
using (PdfWriter writer = PdfWriter.GetInstance(document, fs))
{
document.Open();
PdfContentByte cb = writer.DirectContent;
foreach (string pdfPath in Directory.GetFiles(pathOriginalPDFs).OrderBy(x => x).ToList())
{
using (PdfReader reader = new PdfReader(pdfPath))
{
PdfImportedPage page = writer.GetImportedPage(reader, 1);
document.NewPage();
cb.AddTemplate(page, 0, 0);
document.Add(new Paragraph(pdfPath));
}
}
document.Close();
writer.Close();
fs.Close();
}
但是看起来,处置PdfReader也会使Document和Writer也处置。
实际上,第document.Close();
行引发了异常:
System.ObjectDisposedException
为什么会这样?
通过不处理PdfReader,可以避免该错误,但是从我的角度来看,这样做是错误的,而这个问题是要了解为什么会发生这种情况!
感谢@mkl的解决方案:
using (FileStream fs = new FileStream(Path.Combine(pathPorducedPDFs, "function1.pdf"), FileMode.Create))
using (Document document = new Document(PageSize.A2))
using (PdfWriter writer = PdfWriter.GetInstance(document, fs))
{
document.Open();
PdfContentByte cb = writer.DirectContent;
foreach (string pdfPath in Directory.GetFiles(pathOriginalPDFs).OrderBy(x => x).ToList())
{
using (PdfReader reader = new PdfReader(pdfPath))
{
PdfImportedPage page = writer.GetImportedPage(reader, 1);
document.NewPage();
cb.AddTemplate(page, 0, 0);
document.Add(new Paragraph(pdfPath));
writer.FreeReader(reader);
}
}
document.Close();
writer.Close();
fs.Close();
}
答案 0 :(得分:2)
使用
writer.FreeReader(reader);
在reader
的{{1}}块的右括号之前。
从阅读器导入页面后,using
会跟踪该阅读器,但实际上尚未将所有数据从该页面复制到目标文档。仅在PdfWriter
调用期间或关闭时,复制完成并释放到该阅读器的链接。
当从同一源文档的多个页面复制页面内容时,这使iText不必不必要地复制资源。