我正在使用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标题和元数据。我正在寻找更“合适”的解决方案。
答案 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;
}