我想知道我们是否可以使用
PDF
突出显示已创建的 itextsharp
的文本(颜色)?
我看到了创建新 PDF 等示例,同时我们可以应用颜色。我正在寻找可以从 PDF 中获取文本块并应用颜色并保存的位置。
这是我想要完成的事情,读取 PDF 文件,解析文本并根据业务规则突出显示文本。
任何第三方 dll 建议也都有效,作为第一步,我正在寻找
opensource iTextsharp library
。
是的,您可以突出显示文本,但不幸的是,您将不得不为此付出努力。就规范而言,看起来像是一个亮点的是 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();
}
}
}
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++;
}
}
}
}
}
}