Java 使用PDFBox从PDF中的内容树和标记树中提取信息
我有一个从word创建的PDF,其中包含了大量关于内容树和标签树中的结构的信息,可以在AdobeAcrobat中看到(参见下面的图片) 在你建议之前,不,我没有访问原始word文档的权限,所以我不得不处理PDF解析 我在JavaPDFBox上取得了一些进展,它允许我在每个页面上定位注释并提取信息(注释是内容树的一部分)。 在PDPage原始文档中,我发现了两种似乎很有前途的方法,例如getContents()和getCOSDictionary()。现在,据我所知,处理COSObjects是痛苦的,而且不健壮,getContents产生的字节和InputStream很难处理 是否有人能够以一种干净、简单的方式从上述表格中获取信息?如果使用了不同的软件包/语言,这也适用:)Java 使用PDFBox从PDF中的内容树和标记树中提取信息,java,pdf,pdfbox,Java,Pdf,Pdfbox,我有一个从word创建的PDF,其中包含了大量关于内容树和标签树中的结构的信息,可以在AdobeAcrobat中看到(参见下面的图片) 在你建议之前,不,我没有访问原始word文档的权限,所以我不得不处理PDF解析 我在JavaPDFBox上取得了一些进展,它允许我在每个页面上定位注释并提取信息(注释是内容树的一部分)。 在PDPage原始文档中,我发现了两种似乎很有前途的方法,例如getContents()和getCOSDictionary()。现在,据我所知,处理COSObjects是痛苦
包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();
}
}
}