需要获取PDF中每个页面的偏移量和字节长度。例如第一页偏移值将为0,长度将为页面的字节长度。
我需要将 PDF 的索引文件传递给 IBM Ondemand 工具,它是一个 PDF 存储库。我需要合并各个 PDF 文件,计算每个 PDF 的偏移量和长度,使用这两个参数创建索引文件并将其传递给工具。
该工具将利用索引文件根据作为属性(索引文件)传递的偏移量和长度来分割 PDF(将多个 PDF 合并为单个 PDF)。
我使用 itext 使用书签获取页面的开头和结尾。需要计算每页的字节偏移量和长度。
建议有什么方法可以获取索引(页面开头)和页面结尾(以字节为单位)。
如有任何帮助,我们将不胜感激
您不能以任何方式这样做。请阅读 PDF 文件格式规范(此处以及其他地方 http://www.adobe.com/devnet/pdf/pdf_reference.html)。
PDF 文件包含“对象”,页面既具有记录在流对象中的页面描述,也可以(并且大多数会)使用很可能分散在文件周围的各种其他对象。
您误解了 PDF 文件的构建方式,在开始尝试实现此功能之前您需要先了解一下,否则您将浪费大量时间。
这个问题需要在IBM Ondemand 论坛上提问。我想我可以利用 Itext 来破解它。正如 David 提到的,我们无法使用 Itext 处理此类非结构化 PDF。下面给出了解决问题的代码片段。
两个 PDF 都是使用纯 java 合并的。合并后的文件将有两个 EOF、标头和标尾信息。
当您在 Acrobat 中打开时,它会读取最后的文档信息并显示。当我们将长度和索引传递给 ondemand 时,它将分割 PDF 并按预期显示。
public static void main(String[] args) throws IOException {
String sourceFile1Path = "C:\\sample1.PDF";
String sourceFile2Path = "C:\\sample1.PDF";
String mergedFilePath = "C:\\merged.PDF";
File[] files = new File[2];
files[0] = new File(sourceFile1Path);
files[1] = new File(sourceFile2Path);
File mergedFile = new File(mergedFilePath);
for (File file : files) {
FileWriter fstream = null;
BufferedWriter out = null;
fstream = new FileWriter(mergedFile, true);
out = new BufferedWriter(fstream);
FileInputStream fis = new FileInputStream(file);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
String aLine;
while ((aLine = in.readLine()) != null) {
out.write(aLine);
out.newLine();
}
out.close();
fstream.close();
fis.close();
in.close();
System.out.println("File Length: " + file.getName() + " : " + new File(mergedFilePath).length());
}
}
@Magesh
我不确定,这个问题你有解决办法吗? 我想我有同样的问题,需要按偏移量/长度分割 PDF。
欲了解更多说明。 我的场景是从 IBM CMOD 导出数据(索引/PDF)以在其他系统中使用。 (使用 arsdoc get ... -g -N -C ...)
如果有多个 PDF 文件(例如,arsdoc 找到 10 个索引/文件),arsdoc 将导出为 1 个大 PDF 文件,并将导出 1 个通用索引文件。但是,当我用普通 PDF 查看器打开时,只会看到第一个 PDF 文件,而通用索引将使用偏移量/长度,当 arsload 回 IBM CMOD 时,可以将 PDF 拆分回原始文件。 (例如,从一个大文件恢复为原始的 10 个 PDF 文件。)