【问题标题】:PDFBox 2.0 : First letter of some words are not visible when extracting textPDFBox 2.0:提取文本时某些单词的首字母不可见
【发布时间】:2018-02-10 18:20:50
【问题描述】:

使用 PDFBox 2.0.8 和解决方案,提供here 我正在尝试仅提取页面上可见的文本。 PdfTextStripper 的基本功能返回所有可用的文本,尽管它在页面上实际上不可见,这是一个非常大的问题,所以要摆脱它,我们需要从 PageDrawer 复制粘贴大量代码并考虑这些剪辑路径来决定我们是否应该绘制特定的性格。 但是,在某些文件(如here)中,某些单词中的第一个字母总是开箱即用(在链接文件中,请参阅“租户”-“T”缺失、“月租”-“R”缺失、“宠物租金”- "R") 进行此检查时:

@Override
protected void processTextPosition(TextPosition text) {
    Matrix textMatrix = text.getTextMatrix();
    Vector start = textMatrix.transform(new Vector(0, 0));
    PDGraphicsState gs = getGraphicsState();
    Area area = gs.getCurrentClippingPath();
    if (area == null || area.contains(lowerLeftX + start.getX(), lowerLeftY + start.getY()))
        super.processTextPosition(text);
}

这始终只是丢失标记的第一个字符,我认为哪个可能很重要,大写字母。 所以似乎有一些更奇怪的转变。有没有人看到这个问题?这些转换是在原始类中进行的? 提前非常感谢!

【问题讨论】:

  • The solution 你指的又是指another solution 它又是基于。在那里你可以读到可见性的标准实际上被简化为如果一个字符的基线开始是可见的,那么可以假设一个字符是可见的。显然,这个标准有时会出错,您的 PDF 可能就是这种情况。我下周去看看。
  • 我快速查看了 PDF。实际上,例如,“租户”中“T”的基线起点的 x 坐标为 154.6799,而那里的剪辑路径会剪辑 x 坐标值以下的所有内容154.68。所以字符基线的开始只是被切断了,但实际上所有的字符都是可见的。因此,对于您的文件,您需要不同的可见性标准。如上所述,下周……

标签: java pdf pdfbox


【解决方案1】:

这里一种可能的解决方案是检查字符的中间(不是开始)是否不是开箱即用的,例如:

@Override
protected void processTextPosition(TextPosition text) {
    Matrix textMatrix = text.getTextMatrix();
    Vector start = textMatrix.transform(new Vector(0, 0));
    Vector middle = new Vector(start.getX() + text.getWidth()/2, start.getY());
    PDGraphicsState gs = getGraphicsState();
    Area area = gs.getCurrentClippingPath();
    if (area == null || area.contains(lowerLeftX + middle.getX(), lowerLeftY + middle.getY()))
        super.processTextPosition(text);
}

【讨论】:

  • 这基本上也是我的想法。但是,您的实现很可能无法在旋转页面上按预期工作。考虑到所有这些,我还没有时间尝试实施测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
相关资源
最近更新 更多