在我的工作中,有时我必须合并几个到几百个pdf文件。我一直在使用Writer
和ImportedPages
类。但是,当我将所有文件合并为一个文件时,文件大小将变得非常大,所有合并文件的大小之和会增加,因为字体附在每个页面上,而不被重用(字体嵌入到每个页面中,而不是整个文档中)。
不久前,我发现了有关PdfSmartCopy
类的信息,该类可重用嵌入式字体和图像。问题就来了。很多时候,在将文件合并在一起之前,我必须向它们添加其他内容(图像,文本)。为此,我通常使用PdfContentByte
对象中的Writer
。
Document doc = new Document();
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("C:\test.pdf", FileMode.Create));
PdfContentByte cb = writer.DirectContent;
cb.Rectangle(100, 100, 100, 100);
cb.SetColorStroke(BaseColor.RED);
cb.SetColorFill(BaseColor.RED);
cb.FillStroke();
当我对
PdfSmartCopy
对象执行类似操作时,页面会合并,但不会添加任何其他内容。使用PdfSmartCopy
进行测试的完整代码:using (Document doc = new Document())
{
using (PdfSmartCopy copy = new PdfSmartCopy(doc, new FileStream(Path.GetDirectoryName(pdfPath[0]) + "\\testas.pdf", FileMode.Create)))
{
doc.Open();
PdfContentByte cb = copy.DirectContent;
for (int i = 0; i < pdfPath.Length; i++)
{
PdfReader reader = new PdfReader(pdfPath[i]);
for (int ii = 0; ii < reader.NumberOfPages; ii++)
{
PdfImportedPage import = copy.GetImportedPage(reader, ii + 1);
copy.AddPage(import);
cb.Rectangle(100, 100, 100, 100);
cb.SetColorStroke(BaseColor.RED);
cb.SetColorFill(BaseColor.RED);
cb.FillStroke();
doc.NewPage();// net nesessary line
//ColumnText col = new ColumnText(cb);
//col.SetSimpleColumn(100,100,500,500);
//col.AddText(new Chunk("wdasdasd", PdfFontManager.GetFont(@"C:\Windows\Fonts\arial.ttf", 20)));
//col.Go();
}
}
}
}
}
现在我有几个问题:
PdfSmartCopy
对象的DirectContent? 最佳答案
首先,使用PdfWriter
/ PdfImportedPage
不是一个好主意。您将放弃所有交互式功能!作为iText的作者,尽管我写了两本书有关这一事实,而且尽管我说服了出版商为iText提供了最重要的章节之一,但令如此之多的人犯同样的错误非常令人沮丧。免费:http://www.manning.com/lowagie2/samplechapter6.pdf
我的写作真的那么糟糕吗?还是人们继续使用PdfWriter
/ PdfImportedPage
合并文档的另一个原因?
至于您的具体问题,以下是答案:
PageStamp
。 PdfCopy
传递它来减小大小;或首先使用PdfCopy创建合并的PDF,然后使用PdfStamper
在第二遍添加额外的内容。