使用 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;
}
我正在使用 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;
}