-1

我正在尝试获取 3 到 5 个 PDF 文件(来自一些互联网资源)并将它们一个接一个地合并。仅供参考,我不想使用 iText 或任何其他 PDF 库,因为,请看一次代码

public static void saveFile(String[] urls, String fileName) throws IOException {
    ClientURLConnection clientURLConnection = null;
    InputStream inputStream = null;
    try {
        int t = 1;
        FileOutputStream outputStream = new FileOutputStream(fileName,true);
        for (String url : urls) {                
            clientURLConnection = new ClientURLConnection(url);
            clientURLConnection.setHttpMethod(ClientURLConnection.GET_METHOD);
            inputStream = clientURLConnection.getInputStream();
            outputStream.write(IOUtils.toByteArray(inputStream));
            inputStream.close();
            outputStream.flush();
            System.out.println((t++) + " - File inserted in " + fileName + "\n");
            Thread.sleep(3000);
        }
            outputStream.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

String[] urls - 是获取 PDF 文档的 URL 数组。Sting fileName - 是一个用于存储所有 PDF 的文件。ClientURLConnecion - 是我自己的类来处理代理和其他事情。

预期输出 - 我们从 URL 中获得的两个 PDF 放在一个文件中

实际输出 - 第二个 PDF 覆盖第一个,但文件的大小是两个 PDF 大小的总和。

问题 - 即使我制作了 FileOutputstream - 追加为真,它正在覆盖。我不明白我在哪里做错了

提前致谢

4

2 回答 2

2

合并两个 PDF 文件并不等同于附加这些文件的二进制内容。

您的代码可能会以您想要的方式附加字节 - 正如输出文件的大小所暗示的那样 - 但似乎只有最后一个附加的文件在您打开它时被 PDF 阅读器读取。

因此,您可能应该使用 API 来读取 PDF 的实际内容。

于 2013-05-14T12:31:30.230 回答
0

为什么合并两个 PDF 文件不等于附加这些文件的二进制内容?

每个文档文件(无论是 .doc、.ppt 还是 .pdf)都有一个文件格式。文件的扩展名表示数据编码的格式。这里的编码是指将文件的位和字节写入磁盘的结构。

每个文件都将包含实际数据以及一些为文件定义元数据的标头。例如,一个 .doc 文件将包含一些关于作者的元数据以及其他一些内容。所有这些字段(它们的顺序等)如何存储在磁盘上取决于文件格式。这就是为什么 MS Word 无法读取 PDF 的原因,因为它可能需要一组完全不同的字段。

现在,如果合并以下两个 PDF 文件

[pdf: meta data header]       [pdf: meta data header] 
  [pdf: page1]          with    [pdf: page3]
  [pdf: page2]                  [pdf: page4]
[pdf: meta data footer]       [pdf: meta data footer]

使用基本的文件 I/O 合并,你会得到类似的东西

[pdf: meta data header]
  [pdf: page1]
  [pdf: page2]
[pdf: meta data footer]
[pdf: meta data header]
  [pdf: page3]
  [pdf: page4]
[pdf: meta data footer]

这是不正确的。不能有多个标题,不同的程序会表现不同。在您的情况下,您的 PDF 阅读器很乐意向您展示最后一个合并的 PDF。

另一方面,如果(也如其他人所建议的那样)您使用明确支持编辑 PDF 文件的第三方 API(如 iText),您可能会在合并后得到类似的东西

[pdf: meta data header]
  [pdf: page1]
  [pdf: page2]
  [pdf: page3]
  [pdf: page4]
[pdf: meta data footer]

您的 PDF 阅读器在正确显示时不会有任何问题。

于 2013-05-14T13:14:27.550 回答