如何使用iTextSharp在现有PDF文档的页面底部添加PDF表单字段(或文本)和链接?

时间:2012-02-01 15:40:20

标签: c# .net pdf itextsharp

我有一个名为aa.pdf的现有PDF文档。此PDF文档有3页。我想使用iTextSharp在aa.pdf的第一页的页面底部添加PDF表单字段(或文本)。

同时,我也希望添加的PDF表单字段(或添加的文本)可以链接到aa.pdf的另一页面。例如,单击位于aa.pdf第一页中的PDF表单域(或文本)后,此PDF文档将跳至第二页。

如何使用iTextSharp实现上述功能?

感谢。

1 个答案:

答案 0 :(得分:2)

要在PDF中创建链接,请使用PdfActionChunk可以在Paragraph上设置,可以选择将其添加到NEXTPAGE。您可以选择几种不同类型的操作,您可能感兴趣的两种操作是GotoLocalPage操作和/或Chunk ch = new Chunk("Go to next page").SetAction(new PdfAction(PdfAction.NEXTPAGE)); 操作。第一项完成它所说的内容并转到下一页。这个很好,因为你不必担心弄清楚你在哪个页码。第二项允许您指定要转到的特定页码。最简单的形式是:

Chunk

这会创建一个ColumnText,您可以以任何方式添加它。使用现有PDF时,有几种不同的方法可以向页面添加文本。使用SetSimpleColumn对象的一种方法是使用一个名为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(); } } } 的方法,它允许您定义一个可以添加元素的简单矩形。

最后,PDF阅读器不会在PDF中自动处理链接,除非在悬停时提供不同的光标。更具体地说,与将超链接转换为不同颜色的网页不同,PDF不会更改链接的颜色,除非您告诉它们,因此在创建链接时应牢记这一点。此外,在修改PDF时,您通常不希望在此过程中覆盖现有的PDF,因为这会写入您正在阅读的内容。有时候它会起作用,更常见的是它不会中断,有时候是微妙的。而是写入第二个文件,完成后,擦除第一个文件并重命名第二个文件。

以下代码是针对iTextSharp 5.1.2.0的全功能C#2010 WinForms应用。代码的第一部分在桌面上创建了一个名为“aa.pdf”的PDF文件。如果您已经拥有该文件,则可以对此部分进行评论,但是在此处,以便其他人可以重现此示例。第二部分基于“aa.pdf”创建一个名为“bb.pdf”的新文件。它在第一页的底部添加了两个文本链接。第一个链接将PDF推进到下一页,而第二个链接将PDF推进到特定的页码。有关具体实现的详细信息,请参阅代码中的注释。

{{1}}