用于Java的高级PDF解析器
我想用Java从PDF文件中提取不同的内容:用于Java的高级PDF解析器,java,parsing,pdf,Java,Parsing,Pdf,我想用Java从PDF文件中提取不同的内容: 完整的可见文本 图像 链接 是否也可以获得以下信息 文档元标记,如标题、描述或作者 只有标题 如果文档包含表单,则输入元素 我不需要操纵或渲染PDF文件。哪个图书馆最适合这种用途 更新 好的,我试过PDFBox: Document luceneDocument = LucenePDFDocument.getDocument(new File(path)); Field contents = luceneDocument.getField("c
- 完整的可见文本
- 图像
- 链接
- 文档元标记,如标题、描述或作者
- 只有标题
- 如果文档包含表单,则输入元素
Document luceneDocument = LucenePDFDocument.getDocument(new File(path));
Field contents = luceneDocument.getField("contents");
System.out.println(contents.stringValue());
但输出为空。但是“摘要”字段是可以的
下一个代码段工作正常
PDDocument doc = PDDocument.load(path);
PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(doc);
System.out.println(text);
doc.close();
但是,我不知道如何提取图像、链接等
更新2
我找到了一个如何提取图像的示例,但我仍然没有得到关于如何提取的答案:
- 链接
- 文档元标记,如标题、描述或作者
- 只有标题
- 如果文档包含表单,则输入元素
- 是的,Alp,iText确实提供了您提到的功能
阅读PDF文件
iText不是PDF查看器,iText不能
将PDF转换为图像,iText也不能
用于打印PDF,但
PdfReader类可以让您访问
形成PDF文档的对象
并将其发送到每个服务器的内容流
页此内容流可以是
已解析,如果未添加内容
作为光栅化文本,您可以转换
页面转换为纯文本。注意,iText
不做光学字符识别
使用
com.itextpdf.text.pdf.PdfReader代码>类。您还可以将JPedal用于所有这些提取任务。您也可以使用其中的大部分
无论您选择哪种解决方案,请记住,对于某些PDF文档,由于PDF的构造方式,文本提取是不可能的(页面上的字形有时没有任何与之相关的语义含义)
检查此问题的快速方法是在Acrobat中打开文档并尝试复制/粘贴文本。如果它在那里被认为是胡言乱语,那么它很可能在任何其他PDF提取器中都会被认为是胡言乱语。是我最近选择的PDF工具
- 完整的可见文本
“可见”是一个困难的问题。您可以使用com.itextpdf.text.pdf.parse包的类解析出所有可解析文本。。。但是这些类不知道剪辑。您可以很容易地将解析器约束到页面大小
// all text on the page, regardless of position
PdfTextExtractor.getTextFromPage(reader, pageNum);
实际上,您需要一种覆盖,它采用文本提取策略,即过滤策略。它很快就会变得有趣,但我认为你可以在这里“开箱即用”地得到你想要的一切
- 图像
是的,通过相同的包类。图像监听器不如文本监听器受支持,但确实存在
- 链接
对。链接是指向各种PDF页面的“注释”。找到它们很简单,只需在每个页面的“注释数组”中循环并挑选链接注释
PdfDictionary pageDict = myReader.getPageN(1);
PdfArray annots = pageDict.getAsArray(PdfName.ANNOTS);
ArrayList<String> dests = new ArrayList<String>();
if (annots != null) {
for (int i = 0; i < annots.size(); ++i) {
PdfDictionary annotDict = annots.getAsDict(i);
PdfName subType = annotDict.getAsName(PdfName.SUBTYPE);
if (subType != null && PdfName.LINK.equals(subType)) {
PdfDictionary action = annotDict.getAsDict(PdfName.A);
if (action != null && PdfName.URI.equals(action.getAsName(PdfName.S)) {
dests.add(action.getAsString(PdfName.URI).toString());
} // else { its an internal link, meh }
}
}
}
PdfDictionary pageDict=myReader.getPageN(1);
PdfArray annots=pageDict.getAsArray(PdfName.annots);
ArrayList dests=新的ArrayList();
如果(注释!=null){
对于(int i=0;i
你可以找到那个
- 输入元素
当然可以。对于XFA(LiveCycle Designer)或旧技术的“AcroForm”表单,iText可以找到所有字段及其值
AcroFields fields = myReader.getAcroFields();
Set<String> fieldNames = fields.getFields().keySet();
for (String fldName : fieldNames) {
System.out.println( fldName + ": " + fields.getField( fldName ) );
}
AcroFields=myReader.getAcroFields();
Set fieldNames=fields.getFields().keySet();
for(字符串fldName:字段名){
System.out.println(fldName+“:“+fields.getField(fldName));
}
多个选择列表不会处理得那么好。在冒号后面会有一个空白区域,用于空白文本字段和按钮。没有太多的信息……但这会让您开始
- 文档元标记,如标题、描述或作者
非常琐碎,是的
Map<String, String> info = myPdfReader.getInfo();
System.out.println( info );
Map info=myPdfReader.getInfo();
系统输出打印项次(信息);
除了基本的author/title/etc之外,您还可以通过reader.getMetadata()
访问一个相当复杂的XML模式
- 只有标题
TextRenderFilter
可以根据您希望的任何标准忽略文本。字体大小根据您的评论听起来差不多正确。签出iText感谢您的建议。创建者自己说“iText的主要目的是创建和操作PDF文档。”。你确定它提供了我所需要的功能吗?我不久前使用过iText,它是一款功能强大的产品。它应该能够处理你的所有任务。不过请注意许可证。上次我检查它是GPL/ALGO,它不是一个超级棒的许可证。谢谢你的回答。“输入元素”在我的列表中意外出现了两次,它们之间没有区别。我看了PDFBox,我想现在是时候测试iText了。只有标题如果有可能的话,我的意思是过滤掉HTML中的标记。有点类似,是的。com.itextpdf.text.pdf.parser.FilteredRenderListener
可以按字体大小(和/或颜色、字体等)过滤。你好,Mark Storer,我已经使用了上述方法检索注释(内部锚和嵌入链接)。但在“子类型”中未获取任何值。(它在子类型中返回空值:(如何应用文本大小筛选器?如何从pdf中获取现有内容的文本大小。我需要