使用java搜索文本并获取pdf中的位置

2023-12-24

如何使用 java 搜索文本并获取 pdf 中的位置?我尝试使用 apache pdfbox 和 pdfclown 但每当文本下降或开始新段落时,它都不起作用。我想得到与下图相同的结果。

谢谢。

期望的结果 https://i.stack.imgur.com/KbXir.png


你提到我之前的回答之一 https://stackoverflow.com/a/35987635/1729265作为 PDFBox 的示例,它不适合您。事实上,正如该答案中已经解释的那样,令人惊讶的是看到代码与单个单词之外的任何内容匹配,因为那里覆盖的例程的调用者给人一种逐字调用它的印象。因此,确实很难找到任何跨越一行的东西。

但是我们可以以一种非常自然的方式改进该示例,以允许跨行边界搜索,假设行在空格处分开。替换方法findSubwords通过这个改进版本:

List<TextPositionSequence> findSubwordsImproved(PDDocument document, int page, String searchTerm) throws IOException
{
    final List<TextPosition> allTextPositions = new ArrayList<>();
    PDFTextStripper stripper = new PDFTextStripper()
    {
        @Override
        protected void writeString(String text, List<TextPosition> textPositions) throws IOException
        {
            allTextPositions.addAll(textPositions);
            super.writeString(text, textPositions);
        }

        @Override
        protected void writeLineSeparator() throws IOException {
            if (!allTextPositions.isEmpty()) {
                TextPosition last = allTextPositions.get(allTextPositions.size() - 1);
                if (!" ".equals(last.getUnicode())) {
                    Matrix textMatrix = last.getTextMatrix().clone();
                    textMatrix.setValue(2, 0, last.getEndX());
                    textMatrix.setValue(2, 1, last.getEndY());
                    TextPosition separatorSpace = new TextPosition(last.getRotation(), last.getPageWidth(), last.getPageHeight(),
                            textMatrix, last.getEndX(), last.getEndY(), last.getHeight(), 0, last.getWidthOfSpace(), " ",
                            new int[] {' '}, last.getFont(), last.getFontSize(), (int) last.getFontSizeInPt());
                    allTextPositions.add(separatorSpace);
                }
            }
            super.writeLineSeparator();
        }
    };
    
    stripper.setSortByPosition(true);
    stripper.setStartPage(page);
    stripper.setEndPage(page);
    stripper.getText(document);

    final List<TextPositionSequence> hits = new ArrayList<TextPositionSequence>();
    TextPositionSequence word = new TextPositionSequence(allTextPositions);
    String string = word.toString();

    int fromIndex = 0;
    int index;
    while ((index = string.indexOf(searchTerm, fromIndex)) > -1)
    {
        hits.add(word.subSequence(index, index + searchTerm.length()));
        fromIndex = index + 1;
    }

    return hits;
}

(搜索子词 https://github.com/mkl-public/testarea-pdfbox2/blob/master/src/test/java/mkl/testarea/pdfbox2/extract/SearchSubword.java#L129 method)

我们在这里收集所有TextPosition条目,实际上,每当 PDFBox 添加换行符时,我们甚至会添加代表空格的虚拟条目。一旦整个页面呈现出来,我们就搜索所有这些文本位置的集合。

应用于示例文档 https://github.com/mkl-public/testarea-pdfbox2/blob/master/src/test/resources/mkl/testarea/pdfbox2/extract/Variables.pdf在原来的问题中,

寻找"${var 2}"现在返回所有 8 次出现,以及那些跨行分割的:

* Looking for '${var 2}' (improved)
  Page 1 at 164.39648, 257.65997 with width 37.078552 and last letter '}' at 195.62, 257.65997
  Page 1 at 188.75699, 273.74 with width 37.108047 and last letter '}' at 220.01, 273.74
  Page 1 at 167.49583, 289.72998 with width 40.55017 and last letter '}' at 198.74, 289.72998
  Page 1 at 176.67778, 305.81 with width 38.059418 and last letter '}' at 207.89, 305.81
  Page 1 at 164.39648, 357.28998 with width -46.081444 and last letter '}' at 112.46, 372.65
  Page 1 at 174.97762, 388.72998 with width -56.662575 and last letter '}' at 112.46, 404.09
  Page 1 at 153.74, 420.16998 with width -32.004005 and last letter '}' at 112.46, 435.65
  Page 1 at 162.99922, 451.61 with width -43.692017 and last letter '}' at 112.46, 467.21

出现负宽度是因为匹配结束的 x 坐标小于开始的 x 坐标。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用java搜索文本并获取pdf中的位置 的相关文章

随机推荐

  • CSS线性渐变不准确?

    对于我的应用程序 我希望制作一个可以提供 0 度到 360 度之间任何色调的调色板 我目前正在使用此代码来制作调色板 我们以色调 120 纯绿色 为例 function drawPalette hue var ctx document qu
  • 领域驱动设计和实体框架 4.1(代码优先)

    我目前正在学习领域驱动设计开发方法 并使用 Tim McCarthy 编写的 NET 领域驱动设计与 C 一书作为指南 这本书确实很有帮助 但在使用实体框架时我变得有点困惑 特别是 4 1 中提供的代码优先方法 根据书中的示例 分层架构方法
  • 从包含合并单元格的表格中删除范围

    基本上 我想要完成的是 删除表中从光标在表中的位置到表末尾的所有行 问题是该表包含垂直合并的单元格 因此当我尝试执行以下操作时 For i Selection Tables 1 Rows Count To Selection Cells 1
  • 如何使用 Moq 库创建 SerialPort 模拟?

    我必须编写大量处理串行端口的代码 通常 电线的另一端会连接一个设备 我通常会创建自己的模拟来模拟它们的行为 我开始考虑 Moq 来帮助我进行单元测试 当您只需要一个存根时 使用它非常简单 但我想知道是否可能 如果可以 如何为硬件设备创建一个
  • 在 Mono 中保留退出代码

    我有一个使用 C 编写的简单应用程序 它通过命令行参数接受操作数 并通过退出代码报告成功或失败 当通过批处理文件在 Windows XP 上运行时 MyProg exe Snip Command line Params echo error
  • 获取chrome的控制台日志

    我想构建一个自动化测试 所以我必须知道chrome控制台中出现的错误 有一个选项可以获取控制台中出现的错误行吗 为了查看控制台 右键单击页面中的某个位置 单击 检查元素 然后转到 控制台 我不懂 C 但这是完成这项工作的 Java 代码 我
  • iTextSharp生成PDF:如何将pdf发送给客户端并添加提示?

    我使用 iTextSharp 生成了一个 pdf 当它创建时 它会自动保存在服务器上我的代码中提供的位置 而不是客户端 当然不会告诉用户任何信息 我需要将其发送给客户端 并且需要提示一个对话框来询问用户想要将其pdf保存在哪里 请问我该怎么
  • 我们是否应该在 JavaFX 自定义控件中使用 FXML?

    似乎很想问这个问题 我认为使用 FXML 来编写我们的自定义组件显然是正确的方法 但从ControlsFX JFXextras甚至 掌握JavaFX8控件 一书中我们可以看到 在自定义控件中都没有使用或提及FXML的使用 尽管如此 官方文档
  • 是否可以在泛型函数中排除引用参数?

    由于泛型类型参数T可以是任何类型 包括引用 我想知道是否可以选择退出泛型函数中的引用 即能够编写如下内容 use std ops Deref fn foo
  • Rails ActiveRecord:没有主键的旧表显示结果为零?

    我有一个 Rails 应用程序 它将位于遗留数据库之上 其中有一些我必须处理的丑陋的表 一个是一个feature attributes相关表features 问题是这个feature attributes表没有主键 我不认为这会成为问题 但
  • Ruby Koans:这个返回值中的引号在哪里?

    我正在研究以下 Ruby Koan class Dog7 attr reader name def initialize initial name name initial name end def get self self end de
  • 在 Visual Studio Express 2013 中创建解决方案文件夹

    我注意到 当您在 VS 2013 Express 中打开包含解决方案文件夹的解决方案时 它们会正确加载并且解决方案会正确构建 与 Visual Studio 2010 的 Express 版本不同 它在加载解决方案时显示错误消息 Here
  • 具有 SelectList 设计决策的 ViewModel

    我创建了一个视图模型 public VMPosition public VMPosition for model binder public VMPosition int EmployeeID PositionStatusList new
  • 如何禁用 Cloud Firestore?

    我在 Firebase 中使用实时数据库 偶然点击了 Cloud Firestore 从那时起 每当我想访问实时数据库时 它默认为 Cloud Firestore 我必须单击并选择我正在使用的数据库 非常烦人 有没有办法禁用或删除它 有没有
  • 如何更改默认布局目录?

    我的应用程序具有站点公共部分的所有控制器Utilisation模块并且它们都继承自Utilisation UtilisationController 我想为这些控制器设置默认布局 utilization layouts html erb 我
  • 为什么我必须使用 UIElement.UpdateLayout?

    我们有一个相当大的 WPF 业务应用程序 我正在对现有的 WPF 固定页面 固定文档报告进行重组 这是一个有点繁忙的生态系统 我们有一个内置的表单生成器 您可以添加许多不同的控件 就像一个迷你的内置视觉工作室 一切都很好 您在屏幕上填写表格
  • PHP字符串转多级数组

    如何转换这个 字符串 arrKeys lev1 lev2 lev3 val foo 进入以下数组 Array lev1 gt Array lev2 gt Array lev3 gt foo 数组键的数量可能会有所不同 除最后一个之外的每个数
  • Achartengine 图例位置

    有谁知道如何更改图例的位置 我正在尝试扩展图表以利用所有空间 到目前为止我已经 mRenderer setMargins new int 20 30 50 0 这会将图表扩展得更低 但图例保持在同一位置 因此它现在位于 x 轴上方 I tr
  • WinHttp:如何使用临时证书存储?

    我有一个 C 应用程序 它与我们的一台服务器建立 HTTPS 连接 在我的理想世界中 我希望发生以下情况 应用程序启动 应用程序使 Windows 信任服务器的根 CA 请不要使用 GUI 只需系统调用 应用程序与服务器对话 执行其工作等
  • 使用java搜索文本并获取pdf中的位置

    如何使用 java 搜索文本并获取 pdf 中的位置 我尝试使用 apache pdfbox 和 pdfclown 但每当文本下降或开始新段落时 它都不起作用 我想得到与下图相同的结果 谢谢 期望的结果 https i stack imgu