基于坐标c#突出显示pdf中的元素
Highlight element in pdf based on coordinates c#
我有 5 页 pdf 需要根据坐标突出显示特定元素
有X top left,Y top left,X top right ,Y top right , X bottom right , Y bottom right ,X bottom left, Y bottom left
。
我使用 iTextsharp 尝试了以下代码,请建议我们如何做到这一点,包括第
页
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;
//Create a simple test file
string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
//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);
}
}
输出
以矩形突出显示元素。
需要突出显示 PDF 的第 3 页。
"boundingBox": [3.2924,7.7146,5.7564,7.7038,5.7671,7.9836,3.3032,7.9943]
这个 "text": "66 66 6666 6666" 应该突出显示
错误的页面
首先,您将注释添加到错误的页面。
你说
Need to highlight 3rd page of PDF.
但你把它放在第 1 页:
stamper.AddAnnotation(highlight,1);
要解决此问题,请更改页码:
stamper.AddAnnotation(highlight,3);
坐标错误
您代码中的坐标都没有
iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(60.6755f, 749.172f, 94.0195f, 735.3f);
也不是你以那种JSON的方式给予的那些
"boundingBox": [3.2924,7.7146,5.7564,7.7038,5.7671,7.9836,3.3032,7.9943]
在您要突出显示的位置附近的任何位置,至少不在页面媒体框给出的常规 PDF 坐标系中。通过在 Adobe Acrobat 中测量,我得到了以下近似坐标:
iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(240f, 264f, 413f, 289f);
如果您显示的任何坐标是要突出显示的图像部分的实际坐标,请向这些坐标的提供者询问所使用的坐标系,并相应地转换为给定页面媒体框中的坐标。
QuadPoints 中的顺序有问题
您使用此顺序创建 quad
:
float[] quad = { rect.Left, rect.Bottom, rect.Right, rect.Bottom, rect.Left, rect.Top, rect.Right, rect.Top };
这导致凹形帽。你可能想使用
float[] quad = { rect.Left, rect.Top, rect.Right, rect.Top, rect.Left, rect.Bottom, rect.Right, rect.Bottom };
而不是 Adobe Reader 显示为凸帽。背景阅读 this answer.
示例输出
你说:
"66 66 6666 6666" should get higlighted
将上述三个更改应用到您的代码后,我得到了这个:
我有 5 页 pdf 需要根据坐标突出显示特定元素
有X top left,Y top left,X top right ,Y top right , X bottom right , Y bottom right ,X bottom left, Y bottom left
。
我使用 iTextsharp 尝试了以下代码,请建议我们如何做到这一点,包括第
页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;
//Create a simple test file
string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
//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);
}
}
输出 以矩形突出显示元素。 需要突出显示 PDF 的第 3 页。
"boundingBox": [3.2924,7.7146,5.7564,7.7038,5.7671,7.9836,3.3032,7.9943]
这个 "text": "66 66 6666 6666" 应该突出显示
错误的页面
首先,您将注释添加到错误的页面。
你说
Need to highlight 3rd page of PDF.
但你把它放在第 1 页:
stamper.AddAnnotation(highlight,1);
要解决此问题,请更改页码:
stamper.AddAnnotation(highlight,3);
坐标错误
您代码中的坐标都没有
iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(60.6755f, 749.172f, 94.0195f, 735.3f);
也不是你以那种JSON的方式给予的那些
"boundingBox": [3.2924,7.7146,5.7564,7.7038,5.7671,7.9836,3.3032,7.9943]
在您要突出显示的位置附近的任何位置,至少不在页面媒体框给出的常规 PDF 坐标系中。通过在 Adobe Acrobat 中测量,我得到了以下近似坐标:
iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(240f, 264f, 413f, 289f);
如果您显示的任何坐标是要突出显示的图像部分的实际坐标,请向这些坐标的提供者询问所使用的坐标系,并相应地转换为给定页面媒体框中的坐标。
QuadPoints 中的顺序有问题
您使用此顺序创建 quad
:
float[] quad = { rect.Left, rect.Bottom, rect.Right, rect.Bottom, rect.Left, rect.Top, rect.Right, rect.Top };
这导致凹形帽。你可能想使用
float[] quad = { rect.Left, rect.Top, rect.Right, rect.Top, rect.Left, rect.Bottom, rect.Right, rect.Bottom };
而不是 Adobe Reader 显示为凸帽。背景阅读 this answer.
示例输出
你说:
"66 66 6666 6666" should get higlighted
将上述三个更改应用到您的代码后,我得到了这个: