4

私は、PDFファイルのマージや編集など、さまざまなユーティリティにiTextを使用しました。今、私は2つのpdfページを重ねる必要があります:

例: INPUT: PDF#1 (1 ページ) PDF#2 (1 ページ)

出力: PDF#3 (1 ページ: これは、2 つの入力ページが重複した結果です)

iTextの最新バージョンでこれが可能かどうかはわかりません。また、2 つの入力 PDF ファイルの 1 つを PDF 出力ファイルの背景として使用することも検討しています。

前もって感謝します。

4

1 に答える 1

5

それは実際にはかなり簡単です。オブジェクトには、オブジェクトを返すPdfWriterインスタンス メソッドが呼び出されます。このオブジェクトはのメソッドに渡すことができます。GetImportedPage()PdfImportedPagePdfContentByteAddTemplate()

GetImportedPage()取得するPdfReaderオブジェクトとページ番号を取ります。のプロパティPdfContentByteのインスタンスからを取得できます。PdfWriterDirectContent

以下のコードは、iTextSharp 5.1.2.0 を対象とする完全に機能する C# 2010 WinForms アプリであり、これをすべてオフに示しています。まず、デスクトップに 2 つのファイルを作成します。1 つ目は背景色が赤一色で、2 つ目は段落のみです。次に、重複する 2 つのファイルを 3 番目のドキュメントに結合します。追加のコメントについては、コードを参照してください。

using System;
using System.IO;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            //Folder that we'll work from
            string workingFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            string pdf1 = Path.Combine(workingFolder, "pdf1.pdf");//PDF with solid red background color
            string pdf2 = Path.Combine(workingFolder, "pdf2.pdf");//PDF with text
            string pdf3 = Path.Combine(workingFolder, "pdf3.pdf");//Merged PDF

            //Create a basic PDF filled with red, nothing special
            using (FileStream fs = new FileStream(pdf1, FileMode.Create, FileAccess.Write, FileShare.None)) {
                using (Document doc = new Document(PageSize.LETTER)) {
                    using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
                        doc.Open();
                        PdfContentByte cb = writer.DirectContent;
                        cb.SetColorFill(BaseColor.RED);
                        cb.Rectangle(0, 0, doc.PageSize.Width, doc.PageSize.Height);
                        cb.Fill();
                        doc.Close();
                    }
                }
            }

            //Create a basic PDF with a single line of text, nothing special
            using (FileStream fs = new FileStream(pdf2, FileMode.Create, FileAccess.Write, FileShare.None)) {
                using (Document doc = new Document(PageSize.LETTER)) {
                    using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
                        doc.Open();
                        doc.Add(new Paragraph("This is a test"));
                        doc.Close();
                    }
                }
            }

            //Create a basic PDF
            using (FileStream fs = new FileStream(pdf3, FileMode.Create, FileAccess.Write, FileShare.None)) {
                using (Document doc = new Document(PageSize.LETTER)) {
                    using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
                        doc.Open();

                        //Get page 1 of the first file
                        PdfImportedPage imp1 = writer.GetImportedPage(new PdfReader(pdf1), 1);
                        //Get page 2 of the second file
                        PdfImportedPage imp2 = writer.GetImportedPage(new PdfReader(pdf2), 1);
                        //Add the first file to coordinates 0,0
                        writer.DirectContent.AddTemplate(imp1, 0, 0);
                        //Since we don't call NewPage the next call will operate on the same page
                        writer.DirectContent.AddTemplate(imp2, 0, 0);
                        doc.Close();
                    }
                }
            }

            this.Close();
        }
    }
}
于 2012-04-12T14:58:42.797 に答える