在文档中增加注释或者评论,这是非常常用,PDF文档也包含这样的功能,在现有PDF文档上增加文本注释、对之前的注释进行回复。在Word、Excel还有链接的功能,跳转到本Word中其他位置(类似导航栏)、其他Word中莫个位置、甚至某个网址还有其他的功能,PDF也支持这些操作,这是只是以简单的超链接为例,可根据具体情况创建不同的PDFAction来执行不同的链接注释点击行为。不多说,直接上代码,可以对着练练手,然后工作中具体用到某个功能时再去具体仔细分析需要怎么改。
#region Chapter 4 private void textAnnotationToolStripMenuItem_Click(object sender, EventArgs e) { var fullFileName = GetSavingFileNameContainDirectory(); if (string.IsNullOrWhiteSpace(fullFileName)) return; using (var fos = new FileStream(fullFileName, FileMode.Create)) { //Initialize PDF document PdfDocument pdf = new PdfDocument(new PdfWriter(fos)); // Initialize document Document document = new Document(pdf); PdfFont yaHeiFont = PdfFontFactory.CreateRegisteredFont("yaHei_font", PdfEncodings.IDENTITY_H, EmbeddingStrategy.FORCE_EMBEDDED); Paragraph p = new Paragraph().SetFont(yaHeiFont).SetFontSize(12).Add("这是一段含有注解的文本。"); document.Add(p); var pdfPage = pdf.GetFirstPage(); //Create text annotation PdfAnnotation ann = new PdfTextAnnotation(new Rectangle(20, 800, 0, 0)) .SetOpen(true) .SetColor(new DeviceRgb(System.Drawing.Color.Green.R, System.Drawing.Color.Green.G, System.Drawing.Color.Green.B)) .SetTitle(new PdfString("iText")) .SetContents("With iText, you can truly take your documentation needs to the next level."); //ann.SetFlag(iText.Kernel.Pdf.Annot.PdfAnnotation.INVISIBLE); pdfPage.AddAnnotation(ann); document.Close(); } } private void replyAnnotaionToolStripMenuItem_Click(object sender, EventArgs e) { var src = GetOpeningFileNameContainDirectory("PDF(*.pdf)|*.pdf"); var dest = GetSavingFileNameContainDirectory(); if (string.IsNullOrWhiteSpace(src) || string.IsNullOrWhiteSpace(dest)) return; PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest)); PdfPage firstPage = pdfDoc.GetFirstPage(); IList<PdfAnnotation> annots = firstPage.GetAnnotations(); Rectangle stickyRectangle = annots[0].GetRectangle().ToRectangle(); PdfAnnotation replySticky = new PdfTextAnnotation(stickyRectangle) // This method specifies whether the annotation will initially be displayed open. .SetOpen(true) .SetIconName(new PdfName("Comment")) // This method sets an annotation to which the current annotation is "in reply". // Both annotations shall be on the same page of the document. .SetInReplyTo(annots[0]) // This method sets the text label that will be displayed in the title bar of the annotation's pop-up window // when open and active. This entry shall identify the user who added the annotation. .SetText(new PdfString("Reply")) // This method sets the text that will be displayed for the annotation or the alternate description, // if this type of annotation does not display text. .SetContents("Hello PDF") .SetColor(new DeviceRgb(System.Drawing.Color.Green.R, System.Drawing.Color.Green.G, System.Drawing.Color.Green.B)); firstPage.AddAnnotation(replySticky); pdfDoc.Close(); } private void linkAnnotationToolStripMenuItem_Click(object sender, EventArgs e) { var dest = GetSavingFileNameContainDirectory(); if (string.IsNullOrWhiteSpace(dest)) return; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest)); Document document = new Document(pdfDoc); // Create link annotation PdfLinkAnnotation annotation = (new PdfLinkAnnotation(new Rectangle(0, 0)).SetAction(PdfAction.CreateURI("https://itextpdf.com/"))); Link link = new Link("here", annotation); Paragraph p = new Paragraph("The example of link annotation. Click ").Add(link.SetUnderline()).Add(" to learn more..."); document.Add(p); document.Close(); } #endregion
private string GetSavingFileNameContainDirectory(string filter = "PDF(*.pdf)|*.pdf") { saveFileDialog1.Filter = filter; saveFileDialog1.AddExtension = true; saveFileDialog1.ShowDialog(); return saveFileDialog1.FileName; } private string GetOpeningFileNameContainDirectory(string fileter = "CSV(*.CSV)|*.csv|txt files(*.txt)|*.txt") { openFileDialog1.Filter = fileter; openFileDialog1.ShowDialog(); return openFileDialog1.FileName; }
该文章主要用于记录备忘,如果读后对您有帮助,还望不吝点赞,如果实践过程中有任何疑问欢迎留言讨论。