Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Java的高级PDF解析器_Java_Parsing_Pdf - Fatal编程技术网

用于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

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

  • 完整的可见文本
  • 图像
  • 链接
是否也可以获得以下信息

  • 文档元标记,如标题、描述或作者
  • 只有标题
  • 如果文档包含表单,则输入元素
我不需要操纵或渲染PDF文件。哪个图书馆最适合这种用途

更新

好的,我试过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

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

  • 链接
  • 文档元标记,如标题、描述或作者
  • 只有标题
  • 如果文档包含表单,则输入元素

    • 是的,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中获取现有内容的文本大小。我需要