【问题标题】:Extract PDF text by coordinates按坐标提取 PDF 文本
【发布时间】:2011-11-16 08:14:30
【问题描述】:

我想知道 Microsoft .NET 中是否有一些 PDF 库能够通过提供坐标来提取文本。

例如(伪代码):

PdfReader reader = new PdfReader();
reader.Load("file.pdf");

// Top, bottom, left, right in pixels or any other unit
string wholeText = reader.GetText(100, 150, 20, 50);

我尝试过使用 PDFBox for .NET(在 IKVM 上运行的那个)这样做,但没有成功,它似乎已经过时且没有文档。

也许任何人都有使用 PDFBox、iTextSharp 或任何其他开源库的良好示例,他/她可以给我一个提示。

提前谢谢你。

【问题讨论】:

  • 你不认为缩放视图会改变指定坐标处的文本吗?根据他们在表示中的位置提取数据,尤其是当它可能发生变化时,在我看来,这就像一个 lib 开发人员不会费心在他们的应用程序中实现的功能。
  • 不知道有什么开源库可以做到这一点...如果可以选择商业库,我可以提供一两个链接...
  • @Maxim 你说得对,但我的项目将有一个固定大小的 PDF 查看器,所以我相信这不是你所说的情况。例如,在 Adob​​e Reader 中,当您选择图像之类的内容并放大和缩小时,所选内容也会调整大小。也许这可以通过一些库以某种方式实现。事实上,Apache PDFBox 有类似选择区域提供矩形的功能,这意味着我没有你想象的那么疯狂:D
  • @Yahia,这将取决于定价,但在 cmets 中给我这些提示,我会看看。

标签: c# pdf .net-4.0


【解决方案1】:

嗯,谢谢大家的努力。

我在 IKVM 编译之上使用 Apache 的 PDFBox 得到它,这是最终代码:

PDDocument doc = PDDocument.load(@"c:\invoice.pdf");

PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.addRegion("testRegion", new java.awt.Rectangle(0, 10, 100, 100));
stripper.extractRegions((PDPage)doc.getDocumentCatalog().getAllPages().get(0));

string text = stripper.getTextForRegion("testRegion");

它就像一个魅力。

无论如何,谢谢你,我希望我自己的回答能帮助别人。如果您需要更多详细信息,请在此处发表评论,我会更新此答案。

【讨论】:

  • 我想要 pdfsharp 中的相同内容或 c# 中的内容。请帮助我。
  • 要使用上述答案中的代码,您必须设置 IKVM。这很简单,尽管我花了一些时间进行调查。您需要引用以下库:IKVM.OpenJDK.Core.dll、IKVM.OpenJDK.SwingAWT.dll、pdfbox-1.8.2.dll(通过 ikvmc -target:library pdfbox-1.8.2.jar 命令获取)、IKVM .OpenJDK.Util.dll、IKVM.Runtime.dll
  • 它在 Java 中对我来说也是一种魅力。只有我必须点击并跟踪我想要拉出的文本的坐标。任何想法我如何从pdf中获取这些。尝试了一些 SO 选项,但效果不佳。(stackoverflow.com/questions/8971243/…)
【解决方案2】:

它不是开源的,但希望这可以帮助您(可能还有其他使用 ABCPDF 的人!)

我今天早些时候通过遍历 PDF 中的可用字段来做到这一点。这意味着您使用的 PDF 需要正确创建,并且您需要知道要为其获取文本的字段名称(您可以通过添加断点并循环访问可用字段来解决此问题)。

WebSupergoo.ABCpdf6.Doc newPDF = new WebSupergoo.ABCpdf6.Doc();
newPDF.Read("existing_file.pdf");

foreach ( WebSupergoo.ABCpdf6.Objects.Field field in newPDF.Form.Fields )
{
    if ( field.Name == "Text1" )
    {
        // update "Text1"
        field.Value = "new value for Text1";
    }
}

newPDF.Save("new_file.pdf");

newPDF.Clear();

在示例中,“Text1”是正在更新的字段的名称。请注意,我还提供了一个保存更新字段的示例。

希望这至少能让您了解如何解决这个问题。

【讨论】:

  • 嗯,这不是我的问题迭代字段的目标。我需要给出坐标并得到“矩形是什么”。对不起。不过还是谢谢你。
  • 字段对象公开了一个属性“Rect”。如果您知道他们单击的位置,则可以通过查看 Rect 的顶部/底部/右侧/左侧来返回与坐标匹配的字段。使用不同的库可能有更好的方法,但如果您遇到困难,这可能会起作用。
  • 嗯,很高兴知道和另一个资源。我一直在寻找一些库以更随意的方式进行此类选择,但没关系。
【解决方案3】:

这应该可行:

RenderFilter[] filters = new RenderFilter[1];
LocationTextExtractionStrategy regionFilter = new LocationTextExtractionStrategy();
filters[0] = new RegionTextRenderFilter(new Rectangle(llx,lly,urx,ury));
FilteredTextRenderListener strategy = new FilteredTextRenderListener(regionFilter, filters);

String result = PdfTextExtractor.GetTextFromPage(pdfReader, i, strategy);
Console.WriteLine(result);

【讨论】:

    【解决方案4】:

    iText 的RegionTextRenderFilter 正是您要找的。​​p>

    所以你想要这样的东西(原谅我的 Java,但翻译起来应该很简单):

    PdfReader reader = new PdfReader(path);
    
    FilteredTextExtractionStrategy regionFilter = 
      new FilteredTextExtractionStrategy( new SimpleTextExtrationStrategy, 
                                          new RegionTextRenderFilter( someRect ) );
    String regionText = PdfTextExtractor.getTextFromPage(reader, 0, regionFilter );
    

    【讨论】:

    • 好吧,很高兴知道有另一个选项可以解决同样的问题,所以如果使用 PDFBox for .NET 有一些问题,我会看看。无论如何,为您的贡献 +1。
    • 嘿,我正在尝试你的解决方案,但 iTextSharp(.NET 版本)似乎没有这样的策略......
    • 和 Marias 一样的问题——如何在 .NET 中完成?
    【解决方案5】:

    此代码将在 itext 7 中工作

    PdfReader reader = new PdfReader("D:/Sample2.pdf");
    PdfDocument pdfDoc = new PdfDocument(reader);
    Rectangle rect = new Rectangle(208, 508, 235, 519);
    TextRegionEventFilter regionFilter = new 
    TextRegionEventFilter(rect.SetBbox(208, 508, 235, 519));
    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
    FilteredEventListener listener = new FilteredEventListener();
    LocationTextExtractionStrategy extractionStrategy = listener.AttachEventListener(new LocationTextExtractionStrategy(), regionFilter);
    new PdfCanvasProcessor(listener).ProcessPageContent(pdfDoc.GetPage(1));
    String text = extractionStrategy.GetResultantText();
    

    【讨论】:

      【解决方案6】:

      你可能想看看this sample。它使用 itextsharp

      var pdfFilename = @"PathToYourPDF\random.pdf";
      var textToFind = "Lombok";
      var pageNumber = 1;
      var point = PdfTools.GetTextCoordinate(textToFind, pdfFilename , pageNumber);
      Console.WriteLine($"{point.X},{point.Y}");
      

      【讨论】:

        猜你喜欢
        • 2011-09-05
        • 1970-01-01
        • 2014-05-18
        • 2023-03-11
        • 2015-10-23
        • 2021-01-07
        • 2022-10-15
        • 2011-06-02
        • 1970-01-01
        相关资源
        最近更新 更多