使用 iText 获取 PDF 中特定页面的大小(以字节为单位)

Get size (in bytes) of a specific page in a PDF using iText

我正在使用 iText (v 2.1.7),我需要找到 特定页面.

的大小(以字节为单位)

我写了下面的代码:

public static long[] getPageSizes(byte[] input) throws IOException {
        PdfReader reader;
        reader = new PdfReader(input);
        int pageCount = reader.getNumberOfPages();
        long[] pageSizes = new long[pageCount];
        for (int i = 0; i < pageCount; i++) {
            pageSizes[i] = reader.getPageContent(i+1).length;
        }

        reader.close();
        return pageSizes;
    }

但它不能正常工作。 reader.getPageContent(i+1).length; 指令 returns 非常小的值(通常是 <= 100),即使对于超过 1MB 的大页面也是如此,显然这不是正确的方法。

但是正确的方法是什么?有吗?

注意:我已经检查过this question,但提供的解决方案包括将 PDF 的每一页写入磁盘,然后检查文件大小,这是非常低效的,甚至可能是错误的,因为我假设这每次都会重复 PDF header 和元数据。我正在寻找更 "proper" 的解决方案。

好吧,最后我设法获得了我正在使用的原始程序的源代码,它只接受最大 "page size" 1MB 的 PDF 作为输入。结果... "page size" 的实际含义是 fileSize / pageCount -_-^

对于真正需要 "standalone" 页面的精确大小并包含所有内容的任何人,我已经测试了这个解决方案并且它似乎运行良好,但它可能不是很有效,因为它为每一页写出整个 PDF 文档。使用内存流而不是基于磁盘的内存流有帮助,但我不知道有多大帮助。

public static int[] getPageSizes(byte[] input) throws IOException {
        PdfReader reader;
        reader = new PdfReader(input);
        int pageCount = reader.getNumberOfPages();
        int[] pageSizes = new int[pageCount];
        for (int i = 0; i < pageCount; i++) {
            try {
                Document doc = new Document();
                ByteArrayOutputStream bous = new ByteArrayOutputStream();
                PdfCopy copy= new PdfCopy(doc, bous);
                doc.open();
                PdfImportedPage page = copy.getImportedPage(reader, i+1);
                copy.addPage(page);
                doc.close();
                pageSizes[i] = bous.size();
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }

        reader.close();
        return pageSizes;
    }