2016-03-21 78 views
0

需要获取PDF中每个页面的偏移量和字节长度。例如,首页偏移值将为0,长度将为页面的字节长度。使用偏移量和长度拆分PDF - IBM ONDEMAND(组合PDF)

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

该工具将利用索引文件基于作为属性(索引文件)传递的偏移量和长度来拆分PDF(多个PDF合并为单个)。

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

建议是否有任何方式获取索引(页面的开始)和页面结尾的字节。

任何帮助,将不胜感激

+0

是我还是这个问题只是无意义?你能改说吗?似乎你对PDF文件格式有错误的假设。 –

回答

0

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

PDF文件包含“对象”,并且一个页面同时具有记录在流对象中的页面描述,并且可以(并且大部分将)使用很可能分散在文件周围的各种其他对象。

您误解了PDF文件是如何构建的,而且您需要了解在开始尝试实现这个过程之前遇到的困难,否则您将浪费大量时间。

0

此问题需要在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()); 
    } 
}