2012-02-01 1 views
1

У меня есть существующий документ PDF под названием aa.pdf. Этот PDF-документ имеет 3 страницы. Я хотел бы добавить поле формы PDF (или текст) в нижней части страницы первой страницы в aa.pdf, используя iTextSharp.Как добавить поле формы PDF (или текст) и ссылку в нижней части страницы существующего документа PDF с помощью iTextSharp?

Между тем, я также надеюсь, что поле формы PDF, добавленное (или добавленный текст), может ссылаться на другую страницу aa.pdf. Например, после того, как я щелкнул поле формы PDF (или текст), расположенное на первой странице aa.pdf, этот документ PDF переходит на вторую страницу.

Как реализовать реализованные функции с помощью iTextSharp?

Спасибо.

+0

возможно дубликат http://stackoverflow.com/questions/1848930/how-to-add-a-form-field-to-an-existing-pdf-with-itextsharp –

+0

не простофиля, просто смутно сформулированный вопрос. –

ответ

2

Для создания ссылок в PDF вы используете PdfAction, который может быть установлен на Chunk, который может быть добавлен в Paragraph. Есть несколько различных типов действий, которые вы можете выбрать, те, которые вам интересны, - это действие NEXTPAGE и/или действие GotoLocalPage. Первый пункт делает то, что он говорит, и переходит к следующей странице. Это хорошо, потому что вам не нужно беспокоиться о том, какой номер страницы вы находитесь. Второй пункт позволяет указать конкретный номер страницы для перехода. В своей простейшей форме вы можете сделать:

Chunk ch = new Chunk("Go to next page").SetAction(new PdfAction(PdfAction.NEXTPAGE)); 

Это создает Chunk, что вы можете добавить в любом случае вы хотите. При работе с существующим PDF существует несколько способов добавления текста на страницу. Один из способов использования объекта ColumnText, который имеет метод под названием SetSimpleColumn, который позволяет вам определить простой прямоугольник, к которому вы можете добавить элементы.

И, наконец, читатели PDF не обрабатывают ссылки по-разному в PDF-документе, кроме как при указании другого курсора. Более конкретно, в отличие от веб-страницы, где гиперссылки превращаются в другой цвет, PDF-файлы не меняют цвет ссылок, если вы их не скажете, поэтому это следует иметь в виду при их создании. Кроме того, при изменении PDF вы вообще никогда не хотите перезаписывать существующий PDF во время процесса, потому что это будет писать что-то, что вы читаете. Иногда это работает, чаще всего это не ломается, иногда тонко. Вместо этого напишите во второй файл, и когда вы полностью закончите, сотрите первый файл и переименуйте второй файл.

Код, приведенный ниже, представляет собой полнофункциональное приложение для WinForms C# 2010, ориентированное на iTextSharp 5.1.2.0. Первая часть кода создает образец PDF под названием «aa.pdf» на рабочем столе. Если у вас уже есть этот файл, вы можете прокомментировать этот раздел, но его здесь, чтобы другие могли воспроизвести этот пример. Вторая часть создает новый файл под названием «bb.pdf» на основе «aa.pdf». Он добавляет две текстовые ссылки в нижней части первой страницы. Первая ссылка продвигает PDF на следующую страницу, а вторая ссылка продвигает PDF к определенному номеру страницы. См. Комментарии в коде для конкретных деталей реализации.

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) { 
      //Files that we'll be working with 
      string inputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "aa.pdf"); 
      string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "bb.pdf"); 

      //Create a standard PDF to test with, nothing special here 
      using (FileStream fs = new FileStream(inputFile, FileMode.Create, FileAccess.Write, FileShare.None)) { 
       using (Document doc = new Document(PageSize.LETTER)) { 
        using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) { 
         doc.Open(); 

         //Create 10 pages with labels on each page 
         for (int i = 1; i <= 10; i++) { 
          doc.NewPage(); 
          doc.Add(new Paragraph(String.Format("This is page {0}", i))); 
         } 

         doc.Close(); 
        } 
       } 
      } 

      //For the OP, this is where you would start 


      //Declare some variables to be used later 
      ColumnText ct; 
      Chunk c; 

      //Bind a reader to the input file 
      PdfReader reader = new PdfReader(inputFile); 
      //PDFs don't automatically make hyperlinks a special color so we're specifically creating a blue font to use here 
      iTextSharp.text.Font BlueFont = FontFactory.GetFont("Arial", 12, iTextSharp.text.Font.NORMAL, iTextSharp.text.BaseColor.BLUE); 

      //Create our new file 
      using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) { 
       //Bind a stamper to our reader and output file 
       using (PdfStamper stamper = new PdfStamper(reader, fs)) { 

        Chunk ch = new Chunk("Go to next page").SetAction(new PdfAction(PdfAction.NEXTPAGE)); 

        //Get the "over" content for page 1 
        PdfContentByte cb = stamper.GetOverContent(1); 

        //This example adds a link that goes to the next page 
        //Create a ColumnText object 
        ct = new ColumnText(cb); 
        //Set the rectangle to write to 
        ct.SetSimpleColumn(0, 0, 200, 20); 
        //Add some text and make it blue so that it looks like a hyperlink 
        c = new Chunk("Go to next page", BlueFont); 
        //Set the action to go to the next page 
        c.SetAction(new PdfAction(PdfAction.NEXTPAGE)); 
        //Add the chunk to the ColumnText 
        ct.AddElement(c); 
        //Tell the system to process the above commands 
        ct.Go(); 

        //This example add a link that goes to a specific page number 
        //Create a ColumnText object 
        ct = new ColumnText(cb); 
        //Set the rectangle to write to 
        ct.SetSimpleColumn(200, 0, 400, 20); 
        //Add some text and make it blue so that it looks like a hyperlink 
        c = new Chunk("Go to page 3", BlueFont); 
        //Set the action to go to a specific page number. This option is a little more complex, you also have to specify how you want to "fit" the document 
        c.SetAction(PdfAction.GotoLocalPage(3, new PdfDestination(PdfDestination.FIT), stamper.Writer)); 
        //Add the chunk to the ColumnText 
        ct.AddElement(c); 
        //Tell the system to process the above commands 
        ct.Go(); 
       } 
      } 

      this.Close(); 
     } 
    } 
}