Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用PDFBox获取文本行的位置_Java_Pdf_Pdfbox - Fatal编程技术网

Java 使用PDFBox获取文本行的位置

Java 使用PDFBox获取文本行的位置,java,pdf,pdfbox,Java,Pdf,Pdfbox,我使用PDFBox从pdf中提取信息,而我当前试图查找的信息与行中第一个字符的x位置有关。不过,我找不到任何与如何获取这些信息有关的信息。我知道pdfbox有一个名为TextPosition的类,但我也不知道如何从pdfbox文档中获取TextPosition对象。如何从pdf中获取一行文本的位置信息?通常 要使用PDFBox提取文本(有或没有位置、颜色等额外信息),请实例化PDFTextStripper或从其派生的类,并按如下方式使用: PDFTextStripper stripper = n

我使用PDFBox从pdf中提取信息,而我当前试图查找的信息与行中第一个字符的x位置有关。不过,我找不到任何与如何获取这些信息有关的信息。我知道pdfbox有一个名为TextPosition的类,但我也不知道如何从pdfbox文档中获取TextPosition对象。如何从pdf中获取一行文本的位置信息?

通常 要使用PDFBox提取文本(有或没有位置、颜色等额外信息),请实例化
PDFTextStripper
或从其派生的类,并按如下方式使用:

PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(document);
(有许多
PDFTextStripper
属性允许您限制从中提取文本的页面。)

在执行
getText
的过程中,解析相关页面的内容流(以及从这些页面引用的表单XObject的内容流)并处理文本绘制命令

如果要更改文字提取行为,必须更改此文字绘图命令处理,通常应通过重写此方法来执行此操作:

/**
 * Write a Java string to the output stream. The default implementation will ignore the <code>textPositions</code>
 * and just calls {@link #writeString(String)}.
 *
 * @param text The text to write to the stream.
 * @param textPositions The TextPositions belonging to the text.
 * @throws IOException If there is an error when writing the text.
 */
protected void writeString(String text, List<TextPosition> textPositions) throws IOException
{
    writeString(text);
}
如果您还需要知道新行何时开始,您可能还需要覆盖

/**
 * Write the line separator value to the output stream.
 * @throws IOException
 *             If there is a problem writing out the lineseparator to the document.
 */
protected void writeLineSeparator( ) throws IOException
{
    output.write(getLineSeparator());
}
writeString
可以被重写以将文本信息导入单独的成员(例如,如果您可能希望结果的格式比单纯的
字符串
)更结构化,也可以被重写以向结果
字符串
中简单地添加一些额外信息

writeLineSeparator
可以被重写以触发行之间的某些特定输出

有更多的方法可以被重写,但通常您不太可能需要它们


在本案中 我使用PDFBox从pdf中提取信息,而我当前试图查找的信息与行中第一个字符的x位置有关

这可以按如下方式实现(只需在每行开头添加信息):

PDFTextStripper剥离器=新的PDFTextStripper()
{
@凌驾
受保护的无效起始页(PDPage页)引发IOException
{
startOfLine=true;
超级起始页(第页);
}
@凌驾
受保护的void writeLineSeparator()引发IOException
{
startOfLine=true;
super.writelineparator();
}
@凌驾
受保护的void writeString(字符串文本、列表文本位置)引发IOException
{
if(startOfLine)
{
TextPosition firstProsition=textPositions.get(0);
writeString(String.format([%s]”,firstProssion.getXDirAdj());
startOfLine=false;
}
super.writeString(文本、文本位置);
}
布尔startOfLine=true;
};
text=stripper.getText(文档);

(方法
extractLineStart
testExtractLineStartFromSampleFile
测试)

有多个示例显示如何从文档中获取
TextPosition
对象,例如,在“一般过程”和“PDFBox问题”一节中。这个问题已经解决了。@mkl writeString的名称是什么?它是受保护的,所以它可能是从TextStripper中的另一个方法中调用的,但我不确定是哪个方法。我在下一个答案中尝试了关于charactersByArticle的解决方案,但结果得到的向量为空。writeString是如何调用的?您将
PDFTextStripper
实例应用于文档,该实例一次又一次地调用
writeString
。我在下一个答案中尝试了该解决方案,关于charactersByArticle-这仅适用于PDF,其中包含分隔文档中多个项目的某些附加元信息。如果您的PDF没有此类信息,
charactersByArticle
将无济于事。对不起,我对PDF是全新的,我觉得您引用的是您认为我应该知道但我不知道的内容。你说对我的文档应用一个PDFTextStripper实例就可以了,但我该怎么做呢?我试着调用startDocument和getText,它们都没有用新的writeString方法运行代码。这个答案对我帮助很大。我在调用getText之前也发现了问题,在我知道扩展PDFTextStripper之前,我自己就已经加入了一个getText函数,这使得它无法调用新的writeString函数。谢谢@Beez你能分享你的代码吗?我也遇到了这类问题。我想将文本(以“http”或“https”开头)的颜色从蓝色改为黑色。
PDFTextStripper stripper = new PDFTextStripper()
{
    @Override
    protected void startPage(PDPage page) throws IOException
    {
        startOfLine = true;
        super.startPage(page);
    }

    @Override
    protected void writeLineSeparator() throws IOException
    {
        startOfLine = true;
        super.writeLineSeparator();
    }

    @Override
    protected void writeString(String text, List<TextPosition> textPositions) throws IOException
    {
        if (startOfLine)
        {
            TextPosition firstProsition = textPositions.get(0);
            writeString(String.format("[%s]", firstProsition.getXDirAdj()));
            startOfLine = false;
        }
        super.writeString(text, textPositions);
    }
    boolean startOfLine = true;
};

text = stripper.getText(document);