无法将流与 PDFBox 合并
Unable to merge streams with PDFBox
目前我可以在使用 java.io.File 时合并两个 PDF 文件,但在使用输入和输出流时无法合并它们。
下面的代码有效并成功生成合并的 PDF。
File mainDoc = new File(path...);
File additionalDoc = new File(path...);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.setDestinationFileName(path + "/merged.pdf");
pdfMerger.addSource(mainDoc);
pdfMerger.addSource(additionalDoc);
pdfMerger.mergeDocuments(null);
然后我尝试使用流来做同样的事情。
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream mainDocStream = new FileInputStream(path...);
InputStream additionalDocSteam = new FileInputStream(path...);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.addSource(mainDocStream);
pdfMerger.addSource(additionalDocSteam);
pdfMerger.setDestinationStream(out);
pdfMerger.mergeDocuments(null);
上面的代码在到达行 pdfMerger.mergeDocuments(null); 时抛出以下异常:
java.io.IOException: Error: End-of-File, expected line at
org.apache.pdfbox.pdfparser.BaseParser.readLine(BaseParser.java:1119)
at
org.apache.pdfbox.pdfparser.COSParser.parseHeader(COSParser.java:2005)
at
org.apache.pdfbox.pdfparser.COSParser.parsePDFHeader(COSParser.java:1988)
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:269)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1143)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1059)
at
org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:263)
最后我尝试以这个答案 (Merge Pdf Files Using PDFBox) 为例,但我生成的 pdf 似乎没有合并这两个 pdf。
这是我试过的代码。
public InputStream createPDF() {
try{
// Note, i have also tried to use java.io.File instead of an
// InputStream but the result was the same
// File mainDoc = new File(path...);
// PDDocument document = PDDocument.load(mainDoc);
InputStream pdfInputStream = null;
InputStream mainDocStream = new FileInputStream(path...);
PDDocument document = PDDocument.load(mainDocStream);
InputStream additionalDocSteam = new FileInputStream(path...);
PDDocument additionalDocument = PDDocument.load(additionalDocSteam);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.appendDocument(additionalDocument, document);
document.save(out);
document.close();
PDDocument.load(out.toByteArray());
pdfInputStream = new ByteArrayInputStream(out.toByteArray());
}catch(...){
....
}
return pdfInputStream;
}
上面的代码确实生成了一个 PDF,但新创建的 PDF 仅包含主文档的内容,而不包含第二个文档的内容。所以看起来我遗漏了一些东西并且文件没有合并。
我找到了解决方案,但我仍然无法理解在使用流时出了什么问题。详细:
虽然以下代码抛出异常(java.io.IOException:错误:文件结束,预期行) :
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream mainDocStream = new FileInputStream(path...);
InputStream additionalDocStream = new FileInputStream(path...);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.addSource(mainDocStream);
pdfMerger.addSource(additionalDocStream);
pdfMerger.setDestinationStream(out);
pdfMerger.mergeDocuments(null);
在 addSource 方法中使用文件时,一切似乎都按要求工作。
public InputStream createPDF() {
InputStream pdfInputStream = null;
try{
File mainDoc = new File(...);
File additionalDoc = new File(path...);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.addSource(mainDoc);
pdfMerger.addSource(additionalDoc);
pdfMerger.setDestinationStream(out);
pdfMerger.mergeDocuments(null);
pdfInputStream = new ByteArrayInputStream(out.toByteArray());
}catch(...){
...
}
return pdfInputStream;
}
现在,为什么第一种使用流的方法在直接使用文件时会抛出异常,这是我也想知道的。
目前我可以在使用 java.io.File 时合并两个 PDF 文件,但在使用输入和输出流时无法合并它们。
下面的代码有效并成功生成合并的 PDF。
File mainDoc = new File(path...);
File additionalDoc = new File(path...);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.setDestinationFileName(path + "/merged.pdf");
pdfMerger.addSource(mainDoc);
pdfMerger.addSource(additionalDoc);
pdfMerger.mergeDocuments(null);
然后我尝试使用流来做同样的事情。
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream mainDocStream = new FileInputStream(path...);
InputStream additionalDocSteam = new FileInputStream(path...);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.addSource(mainDocStream);
pdfMerger.addSource(additionalDocSteam);
pdfMerger.setDestinationStream(out);
pdfMerger.mergeDocuments(null);
上面的代码在到达行 pdfMerger.mergeDocuments(null); 时抛出以下异常:
java.io.IOException: Error: End-of-File, expected line at org.apache.pdfbox.pdfparser.BaseParser.readLine(BaseParser.java:1119) at org.apache.pdfbox.pdfparser.COSParser.parseHeader(COSParser.java:2005) at org.apache.pdfbox.pdfparser.COSParser.parsePDFHeader(COSParser.java:1988) at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:269) at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1143) at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1059) at org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:263)
最后我尝试以这个答案 (Merge Pdf Files Using PDFBox) 为例,但我生成的 pdf 似乎没有合并这两个 pdf。 这是我试过的代码。
public InputStream createPDF() {
try{
// Note, i have also tried to use java.io.File instead of an
// InputStream but the result was the same
// File mainDoc = new File(path...);
// PDDocument document = PDDocument.load(mainDoc);
InputStream pdfInputStream = null;
InputStream mainDocStream = new FileInputStream(path...);
PDDocument document = PDDocument.load(mainDocStream);
InputStream additionalDocSteam = new FileInputStream(path...);
PDDocument additionalDocument = PDDocument.load(additionalDocSteam);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.appendDocument(additionalDocument, document);
document.save(out);
document.close();
PDDocument.load(out.toByteArray());
pdfInputStream = new ByteArrayInputStream(out.toByteArray());
}catch(...){
....
}
return pdfInputStream;
}
上面的代码确实生成了一个 PDF,但新创建的 PDF 仅包含主文档的内容,而不包含第二个文档的内容。所以看起来我遗漏了一些东西并且文件没有合并。
我找到了解决方案,但我仍然无法理解在使用流时出了什么问题。详细:
虽然以下代码抛出异常(java.io.IOException:错误:文件结束,预期行) :
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream mainDocStream = new FileInputStream(path...);
InputStream additionalDocStream = new FileInputStream(path...);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.addSource(mainDocStream);
pdfMerger.addSource(additionalDocStream);
pdfMerger.setDestinationStream(out);
pdfMerger.mergeDocuments(null);
在 addSource 方法中使用文件时,一切似乎都按要求工作。
public InputStream createPDF() {
InputStream pdfInputStream = null;
try{
File mainDoc = new File(...);
File additionalDoc = new File(path...);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.addSource(mainDoc);
pdfMerger.addSource(additionalDoc);
pdfMerger.setDestinationStream(out);
pdfMerger.mergeDocuments(null);
pdfInputStream = new ByteArrayInputStream(out.toByteArray());
}catch(...){
...
}
return pdfInputStream;
}
现在,为什么第一种使用流的方法在直接使用文件时会抛出异常,这是我也想知道的。