Java PDF查找文本是下划线还是表格单元格

Java PDF查找文本是下划线还是表格单元格,java,pdf,pdfbox,Java,Pdf,Pdfbox,我一直在玩PdfBox和PDFTextStripperByArea方法 如果文本是粗体或斜体,我可以提取信息,但无法获取下划线信息 据我在PDF中的理解,下划线是通过画线来完成的。所以理论上,我应该能够得到一些关于文本中某些行的信息。给出这些信息后,我就可以知道文本是下划线还是在表格中 以下是我目前的代码: List<TextPosition> textPos = charactersByArticle.get(index); for (TextPosition t : textP

我一直在玩PdfBox和PDFTextStripperByArea方法

如果文本是粗体或斜体,我可以提取信息,但无法获取下划线信息

据我在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;
        }
    }
}
List textPos=charactersByArticle.get(索引);
for(TextPosition t:textPos)
{               
如果(t.getFont().getFontDescriptor()!=null)
{                           
如果(t.getFont().getFontDescriptor().getFontWeight()>粗体权重||
t、 getFont().getFontDescriptor().isForceBold())
{
isBold=true;
}
if(t.getFont().getFontDescriptor().isItalic())
{
isItalic=真;
}
}
}
我试着在PDFStreamEngine类的processEncodedText方法中处理PDGraphicsState对象,但在那里找不到行的信息

根据api从中检索此信息的任何建议都会返回字体大小


您可以使用方法,它将返回带下划线字体的
STYLE\u UNDERLINE
。因此,您可以检索下划线样式。

以下是我到目前为止发现的内容:

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

但忽略所有图形对象,因此没有下划线或表格结构信息

现在,如果我们看一下PageDrawer.properties资源文件,我们可以看到这个文件几乎可以绑定到所有可用的操作符。下的PageDrawer类使用

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

现在的“诀窍”是找出哪些图形运算符表示下划线和表,并将它们与PDFTextStripper结合使用

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


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

您可以使用Itext生成pdf报告

通过使用itext,您可以轻松地放置这些行

试试下面的方法

document.add(新的行分隔符(0.5f,50,null,0,198))

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


希望这能对您有所帮助。

据我所知,pdfbox没有任何选项可以让您阅读下划线。也许您可以为此尝试itextpdf。

正如您所提到的——PDFBox使用资源文件,将PDF操作符/说明绑定到将处理信息的访问者

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

我很久以前的PostScript经历让我想起了“moveto”和“lineto”操作符。因为PDF基本上是基于PS的,所以您将寻找类似的东西

PDF格式是b*tch——它是HTML,做错了。它表示图形实现,而不是语义。即使重建句子也很困难——单词甚至单个字符被定位,“空格”或“换行符”必须通过算法重建。简言之,Adobe是一个漏洞。读者是一头不符合人体工程学的、布满虫子的、不安全的、臃肿的猪


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

此外,请尝试构造一个带有下划线文本的简单的两行PDF。然后看看你能做些什么,把它解析回来!下划线应该像狗的香蕉一样突出,一旦你能察觉到,你就可以顺利上路了

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


希望这有帮助

好问题。我在使用pdfbox时遇到了同样的问题,当时我正在将pdf转换为html。但我通过将下划线作为背景图像的一部分来解决这个问题。我认为这在你的情况下是行不通的。如果我们得到了这些行的x,y坐标,那将非常好。我建议您尝试另一个PDF处理库。下划线不是字体的属性,例如字体大小(粗体)或形状(斜体),而是放在文本下方的图形对象。我一直在读PDFBOXAPI,看起来你可以得到所有的图形对象。因此,你必须编写一个程序,计算一些看起来像一条线的东西的坐标,然后看看它是否在一些文本下面。那太乏味了。但我以前从未使用过PDFBox,所以我不是专家,我知道线条不是文本的一部分,而是图形对象。切换库不是一个选项,