是否有可能使用iTextSharp获取pdf文档指定区域中包含的所有文本?
谢谢。
首先,您需要以红色标记的矩形的实际坐标。在视线上,我会说x值144(2英寸)可能是正确的,但如果y值为76,我会感到惊讶,所以你必须仔细检查。
获得矩形的精确坐标后,您可以使用LocationTextExtractionStrategy
的文本提取功能,如ExtractPageContentArea示例中所做的那样。
有关此示例的iTextSharp版本,请参阅C#端口 the examples of chapter 15 。
System.util.RectangleJ rect = new System.util.RectangleJ(70, 80, 420, 500);
RenderFilter[] filter = {new RegionTextRenderFilter(rect)};
ITextExtractionStrategy strategy = new FilteredTextRenderListener(
new LocationTextExtractionStrategy(), filter);
text = PdfTextExtractor.GetTextFromPage(reader, 1, strategy);
@BrunoLowagie给出了一个很好的答案,但我真正努力的是得到实际的坐标。我开始使用Adobe Acrobat Pro
的Cursor Coordinates。
从这里我可以得到以英寸为单位的坐标,并通过将值乘以72来计算DTP点(PostScript点)。
然而事情仍然不对。看着Y值,这似乎很遥远。然后我注意到Adobe Acrobat从左上角而不是左下角计算此视图中的坐标。这意味着需要计算Y.
我在这样的代码中解决了这个问题:
var rect = new RectangleJ(GetPostScriptPoints(4.19f),
GetPostScriptPoints(GetInverseCoordinateInInches(pdfReader, 1, 1.42f)),
GetPostScriptPoints(3.5f), GetPostScriptPoints(0.39f));
RenderFilter[] filter = { new RegionTextRenderFilter(rect) };
ITextExtractionStrategy strategy = new FilteredTextRenderListener(
new LocationTextExtractionStrategy(), filter);
var output = PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategy);
private float GetPostScriptPoints(float inch)
{
return inch * 72;
}
private float GetInverseCoordinateInInches(PdfReader pdfReader, int pageIndex, float coordinateInInches)
{
Rectangle mediabox = pdfReader.GetPageSize(pageIndex);
return mediabox.Height / 72 - coordinateInInches;
}
这有效,但我觉得它看起来有点乱。然后我在Adobe Acrobat Pro中使用了工具Prepare Form
,这里Y坐标在查看文本字段属性时正确显示了upp。它也可以立即将盒子转换成点。
这意味着我可以编写这样的代码:
var rect = new RectangleJ(301.68f, 738f, 252f, 28.08f);
RenderFilter[] filter = { new RegionTextRenderFilter(rect) };
ITextExtractionStrategy strategy = new FilteredTextRenderListener(
new LocationTextExtractionStrategy(), filter);
var output = PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategy);
这更清洁,更快,所以这是我最终选择这样做的方式。
如果您想从文档中的每个页面获取特定位置的值,请参阅此答案: