我想突出显示PDF中的重叠文字。使用“PDFExchangeviewer.exe”获得所有单词坐标,然后转换为dot.net矩形。在dotnet矩形中找到矩形的交点并使用itextsharp突出显示相交的单词。但它突出显示PDF中不需要的单词而不是重叠文本。请将解决方案发布到此处。下面显示的是我在c#
中的代码部分foreach (var pdfrect in WordpageCoordinates)
{
float X = (float)pdfrect.Item1;
float Y = reader.GetPageSize(pdfPg).Top - (float)pdfrect.Item4;
float Width = (float)pdfrect.Item3 - X;
float Height = (float)(pdfrect.Item4) - (float)(pdfrect.Item2);
DotNetRect.Add(new System.Drawing.RectangleF(X, Y, Width, Height));
}
for(int j = 0; j < DotNetRect.Count; j++)
{
System.Drawing.RectangleF MasterRect = DotNetRect[j];
System.Drawing.RectangleF ChildRect = new System.Drawing.RectangleF();
if (j == DotNetRect.Count - 1)
{
break;
}
for (int k = j + 1; k < DotNetRect.Count; k++)
{
ChildRect = DotNetRect[k];
System.Drawing.RectangleF NewRect = new System.Drawing.RectangleF(ChildRect.X, ChildRect.Y , ChildRect.Width, ChildRect.Height);
if (MasterRect.IntersectsWith(NewRect))
{
{
iTextSharp.text.Rectangle Annotrect = new iTextSharp.text.Rectangle((float)WordpageCoordinates[k].Item1, (float)WordpageCoordinates[k].Item2, (float)WordpageCoordinates[k].Item3, (float)WordpageCoordinates[k].Item4);
//iTextSharp.text.Rectangle Annotrect = new iTextSharp.text.Rectangle((float)ClsGlobal.TextCoordinatesList[k].Item1, (float)ClsGlobal.TextCoordinatesList[k].Item2, (float)ClsGlobal.TextCoordinatesList[k].Item3, (float)ClsGlobal.TextCoordinatesList[k].Item4);
//float[] quad = { Annotrect.Left, Annotrect.Bottom, Annotrect.Right, Annotrect.Bottom, Annotrect.Left, Annotrect.Top, Annotrect.Right, Annotrect.Top };
float[] quad = { Annotrect.Left, Annotrect.Top, Annotrect.Right, Annotrect.Top, Annotrect.Left, Annotrect.Bottom, Annotrect.Right, Annotrect.Bottom };
PdfAnnotation HighlightAnnotation = PdfAnnotation.CreateMarkup(pdfstamper.Writer, Annotrect, "Text Overlap", PdfAnnotation.MARKUP_HIGHLIGHT, quad);
HighlightAnnotation.Title = "Overlap Text Highlighter\n" + System.DateTime.Now.ToString();
HighlightAnnotation.Color = iTextSharp.text.BaseColor.GREEN;
pdfstamper.AddAnnotation(HighlightAnnotation, pdfPg);
}
}
}
}
答案 0 :(得分:2)
您正在测试2个矩形是否相交,但您没有使用交叉点。拿取注释的交集。交叉点是重叠的部分。
RectangleF intersection = RectangleF.Intersect(MasterRect, NewRect);
使用此静态方法GNU make guide:
public static RectangleF Intersect(
RectangleF a,
RectangleF b
)
无需创建ChildRect
的副本。 IntersectsWith
仅测试交叉点但不创建交叉点并且不更改矩形。由于RectangleF
是一个结构,因此是一个值类型,因此无论如何都会将它的副本传递给该方法。如果它是一个类,即一个引用类型,该方法理论上可以改变它的字段和属性。
Intersect
会返回一个空矩形。因此,您也可以先创建交集,然后测试它是否为空,而不是使用IntersectsWith
。
RectangleF intersection = RectangleF.Intersect(MasterRect, ChildRect);
if (!intersection.IsEmpty)
{
// create the annotation with `intersection`
}
而不是写
if (j == DotNetRect.Count - 1)
{
break;
}
将循环条件更改为(添加- 1
):
for(int j = 0; j < DotNetRect.Count - 1; j++)