我有一个名为aa.pdf的现有PDF文档。此PDF文档有3页。我想使用iTextSharp在aa.pdf的第一页的页面底部添加PDF表单字段(或文本)。
同时,我也希望添加的PDF表单字段(或添加的文本)可以链接到aa.pdf的另一页面。例如,单击位于aa.pdf第一页中的PDF表单域(或文本)后,此PDF文档将跳至第二页。
如何使用iTextSharp实现上述功能?
感谢。
答案 0 :(得分:2)
要在PDF中创建链接,请使用PdfAction
,Chunk
可以在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}}