在我的工作中,有时我必须合并从几个到几百个 pdf 文件。我一直在使用Writer
和ImportedPages
上课。但是当我将所有文件合并为一个时,文件大小会变得巨大,是所有合并文件大小的总和,因为字体被附加到每一页,而不是重复使用(字体嵌入到每一页,而不是整个文档)。
不久前,我发现了PdfSmartCopy
类,它重用了嵌入的字体和图像。问题就在这里。很多时候,在将文件合并在一起之前,我必须向它们添加额外的内容(图像、文本)。为此,我通常使用PdfContentByte
from Writer
object。
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? - 如果没有,是否有另一种方法可以将多个 pdf 文件合并为一个而不显着增加其大小并且仍然能够在合并时向页面添加其他内容?