使用 C# 使用 iTextsharp 突出显示现有 PDF 的文本(颜色)

问题描述 投票:0回答:2

我想知道我们是否可以使用

PDF
突出显示已创建的
itextsharp
的文本(颜色)?

我看到了创建新 PDF 等示例,同时我们可以应用颜色。我正在寻找可以从 PDF 中获取文本块并应用颜色并保存的位置。

这是我想要完成的事情,读取 PDF 文件,解析文本并根据业务规则突出显示文本。

任何第三方 dll 建议也都有效,作为第一步,我正在寻找

opensource iTextsharp library

c# asp.net .net itext
2个回答
7
投票

是的,您可以突出显示文本,但不幸的是,您将不得不为此付出努力。就规范而言,看起来像是一个亮点的是 PDF 文本标记注释。这部分很简单。困难的部分是找出要应用注释的坐标。

这是使用名为

PdfStamper
的现有
stamper
创建突出显示的简单代码:

PdfAnnotation highlight = PdfAnnotation.CreateMarkup(stamper.Writer, rect, null, PdfAnnotation.MARKUP_HIGHLIGHT, quad);

一旦获得突出显示,您可以使用以下方法设置颜色:

highlight.Color = BaseColor.YELLOW;

然后使用以下方法将其添加到第 1 页上的

stamper

stamper.AddAnnotation(highlight,1);

从技术上讲,

rect
参数实际上并没有被使用(据我所知),而是被
quad
参数覆盖。
quad
参数是一个 x,y 坐标数组,本质上代表矩形(技术上是四边形)的角。规范说它们从左下角开始逆时针旋转,但实际上它们似乎是从左下角到右下角到左上角到右上角。计算四边形很痛苦,因此创建一个矩形并从中创建四边形更容易:

iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(60.6755f, 749.172f, 94.0195f, 735.3f);
float[] quad = { rect.Left, rect.Bottom, rect.Right, rect.Bottom, rect.Left, rect.Top, rect.Right, rect.Top };

那么首先如何获得现有文本的矩形呢?为此,您需要查看

TextExtractionStrategy
PdfTextExtractor
。有很多内容需要讨论,所以我将首先向您指出这篇文章,其中链接了一些其他帖子。

下面是一个针对 iTextSharp 5.1.1.2 的完整工作 C# 2010 WinForms 应用程序,它展示了简单 PDF 的创建以及使用硬编码坐标突出显示部分文本的过程。如果您需要帮助计算这些坐标,请从上面的链接开始,然后提出任何问题!

using System;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.IO;
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)
        {
            //Create a simple test file
            string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");

            using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (Document doc = new Document(PageSize.LETTER))
                {
                    using (PdfWriter w = PdfWriter.GetInstance(doc, fs))
                    {
                        doc.Open();
                        doc.Add(new Paragraph("This is a test"));
                        doc.Close();
                    }
                }
            }

            //Create a new file from our test file with highlighting
            string highLightFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Highlighted.pdf");

            //Bind a reader and stamper to our test PDF
            PdfReader reader = new PdfReader(outputFile);

            using (FileStream fs = new FileStream(highLightFile, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (PdfStamper stamper = new PdfStamper(reader, fs))
                {
                    //Create a rectangle for the highlight. NOTE: Technically this isn't used but it helps with the quadpoint calculation
                    iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(60.6755f, 749.172f, 94.0195f, 735.3f);
                    //Create an array of quad points based on that rectangle. NOTE: The order below doesn't appear to match the actual spec but is what Acrobat produces
                    float[] quad = { rect.Left, rect.Bottom, rect.Right, rect.Bottom, rect.Left, rect.Top, rect.Right, rect.Top };

                    //Create our hightlight
                    PdfAnnotation highlight = PdfAnnotation.CreateMarkup(stamper.Writer, rect, null, PdfAnnotation.MARKUP_HIGHLIGHT, quad);

                    //Set the color
                    highlight.Color = BaseColor.YELLOW;

                    //Add the annotation
                    stamper.AddAnnotation(highlight,1);
                }
            }

            this.Close();
        }
    }
}

0
投票
class Program
{
    public static void Main()
    {
        string inputFile = @" ";
        string highLightFile = @" ";
        var coordinates = new Coordinates();
        iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(inputFile);

        using (FileStream fs = new FileStream(highLightFile, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            using (PdfStamper stamper = new PdfStamper(reader, fs))
            {
                Spire.Pdf.PdfDocument doc = new Spire.Pdf.PdfDocument();

                doc.LoadFromFile(inputFile);
                int i = 1;
                foreach (PdfPageBase page in doc.Pages)
                {
                    PdfTextFinder finder = new PdfTextFinder(page);

                    PdfTextFindOptions options = new PdfTextFindOptions();

                    options.Parameter = TextFindParameter.IgnoreCase;
                   
                    finder.Options = options;

                    var fragments = finder.Find("INDIA");
                    fragments.AddRange(finder.Find("Bharat"));
                    fragments.AddRange(finder.Find("My Name is Gaurav"));
                    
                     
                    foreach (PdfTextFragment fragment in fragments)
                    {
                        PointF found = fragment.Positions[0];

                        coordinates.X = found.X;
                        coordinates.Y = found.Y;
                        coordinates.PH = fragment.Page.ActualSize.Height;
                        coordinates.PW = fragment.Page.ActualSize.Width;
                        coordinates.H = fragment.Sizes.FirstOrDefault().Height;
                        coordinates.W = fragment.Sizes.FirstOrDefault().Width;

                        iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(coordinates.X,
                                                                               coordinates.PH - coordinates.Y,
                                                                               coordinates.X + coordinates.W,
                                                                               coordinates.PH - coordinates.Y - coordinates.H);

                        float[] quad = { rect.Left, rect.Bottom, rect.Right, rect.Bottom, rect.Left, rect.Top, rect.Right, rect.Top };

                        PdfAnnotation highlight = PdfAnnotation.CreateMarkup(stamper.Writer, rect, null, PdfAnnotation.MARKUP_HIGHLIGHT, quad);

                        highlight.Color = iTextSharp.text.BaseColor.YELLOW;
                        
                        stamper.AddAnnotation(highlight, i);                           
                    }         
                    i++;
                }
            }
        }
    }
}

}

© www.soinside.com 2019 - 2024. All rights reserved.