当前位置: 首页 > 面试题库 >

Java的高级PDF解析器

澹台俊晖
2023-03-14
问题内容

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

  • 完整的可见文字
  • 图片
  • 链接

还可以得到以下内容吗?

  • 文档元标记,例如标题,描述或作者
  • 仅标题
  • 输入元素(如果文档包含表单)

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

更新

OK,我尝试了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工具。

  • 完整的可见文字

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

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

实际上,您实际上需要采用TextExtractionStrategy(已过滤策略)的替代。它很快就变得很有趣,但是我认为您可以在这里“开箱即用”获得所需的一切。

  • 图片

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

  • 链接

是。链接是指向各种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规范。

  • 输入元素

绝对是 对于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 ) );
}

多重选择列表将无法很好地处理。在冒号之后,您将在空白处输入空白文本字段和按钮。没有什么内容丰富…但是那会让您入门。

  • 文档元标记,例如标题,描述或作者

很琐碎。是。

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

除了基本的author / title / etc外,还有一个相当复杂的XML模式,您可以通过访问reader.getMetadata()

  • 仅标题

A TextRenderFilter可以根据您希望的任何条件忽略文本。根据您的评论,字体大小听起来不错。



 类似资料:
  • 问题内容: 嗨,我想解析看起来像这样的非常奇怪的xml: 使用本教程时,无法从foo2获取值: http://javarevisited.blogspot.com/2011/12/parse-xml-file-in-java-example- tutorial.html 但是,如果我们有相同的参数,例如 问题答案: //规范化您的XML,然后通过该XML 创建一个,然后遵循以下代码

  • 本章主要介绍诸葛io的高级分析功能,包括: 广告监测 搜索关键词广告(SEM) 产品版本分析 网页端获取分析 APP获取分析 行为路径 用户粘性分析 SQL查询 跨平台分析 我们在官网Demo中开放了所有付费功能的试用体验,如您想了解更多内容,可以通过在线客服或客服电话与我们取得联系:40080-94843

  • 本文向大家介绍深入理解Java高级特性——注解,包括了深入理解Java高级特性——注解的使用技巧和注意事项,需要的朋友参考一下 博主在初学注解的时候看到网上的介绍大部分都是直接介绍用法或者功能,没有实际的应用场景,篇幅又很长导致学习的时候难以理解其意图,而且学完就忘QAQ。本篇文章中我将结合实际的应用场景尽可能由浅入深,平缓的介绍java注解。 java注解是jdk1.5以后新出的特性,对于它的应

  • 问题内容: 我想要一个带pdf并返回文档中注释注释文本列表的python函数。我看过python- poppler(https://code.launchpad.net/~poppler-python/poppler- python/trunk ),但我不知道如何获取它来给我有用的东西。 我找到了该方法,并修改了通过调用它的演示程序,但是我不知道该如何处理AnnotMapping对象。它似乎没有完

  • 本文向大家介绍Python中的迭代器与生成器高级用法解析,包括了Python中的迭代器与生成器高级用法解析的使用技巧和注意事项,需要的朋友参考一下 迭代器 迭代器是依附于迭代协议的对象——基本意味它有一个next方法(method),当调用时,返回序列中的下一个项目。当无项目可返回时,引发(raise)StopIteration异常。 迭代对象允许一次循环。它保留单次迭代的状态(位置),或从另一个

  • 本文向大家介绍浅析Python迭代器的高级用法,包括了浅析Python迭代器的高级用法的使用技巧和注意事项,需要的朋友参考一下 跳过开头 首先是跳过开始部分,这个在我们读取文本的时候最常用。在实际的应用当中,比如记录的日志或者是代码等等,一般来说头部都会附上一段说明,或者用注释标注或者是用特殊的符号标记。这些信息是给用到数据的程序员看的,当我们通过代码获取数据的时候,显然是希望可以过滤掉这些信息的