在我的工作中,有时我必须合并几个到几百个pdf文件。我一直在使用WriterImportedPages类。但是,当我将所有文件合并为一个文件时,文件大小将变得非常大,所有合并文件的大小之和会增加,因为字体附在每个页面上,而不被重用(字体嵌入到每个页面中,而不是整个文档中)。

不久前,我发现了有关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?
  • 如果没有,是否还有另一种方法可以将多个pdf文件合并为一个文件,而不会显着增加其大小,并且仍然能够在合并时向页面添加其他内容?
  • 最佳答案

    首先,使用PdfWriter / PdfImportedPage不是一个好主意。您将放弃所有交互式功能!作为iText的作者,尽管我写了两本书有关这一事实,而且尽管我说服了出版商为iText提供了最重要的章节之一,但令如此之多的人犯同样的错误非常令人沮丧。免费:http://www.manning.com/lowagie2/samplechapter6.pdf

    我的写作真的那么糟糕吗?还是人们继续使用PdfWriter / PdfImportedPage合并文档的另一个原因?

    至于您的具体问题,以下是答案:

  • 是的。下载示例章节,然后在PDF文件中搜索PageStamp
  • 仅当您通过两次创建PDF时。例如:首先创建巨大的PDF,然后通过PdfCopy传递它来减小大小;或首先使用PdfCopy创建合并的PDF,然后使用PdfStamper在第二遍添加额外的内容。
  • 07-24 21:52