私の仕事では、数個から数百個の pdf ファイルを結合しなければならないことがあります。私はいつもWriter
andImportedPages
クラスを使用してきました。しかし、すべてのファイルを 1 つにマージすると、フォントがすべてのページに添付され、再利用されない (フォントはドキュメント全体ではなくすべてのページに埋め込まれている) ため、マージされたすべてのファイル サイズの合計が膨大なファイル サイズになります。
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 ファイルを 1 つにマージしてサイズを劇的に増加させず、マージ中にページにコンテンツを追加できる別の方法はありますか?