Java 使用PDFBox从PDF中的内容树和标记树中提取信息

Java 使用PDFBox从PDF中的内容树和标记树中提取信息,java,pdf,pdfbox,Java,Pdf,Pdfbox,我有一个从word创建的PDF,其中包含了大量关于内容树和标签树中的结构的信息,可以在AdobeAcrobat中看到(参见下面的图片) 在你建议之前,不,我没有访问原始word文档的权限,所以我不得不处理PDF解析 我在JavaPDFBox上取得了一些进展,它允许我在每个页面上定位注释并提取信息(注释是内容树的一部分)。 在PDPage原始文档中,我发现了两种似乎很有前途的方法,例如getContents()和getCOSDictionary()。现在,据我所知,处理COSObjects是痛苦

我有一个从word创建的PDF,其中包含了大量关于内容树和标签树中的结构的信息,可以在AdobeAcrobat中看到(参见下面的图片)

在你建议之前,不,我没有访问原始word文档的权限,所以我不得不处理PDF解析

我在JavaPDFBox上取得了一些进展,它允许我在每个页面上定位注释并提取信息(注释是内容树的一部分)。 在PDPage原始文档中,我发现了两种似乎很有前途的方法,例如getContents()和getCOSDictionary()。现在,据我所知,处理COSObjects是痛苦的,而且不健壮,getContents产生的字节和InputStream很难处理

是否有人能够以一种干净、简单的方式从上述表格中获取信息?如果使用了不同的软件包/语言,这也适用:)

包acs.pdf2isosts.TestPDFBox;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.util.Iterator;
导入java.util.List;
导入org.apache.pdfbox.pdmodel.PDDocument;
导入org.apache.pdfbox.pdmodel.PDPage;
导入org.apache.pdfbox.pdmodel.common.PDStream;
导入org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
导入org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
公共类ReadPdf{
公共静态void main(字符串[]args)引发IOException{
PDDocument document=PDDocument.load(新文件(
“/sample.pdf”);
document.getClass();
如果(!document.isEncrypted()){
迭代器it=document.getPages().Iterator();
while(it.hasNext()){
PDPage pg=it.next();
//System.out.println(pg.toString());
列表注释=pg.getAnnotations();
用于(PDA注释:注释)
{
if(PDAnnotationLink的注释实例)
{
PDAnnotationLink annotationLink=(PDAnnotationLink)注释;
System.out.println(annotationLink.getAction().getCOSObject());
}
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(pg.getContents());
弦线;
而((line=bufferedReader.readLine())!=null)
{ 
System.out.println(line.getClass());
System.out.printf(“%s\n”,第行);
}
}
}
document.close();
}
}
}

不清楚您需要什么。。。您已经有了注释。如果要浏览结构树,请从
doc.getDocumentCatalog().getStructureTreeRoot()
开始。层次结构在K元素中。谢谢,这是我一直在寻找的一部分,我现在可以访问我一直在寻找的标记树(我一直在PDPage中寻找,但正如您所指出的,它挂在文档目录中)。现在,我丢失了一些与注释位于同一位置的信息,这些信息不在StructureTree中,StructureTree是AdobeAcrobat的内容树(即每个页面的图像和文本),请在“显示内部结构”视图中查看PDFDebugger。这也有助于理解您将找到的数组/字典。考虑你自己回答这个问题,我的答案是一条直线。
package acs.pdf2isosts.TestPDFBox;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.List;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;

import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;

public class ReadPdf  {
    public static void main( String[] args ) throws IOException{

        PDDocument document = PDDocument.load(new File(
                "/sample.pdf")); 
        document.getClass();

        if (!document.isEncrypted()) {

            Iterator<PDPage> it = document.getPages().iterator();
            while (it.hasNext()) {
                PDPage pg = it.next();
                //System.out.println(pg.toString());
                List<PDAnnotation> annotations = pg.getAnnotations();
                for (PDAnnotation annotation : annotations)
                {
                    if (annotation instanceof PDAnnotationLink)
                    {
                        PDAnnotationLink annotationLink = (PDAnnotationLink)annotation;
                        System.out.println(annotationLink.getAction().getCOSObject());
                    }
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(pg.getContents()));
                String line;
                while( (line = bufferedReader.readLine()) != null )
                { 
                    System.out.println(line.getClass());
                    System.out.printf("%s\n", line);
                }


            }

        }

        document.close();


    }
        }
}