我正在尝试获取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 - 追加为true,它也会被覆盖。 我不明白我在哪里做错了
先谢谢
答案 0 :(得分:2)
合并两个PDF文件并不等同于附加这些文件的二进制内容。
您的代码可能以您希望的方式附加字节 - 建议输出文件的大小 - 但是当您打开它时,您的PDF阅读器似乎只读取了最后一个附加文件
因此,您可能使用API来阅读PDF的实际内容。
答案 1 :(得分: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。
如果另一方面(正如其他人所建议的那样)你使用第三方API明确支持编辑PDF文件(如iText),你可能会在合并后得到这样的东西
[pdf: meta data header]
[pdf: page1]
[pdf: page2]
[pdf: page3]
[pdf: page4]
[pdf: meta data footer]
您的PDF阅读器在正确显示时不会有任何麻烦。