如何在不创建新数组的情况下获取PDF页面位置

时间:2019-01-25 18:05:41

标签: pdf pdfbox

是否可能只找出字节数组中PDF页面的位置?

此刻,我解析完整的PDF以找出页面字节:

  public static List<byte[]> splitPdf(byte[] pdfDocument) throws Exception {
        InputStream inputStream = new ByteArrayInputStream(pdfDocument);
        PDDocument document = PDDocument.load(inputStream);
        Splitter splitter = new Splitter();
        List<PDDocument> PDDocs = splitter.split(document);
        inputStream.close();
        List<byte[]> pages = PDDocs.stream()
                .map(PDFUtils::getResult).collect(Collectors.toList());
}

private  static byte[] getResult(PDDocument pd) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    pd.save(byteArrayOutputStream);
    return byteArrayOutputStream.toByteArray();
}

我的代码很好用,但是

  • 我创建了其他 List 以保存页面字节。我只想拥有字节位置-如果我知道页面(页面起始位置,页面结束位置)的字节索引,我将从主字节数组中提取该字节索引。

所以我可能可以在PDF标头中或某处找到此信息...

现在,我正在尝试优化内存,因为我并行解析了数百个文档。所以我不想创建重复的数组。

1 个答案:

答案 0 :(得分:1)

  

如果我知道页面的字节索引(页面开始位置,页面结束位置),我将从主字节数组中提取出来。

正如@Amedee在评论中所暗示的那样,每个页面上都没有单独的pdf部分。

pdf由多个对象(内容流,字体资源,图像资源等)构成,并且两个页面可能使用相同的对象(例如,使用相同的字体或图像)。此外,pdf可能包含未使用的对象。

因此,部分pdf大小的总和可能已经小于,大于甚至等于完整pdf的大小。