寻找软件或API,将给我一个pdf格式的文本坐标

寻找软件或API,将给我一个pdf格式的文本坐标,pdf,itext,Pdf,Itext,我希望是一个简单的问题——我有一个pdf,想检测特定单词或占位符文本的坐标。然后,我打算使用itextsharp在找到的坐标的顶部标记一个替换的文本位 有人能推荐什么吗 谢谢正如评论中所回答的,可以使用iText来执行这样的任务。也许有更好的解决办法,但我对此表示怀疑。出现上述问题的原因,即“[itextsharp]有时给出搜索文本所在句子开头的单词”,是因为有时字形太近,以至于它们的方框重叠,因此我不知道如何按照您的意愿处理 因此,您可以执行以下操作: 扩展LocationTextExtra

我希望是一个简单的问题——我有一个pdf,想检测特定单词或占位符文本的坐标。然后,我打算使用itextsharp在找到的坐标的顶部标记一个替换的文本位

有人能推荐什么吗


谢谢

正如评论中所回答的,可以使用iText来执行这样的任务。也许有更好的解决办法,但我对此表示怀疑。出现上述问题的原因,即“[itextsharp]有时给出搜索文本所在句子开头的单词”,是因为有时字形太近,以至于它们的方框重叠,因此我不知道如何按照您的意愿处理

因此,您可以执行以下操作:

  • 扩展
    LocationTextExtractionStrategy
    类并覆盖
    EventOccursed
    ,例如,如下所示:

     @Override
     public void eventOccurred(IEventData data, EventType type) {
     if (type.equals(EventType.RENDER_TEXT)) {
         TextRenderInfo renderInfo = (TextRenderInfo) data;
         // Obtain all the necesary information from renderInfo, for example
         LineSegment segment = renderInfo.getBaseline();
         // ...
     }
    
    PdfTextExtractor.getTextFromPage(pdfDocument.getPage(1), new ExtendedLocationTextExtractionStrategy()
    
  • 将此类扩展类的实例传递给
    PdfTextExtractor.getTextFromPage
    ,如下所示:

     @Override
     public void eventOccurred(IEventData data, EventType type) {
     if (type.equals(EventType.RENDER_TEXT)) {
         TextRenderInfo renderInfo = (TextRenderInfo) data;
         // Obtain all the necesary information from renderInfo, for example
         LineSegment segment = renderInfo.getBaseline();
         // ...
     }
    
    PdfTextExtractor.getTextFromPage(pdfDocument.getPage(1), new ExtendedLocationTextExtractionStrategy()
    
  • 一旦找到文本,将触发事件

当然,在这样的解决方案中存在一些困难,因为您想要查找和写入的文本在PDF中可能不是“文本”,而是“T”、“ex”、“T”,甚至是“T”、“x”、“e”、“T”“。但是,由于您使用iText,您可能希望利用其产品之一--
pdfSweep
的优势。本产品旨在从PDF中完全删除不必要的内容,将此类内容作为某些位置(您希望获取,因此这不是一个选项)或正则表达式传递

这就是如何创建这样一个regex策略(要在文档中找到所有“Dolor”和“Dolor”实例,请将它们完全删除(从所有流中删除,以便在PDF查看器中无法观察到它们,也无法在底层PDF对象中找到它们):

以下是如何使用它:

PdfAutoSweep autoSweep = new PdfAutoSweep(strategy);
autoSweep.cleanUp(pdf); // a PdfDocument instance
这就是如何在出现不必要文本的位置上书写一些文本:

for (IPdfTextLocation location : strategy.getResultantLocations()) {
        Rectangle rect = location.getRectangle();
        // do something, for exapmle, write some text
}

你知道PDF是文本搜索的吗?谢谢@Kevin-虽然你链接到了关于旧版iText 5的答案。你可以对当前的iText 7做同样的事情。代码可能略有不同,但我手头没有一个例子。嗨,是的,我知道你可以做文本搜索,但我看到的大多数解决方案都不够“准确”,有时甚至是g由于文本在PDF中以块的形式存储,我认为我过去没有看过这篇特定的文章,所以我会回顾一下,但我最近在itextsharp上花了很多时间尝试了一种不同的方法,并认为如果出现这种情况,也许是时候买一个商业解决方案了但我看到的大多数解决方案都不够“准确”,有时会给出搜索文本所在句子的开头,这是因为文本在PDF中以块形式存储的方式-如果这对您很重要,为什么不在您的问题中提及这一点。例如,乍一看,iText只提供块,但如果您再次查看API,您将找到返回每个glyph坐标的方法。这看起来是一个非常完整的答案-谢谢。我现在就试试。