如何使用PDDocument.loadNonSeq,大型pdf剥离器/解析文本技术

时间:2015-10-09 08:45:20

标签: java pdf pdfbox pdftotext

我有一些关于解析pdf和anfd的问题:

  1. 使用
  2. 的目的是什么 包含临时/临时文件的

    PDDocument.loadNonSeq方法?

    1. 我有大pdf,我需要解析它并获取文本内容。我使用PDDocument.load()然后 PDFTextStripper 逐页提取数据(pdfstripper已经setStartPage(n)setEndPage(n) 其中n = n + 1每页循环)。使用loadNonSeq而不是加载内存对内存更有效吗?
    2. 例如

      File pdfFile =  new File("mypdf.pdf");
      File tmp_file =  new File("result.tmp");
      PDDocument doc = PDDocument.loadNonSeq(pdfFile, new RandomAccessFile(tmp_file, READ_WRITE));
      int index=1;
      int numpages = doc.getNumberOfPages();
      for (int index = 1; index <= numpages; index++){
        PDFTextStripper stripper = new PDFTextStripper();
              Writer destination = new StringWriter();
              String xml="";
              stripper.setStartPage(index);
              stripper.setEndPage(index);
              stripper.writeText(this.doc, destination);
      .... //filtering text and then convert it in xml
      }
      

      此代码是否在正确的loadNonSeq之上使用,并且每页读取PDF页面而内存中没有vaste是一个好习惯吗? 我使用每页页面阅读,因为我需要使用DOM内存以XML格式编写文本(使用剥离技术,我决定为每个页面生成XML)

1 个答案:

答案 0 :(得分:1)

  
      
  1. 使用包含临时/临时文件的PDDocument.loadNonSeq方法的目的是什么?
  2.   

PDFBox实现了两种读取PDF文件的方法。

  • loadNonSeq是文档的加载方式
  • load是不应该加载文档的方式,但有人可能会尝试以这种方式修复具有损坏的交叉引用的文件。

在2.0.0开发分支中,以前用于loadNonSeq的算法现在用于load,之前用于load的算法不再使用。

  
      
  1. 我有大pdf,我需要解析它并获取文本内容。我使用PDDocument.load()然后PDFTextStripper逐页提取数据(pdfstripper有setStartPage(n)setEndPage(n),其中每个页面循环n = n + 1)。使用loadNonSeq代替load
  2. 对内存效率更高   

使用loadNonSeq代替load可能会提高多版本PDF的内存使用量,因为它只会读取仍然从引用表引用的对象,而load可以在内存中保留更多内容。

我不知道,使用临时文件是否有很大的不同。

  

这是一个很好的做法,每页阅读PDF页面而没有内存中的内容吗?

内部PDFBox也会在页面后解析给定的范围页面。因此,如果您逐页处理剥离器输出,则可以逐页解析它。