首页 文章

PDF查明文本是否带下划线或表格单元格

提问于
浏览
42

我一直在玩PdfBox和PDFTextStripperByArea方法 .

如果文本是 bold 或斜体,我能够提取信息,但我无法获得下划线信息 .

据我所知,在PDF中,下划线是通过绘制线条完成的 . 所以从理论上讲,我应该能够在文本的某处获得某些关于线条的信息 . 根据这些信息,我可以找出是否有下划线或表格 .

到目前为止,这是我的代码:

List<TextPosition> textPos = charactersByArticle.get(index);

for (TextPosition t : textPos)
{               
    if (t.getFont().getFontDescriptor() != null)
    {                           
        if (t.getFont().getFontDescriptor().getFontWeight() > BOLD_WEIGHT ||
            t.getFont().getFontDescriptor().isForceBold())
        {
            isBold = true;
        }

        if (t.getFont().getFontDescriptor().isItalic())
        {
            isItalic = true;
        }
    }
}

我试图玩PDGraphicsState对象,该对象在PDFStreamEngine类的processEncodedText方法中处理,但没有在那里找到行的信息 .

有关可以从中检索此信息的任何建议吗?

5 回答

  • 2

    这是我到目前为止发现的:

    PDFBox使用资源文件将PDF操作符/指令绑定到某些类,然后这些类处理信息 .

    如果我们看一下下面的 PDFTextStripper.properties 资源文件:

    pdfbox \ src \ main \ resources \ org \ apache \ pdfbox \ resources \

    我们可以看到,例如BT运算符绑定到 org.apache.pdfbox.util.operator.BeginText 类,依此类推 .

    PDFTextStripper

    pdfbox \ src \ main \ java \ org \ apache \ pdfbox \ util \

    将此考虑在内并利用此类的PDF处理 .

    BUT all graphical objects are ignored, therefore no information of underline or table structure!

    现在,如果我们看一下PageDrawer.properties资源文件,我们可以看到这个几乎所有可用的运算符 . 哪个是 PageDrawer 类所使用的

    pdfbox \ src \ main \ java \ org \ apache \ pdfbox \ pdfviewer \

    "trick"现在要找出哪些图形运算符代表下划线和表格,并将它们与 PDFTextStripper 结合使用 .

    现在这意味着要阅读PDF文件规范,这是目前的工作方式 .

    如果有人知道哪些操作员负责绘制下划线和表格行的操作,请告诉我 .

  • -2

    您可以使用Itext生成pdf报告 .

    通过使用itext,您可以轻松地放置线条 .

    尝试以下 .

    document.add(new LineSeparator(0.5f, 50, null, 0, 198));

    上面的代码用于在pdf报告中生成行 . 并根据您的选择设置尺寸 .

    希望这会帮助你 .

  • 2

    据我所知,pdfbox没有选项可以读取下划线 . 也许你可以为此目的尝试itextpdf .

  • 5

    如您所述 - PDFBox使用资源文件,将PDF操作符/指令绑定到将处理信息的访问者 .

    您最好将PDFBox的现有访问者复制到您自己的源文件夹中,然后从那里添加/扩展实现 .

    我很久以前的PostScript体验让我们回想起'moveto'和'lineto'运营商 . 由于PDF大致基于PS,因此您将寻找类似的东西 .

    http://learnpostscript.wordpress.com/category/lineto/

    PDF格式是b * tch - 它是HTML,做错了 . 它表示图形实现,而不是语义 . 即使重建句子也很困难 - 单词或甚至单个字符的位置,'空格'或'换行符'必须在算法上重建 . 简而言之,Adobe是一个*漏洞 . 读者是一种非符合人体工程学,虫蛀,不安全,臃肿的猪 .

    但是,您可以完成您的要求 - 如果您愿意将12个小时的工作放入其中 . 除了按位置检测外,通常会在文本后立即在PDF中发出下划线 . 所以您可以锁定您的通过PDF文档顺序检测,而不仅仅是页面位置 .

    另外,尝试使用带下划线的文本构建一个简单的两行PDF . 然后看看你能做些什么,然后解析它!下划线应该像狗的香蕉一样突出,一旦你能够发现它,你就会很顺利 .

    PDFBox不是很好的可扩展性,它主要只是一大堆算法 . 出于这个原因,只需复制PDFTextStripper源(并可能有PageDrawer作为参考)和原型 .

    希望这可以帮助!

  • 1

    根据api getfont()返回字体大小 .

    您可以使用getStyle()方法,它将为带下划线的字体返回 STYLE_UNDERLINE . 因此,您可以检索下划线样式 .

相关问题