5

私の仕事では、数個から数百個の pdf ファイルを結合しなければならないことがあります。私はいつもWriterandImportedPagesクラスを使用してきました。しかし、すべてのファイルを 1 つにマージすると、フォントがすべてのページに添付され、再利用されない (フォントはドキュメント全体ではなくすべてのページに埋め込まれている) ため、マージされたすべてのファイル サイズの合計が膨大なファイル サイズになります。

PdfSmartCopy少し前に、埋め込まれたフォントと画像を再利用するクラスについて知りました。ここで問題が発生します。多くの場合、ファイルをマージする前に、追加のコンテンツ (画像、テキスト) をファイルに追加する必要があります。この目的のために、私は通常PdfContentBytefrom Writerobject を使用します。

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();                            
                    }
                }
            }
        }
    }

今、いくつか質問があります:

  1. PdfSmartCopyオブジェクトの DirectContentを編集することはできますか?
  2. そうでない場合、複数の pdf ファイルを 1 つにマージしてサイズを劇的に増加させず、マージ中にページにコンテンツを追加できる別の方法はありますか?
4

3 に答える 3

11

まずこれ: PdfWriter/の使用PdfImportedPageはお勧めできません。あなたはすべてのインタラクティブな機能を捨てます! iText の著者として、これについて 2 冊の本を書いたという事実にもかかわらず、また iText の最も重要な章の 1 つを提供するように出版社を説得したという事実にもかかわらず、非常に多くの人々が同じ過ちを犯していることに非常に苛立たしいことです。無料: http://www.manning.com/lowagie2/samplechapter6.pdf

私の書き方そんなに悪いの?PdfWriterまたは、人々が/を使用してドキュメントをマージし続ける別の理由がありPdfImportedPageますか?

具体的な質問については、次のとおりです。

  1. はい。サンプルの章をダウンロードし、PDF ファイルで を検索しますPageStamp
  2. 2 つのパスで PDF を作成する場合のみ。たとえば、最初に巨大な PDF を作成し、それを に渡してサイズを縮小しPdfCopyます。または、最初に PdfCopy を使用してマージされた PDF を作成し、次に を使用して 2 番目のパスで余分なコンテンツを追加しPdfStamperます。
于 2012-10-05T07:00:10.537 に答える
7

BrunoLowagieの回答を使用した後のコード

for (int i = 0; i < pdfPath.Length; i++)
{
       PdfReader reader = new PdfReader(pdfPath[i]);
       PdfImportedPage page;
       PdfSmartCopy.PageStamp stamp;
       for (int ii = 0; ii < reader.NumberOfPages; ii++)
       {
            page = copy.GetImportedPage(reader, ii + 1);
            stamp = copy.CreatePageStamp(page);
            PdfContentByte cb = stamp.GetOverContent();
            cb.Rectangle(100, 100, 100, 100);
            cb.SetColorStroke(BaseColor.RED);
            cb.SetColorFill(BaseColor.RED);
            cb.FillStroke();
            stamp.AlterContents(); // don't forget to add this line
            copy.AddPage(page);                  
        }
}
于 2012-10-08T12:41:02.440 に答える