使用偏移和长度拆分PDF - IBM ONDEMAND(组合PDF)

时间:2016-03-21 15:14:16

标签: java pdf itext ondemand

需要获取PDF中每个页面的偏移量和字节长度。例如,第一页偏移值为0,长度为页面的字节长度。

我需要将PDF的索引文件传递给IBM Ondemand工具,它是一个PDF存储库。我需要合并单个PDF文件计算每个PDF的偏移量和长度,使用这两个参数创建索引文件并将其传递给工具。

该工具将根据作为属性传递的偏移和长度(索引文件),使用索引文件将PDF(多个PDF合并为单个)拆分。

我使用itext来使用书签来获取页面的开头和结尾。需要计算每个页面的偏移量和字节长度。

建议是否有任何方法可以获取索引(页面开头)和页面结尾的字节数。

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

你不能以任何方式做到这一点。请阅读PDF文件格式规范(此处以及其他地方http://www.adobe.com/devnet/pdf/pdf_reference.html)。

PDF文件包含"对象"并且页面具有记录在流对象中的页面描述,并且可以(并且通常将)使用很可能散布在文件周围的各种其他对象。

您误解了PDF文件的构建方式,在开始尝试实施此文件之前需要了解它,否则您将浪费大量时间。

答案 1 :(得分:0)

需要在IBM Ondemand论坛上询问此问题。我以为我可以利用Itext来破解它。正如David所说,我们无法使用Itext处理这类非结构化PDF。下面给出了解决问题的代码片段。

使用普通java合并PDF。合并后的文件将包含两个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());
    }
}