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

时间:2016-09-26 15:44:11

标签: java itext

我正在使用iText(v 2.1.7),我需要找到特定页面的大小(以字节为单位)

我写了以下代码:

.categorydropadjust, .dropdown {
  position: static;
}
.container-fluid {
  position: relative;
}
.dropdown-menu {
  width: 100%;
}

但它无法正常工作。 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;),即使对于大于1MB的大页面也是如此,因此显然这不是正确的方法。

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

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

1 个答案:

答案 0 :(得分:1)

好吧,最后我设法获得了我正在使用的原始程序的源代码,它只接受PDF作为输入,最大“页面大小”为1MB。事实证明......“页面大小”的实际含义是fileSize / pageCount -_- ^

对于任何实际需要“独立”页面的精确大小的人,包括所有内容,我已经测试了这个解决方案,它似乎运行良好,因为它可能不是非常有效,因为它写出一个完整的每页的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;
    }