ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

适用于Java的高级PDF解析器

2019-09-23 11:11:17  阅读:349  来源: 互联网

标签:java pdf parsing


我想从Java中提取PDF文件中的不同内容:

>完整的可见文字
>图像
>链接

是否也可以获得以下内容?

>文档元标记,如标题,描述或作者
>只是头条新闻
>如果文档包含表单,则输入元素

我不需要操纵或渲染PDF文件.哪个库最适合这种目的?

UPDATE

好的,我试过PDFBox:

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

我找到了一个如何提取图像的例子,但我仍然没有得到如何提取的答案:

>链接
>文档元标记,如标题,描述或作者
>只是头条新闻
>如果文档包含表单,则输入元素

解决方法:

iText是我最近选择的PDF工具.

  • The complete visible text

“可见”是一个艰难的.您可以使用com.itextpdf.text.pdf.parse包的类解析所有可解析的文本…但这些类不了解CLIPPING.您可以轻松地将解析器限制为页面大小.

// all text on the page, regardless of position
PdfTextExtractor.getTextFromPage(reader, pageNum);

您实际上需要采用TextExtractionStrategy的过滤,即过滤策略.它很快就会变得有趣,但我认为你可以“开箱即用”获得你想要的一切.

  • images

是的,通过相同的包类.图像侦听器不像文本侦听器那样受支持,但确实存在.

  • links

是.链接是各种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 }
    }
  }
}

你可以找到PDF Spec here.

  • input elements

当然.对于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 ) );
}

Mutli-select列表不能很好地处理.对于空文本字段和按钮,冒号后面会有一个空格.没有太多信息……但那会让你开始.

  • document meta tags like title, description or author

非常琐碎.是.

Map<String, String> info = myPdfReader.getInfo();
System.out.println( info );

除了基本作者/标题/等之外,您还可以通过reader.getMetadata()访问相当复杂的XML模式.

  • only headlines

TextRenderFilter可以根据您希望的任何条件忽略文本.字体大小根据您的评论发出正确的声音.

标签:java,pdf,parsing
来源: https://codeday.me/bug/20190923/1815193.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有