ITextPDF 不一致的矩形
ITextPDF Inconsistent Rectangles
我有代码可以从用户在 PDF 上创建的矩形中提取文本。
我正在为此使用 ITextSharp。
用户输入他们想要矩形的坐标,然后他们可以 'preview' 矩形,在他们的 pdf 上绘制一个红色矩形,或者 'generate' 一个新的 pdf,这是为了捕获该矩形内的文本,并仅使用该文本向 pdf 添加额外的页面。
我的问题是,文本是从一个完全独立于预览矩形的区域捕获的。两个矩形的创建方式相同:
//Preview rectangle code
var xfer = ConvertToPoint(Convert.ToDouble(ULTB.Text));
var yfer = ConvertToPoint(Convert.ToDouble(LLTB.Text));
var uxfer = ConvertToPoint(Convert.ToDouble(URTB.Text));
var uyfer = ConvertToPoint(Convert.ToDouble(LRTB.Text));
iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle((float)xfer, (float)yfer, (float)uxfer, (float)uyfer);
然后将此矩形绘制到用户文档上。
(ConvertToPoint只是将用户输入转换成点而不是毫米)
使用完全相同的用户输入,由以下代码创建的矩形位于不同的位置:
var xfer = ConvertToPoint(Convert.ToDouble(ULTB.Text));
var yfer = ConvertToPoint(Convert.ToDouble(LLTB.Text));
var uxfer = ConvertToPoint(Convert.ToDouble(URTB.Text));
var uyfer = ConvertToPoint(Convert.ToDouble(LRTB.Text));
RenderFilter[] filters = new RenderFilter[1];
LocationTextExtractionStrategy regionFilter = new LocationTextExtractionStrategy();
filters[0] = new RegionTextRenderFilter(new iTextSharp.text.Rectangle((float)xfer, (float)yfer, (float)uxfer, (float)uyfer));
FilteredTextRenderListener strategy = new FilteredTextRenderListener(regionFilter, filters);
String result = PdfTextExtractor.GetTextFromPage(reader, x, strategy);
上面的代码应该从用户坐标的位置获取文本,但不是,有什么想法吗?
我已将 PDF 附加到 Google 驱动器,其中大量文本已编辑
红色矩形是我通过预览代码得到的,文档底部的文本是文本捕获所拾取的内容
问题是这里的页面旋转属性不是0
iTextSharp 的“功能”是默认转换您应用于内容的更改中的坐标以与页面旋转对齐。它不同样在文本提取期间转换坐标。
幸运的是,iTextSharp 允许关闭该转换,如果您有 PdfStamper pdfStamper
,只需设置
pdfStamper.RotateContents = false;
刚初始化压模后。
当然,这意味着您必须在代码中考虑页面旋转。但这也意味着您可以始终如一地这样做。
相关问题:
我有代码可以从用户在 PDF 上创建的矩形中提取文本。
我正在为此使用 ITextSharp。
用户输入他们想要矩形的坐标,然后他们可以 'preview' 矩形,在他们的 pdf 上绘制一个红色矩形,或者 'generate' 一个新的 pdf,这是为了捕获该矩形内的文本,并仅使用该文本向 pdf 添加额外的页面。
我的问题是,文本是从一个完全独立于预览矩形的区域捕获的。两个矩形的创建方式相同:
//Preview rectangle code
var xfer = ConvertToPoint(Convert.ToDouble(ULTB.Text));
var yfer = ConvertToPoint(Convert.ToDouble(LLTB.Text));
var uxfer = ConvertToPoint(Convert.ToDouble(URTB.Text));
var uyfer = ConvertToPoint(Convert.ToDouble(LRTB.Text));
iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle((float)xfer, (float)yfer, (float)uxfer, (float)uyfer);
然后将此矩形绘制到用户文档上。
(ConvertToPoint只是将用户输入转换成点而不是毫米)
使用完全相同的用户输入,由以下代码创建的矩形位于不同的位置:
var xfer = ConvertToPoint(Convert.ToDouble(ULTB.Text));
var yfer = ConvertToPoint(Convert.ToDouble(LLTB.Text));
var uxfer = ConvertToPoint(Convert.ToDouble(URTB.Text));
var uyfer = ConvertToPoint(Convert.ToDouble(LRTB.Text));
RenderFilter[] filters = new RenderFilter[1];
LocationTextExtractionStrategy regionFilter = new LocationTextExtractionStrategy();
filters[0] = new RegionTextRenderFilter(new iTextSharp.text.Rectangle((float)xfer, (float)yfer, (float)uxfer, (float)uyfer));
FilteredTextRenderListener strategy = new FilteredTextRenderListener(regionFilter, filters);
String result = PdfTextExtractor.GetTextFromPage(reader, x, strategy);
上面的代码应该从用户坐标的位置获取文本,但不是,有什么想法吗?
我已将 PDF 附加到 Google 驱动器,其中大量文本已编辑
红色矩形是我通过预览代码得到的,文档底部的文本是文本捕获所拾取的内容
问题是这里的页面旋转属性不是0
iTextSharp 的“功能”是默认转换您应用于内容的更改中的坐标以与页面旋转对齐。它不同样在文本提取期间转换坐标。
幸运的是,iTextSharp 允许关闭该转换,如果您有 PdfStamper pdfStamper
,只需设置
pdfStamper.RotateContents = false;
刚初始化压模后。
当然,这意味着您必须在代码中考虑页面旋转。但这也意味着您可以始终如一地这样做。
相关问题: