Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法将流与PDFBox合并_Pdf_Pdfbox - Fatal编程技术网

无法将流与PDFBox合并

无法将流与PDFBox合并,pdf,pdfbox,Pdf,Pdfbox,目前,我可以在使用java.io.File时合并两个PDF文件,但在使用input和outputstreams时无法合并它们 ByteArrayOutputStream out = new ByteArrayOutputStream(); InputStream mainDocStream = new FileInputStream(path...); InputStream additionalDocSteam = new FileInputStream(path...); PDFMerger

目前,我可以在使用java.io.File时合并两个PDF文件,但在使用input和outputstreams时无法合并它们

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);
下面的代码工作并成功生成合并的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行时的上述代码(空);引发以下异常:

java.io.IOException:错误:文件结束,预期行位于 org.apache.pdfbox.pdfparser.BaseParser.readLine(BaseParser.java:1119) 在 org.apache.pdfbox.pdfparser.COSParser.parseHeader(COSParser.java:2005) 在 org.apache.pdfbox.pdfparser.COSParser.parsePDFHeader(COSParser.java:1988) 位于org.apache.pdfbox.pdfparser.pdfparser.parse(pdfparser.java:269) 位于org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1143) 位于org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1059) 在 org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:263)

最后,我尝试以这个答案()为例,但我生成的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只包含主文档的内容,而不包含第二个文档的内容。因此,看起来我缺少了一些东西,文档没有合并

我能够找到解决方案,但我仍然无法理解使用streams时出现了什么问题。详细内容:

当以下代码引发异常时(java.io.IOException:Error:End of File,expected line)

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;
}

现在,我还想知道为什么第一种使用streams的方法在直接使用文件时抛出异常

因为我不想提出一个新问题。使用appendDocument而不是mergeDocuments有什么好处吗?添加了Stacktrace。谢谢;这个stacktrace正是您打开一个空文件时得到的。合并(非空)流对我来说很有效。如果你在评论中提出问题:我建议使用文件,PDFBox会负责关闭它们。对于流,您必须自己关闭它们。@TilmanHausherr我不确定这是由于一个空文件造成的。我想说的是,在我提供的所有代码示例中,文件位置以及我使用的文件都是常量。这是我在所有场景中唯一没有改变的事情。如果您感兴趣,我不介意详细解释为什么会抛出此异常。谢谢大家的支持。“为什么使用流的第一种方法在直接使用文件工作时抛出一个异常,这也是我想知道的。”——如果你不认为你的问题没有被正确地回答,你就应该把你当前的解决方案作为编辑而不是回答。