使用iTextSharp获取指定区域中包含的文本

问题描述 投票:4回答:1

是否有可能使用iTextSharp获取pdf文档指定区域中包含的所有文本?

谢谢。

c# itextsharp
1个回答
9
投票

首先,您需要以红色标记的矩形的实际坐标。在视线上,我会说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);

0
投票

@BrunoLowagie给出了一个很好的答案,但我真正努力的是得到实际的坐标。我开始使用Adobe Acrobat Pro的Cursor Coordinates。

enter image description here

从这里我可以得到以英寸为单位的坐标,并通过将值乘以72来计算DTP点(PostScript点)。

enter image description here

enter image description here

然而事情仍然不对。看着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; 
}

enter image description here

这有效,但我觉得它看起来有点乱。然后我在Adobe Acrobat Pro中使用了工具Prepare Form,这里Y坐标在查看文本字段属性时正确显示了upp。它也可以立即将盒子转换成点。

enter image description here

enter image description here

这意味着我可以编写这样的代码:

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);

enter image description here

这更清洁,更快,所以这是我最终选择这样做的方式。

如果您想从文档中的每个页面获取特定位置的值,请​​参阅此答案:

https://stackoverflow.com/a/20959388/3850405

© www.soinside.com 2019 - 2024. All rights reserved.