2012-04-11 5 views
2

Я использовал iText для какой-то другой утилиты, например, с успехом слияние и редактирование файлов PDF. Теперь мне нужно перекрывать 2 PDF страницы:Pdf Merge/Overlap with iText

Например: INPUT: PDF # 1 (1 страница) PDF # 2 (1 страница)

ВЫВОД: PDF # 3 (1 Страница: Это является результатом 2-х входных страниц с перекрытием)

Я не знаю, можно ли это сделать с последней версией iText. Я также рассматриваю возможность использования одного из двух входных PDF-файлов в качестве фона для файлов вывода PDF.

Заранее спасибо.

ответ

3

Это на самом деле довольно легко сделать. Объект PdfWriter имеет метод экземпляра, называемый GetImportedPage(), который возвращает объект PdfImportedPage. Этот объект можно передать методу PdfContentByteAddTemplate().

GetImportedPage() принимает объект PdfReader и номер страницы, которую вы хотите получить. Вы можете получить PdfContentByte от экземпляра PdfWriter 's DirectContent.

Код ниже - это полное рабочее приложение C# 2010 WinForms, нацеленное на iTextSharp 5.1.2.0, которое показывает все это. Сначала он создает два файла на рабочем столе, первый - только сплошной красный цвет фона, а второй - только абзац. Затем он объединяет эти два файла, перекрывающиеся в третий документ. См. Код для дополнительных комментариев.

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

очень приятно Хорошая работа .. –