使用PDFBox加载pdf的性能

时间:2018-12-18 16:27:12

标签: java performance stream inputstream pdfbox

我正在使用PDFBox(2.0.12)API读取和提取PDF文件中的信息。 我有一个无法解决的性能问题。这是我的问题:

我有一个100个PDF文件的数据集,它们的大小大致相同,并且在文本和图形元素方面的内容总体上相同。我注意到读取某些PDF文件的时间可能比通常的平均时间长10倍(在100个文件中有8个文件就是这种情况)。 请注意,我一次对整个数据集进行了测试,也仅对需要较长时间才能单独加载并具有相同结果的文件进行了测试。

我试图弄清加载时间长的原因,但我无法追踪到 PDFStreamEngine 类的功能 ProcessStream(...) >。

问题可能是由于需要花费一些时间才能加载到pdfBox库方面的问题引起的吗?还是与API所使用的InputStream有关?

EDIT1

例如,我想比较这两个PDF:

pdf1 pdf1

pdf2 pdf2

以下是一些循环读取5个文件的结果。 我什至更改了读取两个PDF的顺序,但是得到了相同的结果。

|             |    PDF1     |     PDF2     |
|:----------- |------------:|:------------:|
| Reading time|  2077.67 ms | 128881.48 ms |
|  avg 5 run  |             |              |
|-------------|-------------|--------------|  
| size        |    9.6 Mo   |    924.5 kB  |

这是我用来读取文件的代码示例:

@Override
public void processFile() throws IOException, ExtractionException {

    TextComparator.chrono.start("Extraction " + key , 2 );
    log.info("Start Extraction " + key + "...");

    TextComparator.chrono.start("Reading raw " + key, 3);

    try {

        this.document = PDDocument.load(new File(path));
        setSuppressDuplicateOverlappingText(true);
        setShouldSeparateByBeads(true);
        setStartPage(0);
        setEndPage(document.getNumberOfPages());

        //Rotating the pdf page
        for (int i = 0; i < document.getNumberOfPages(); i++)
            document.getPage(i).setRotation(0);

        Writer dummy = new OutputStreamWriter(new ByteArrayOutputStream());   

        // Reading
        writeText(document, dummy);

        TextComparator.chrono.close("Reading raw " + key);

        TextComparator.chrono.start("Refining " + key, 3);


        log.info("---Number of extracted raw lines      : " + rawLines.size() );
        log.info("---Number of extracted cut lines      : " + nbCutLine );
        log.info("---Number of extracted raw paragraphs : " + paragraphs.size() );

    } catch (IOException e) {
        throw e;
    } catch (ExtractionException e) {
        throw e;
    } catch (Exception e) {
        throw new ExtractionException(fileName, e.getMessage());
    } finally {
        if (document != null) {
            document.close();
        }
    }   
}

上述方法是我自己的类的一部分,该类扩展了PDFBox库的 PDFTextStripper 类。该方法的核心部分是功能 writeText(。,。)是PDFBox库的一部分。它在内部调用其他一些函数,我可以通过覆盖它们并调用 父类的超级功能。我一直努力直到无法覆盖类 PDFStreamEngine 的功能ProcessStream,因为它在层次结构上比我自己的类高两个类。

Edit2

下面是总结我的性能测试的两个图表:

plot1:根据提取顺序的不同,一堆pdf文件(将近220个文件)的加载时间(对数刻度)(命令调用1表示它是要加载的第一个pdf,50表示它是最早的pdf)加载的pdf等)。尺寸由左侧的颜色光谱表示。

enter image description here

情节2 + 3: 对于两个不同的pdf文件,我执行了约220次提取。

plot2 enter image description here 我还注意到,当使用相同的文件并多次执行提取时,第一次提取比随后的几乎所有提取都要慢5倍。

是否有其他可能影响提取性能的参数提示?

非常感谢,

0 个答案:

没有答案