Pdfbox-添加pdf嵌入文件并将PDDocument保存到OutputStream不会保留嵌入文件

Pdfbox-添加pdf嵌入文件并将PDDocument保存到OutputStream不会保留嵌入文件,pdf,attachment,pdfbox,Pdf,Attachment,Pdfbox,我正在使用Pdfbox(1.8.8)向pdf添加附件。我的问题是,当其中一个附件的类型为.pdf,并且我正在将PDDocument保存到OutputStream时,最终的pdf文档不包含附件。如果将PDDocument保存到文件,而不是OutputStream,则所有工作正常;如果附件不包含任何pdf,则保存到文件或OutputStream都可以正常工作 我想知道是否有任何方法可以添加pdf嵌入文件并将PDDocument保存到OutputStream,将附加文件保存在生成的最终pdf中 我使用

我正在使用Pdfbox(1.8.8)向pdf添加附件。我的问题是,当其中一个附件的类型为.pdf,并且我正在将PDDocument保存到OutputStream时,最终的pdf文档不包含附件。如果将PDDocument保存到文件,而不是OutputStream,则所有工作正常;如果附件不包含任何pdf,则保存到文件或OutputStream都可以正常工作

我想知道是否有任何方法可以添加pdf嵌入文件并将PDDocument保存到OutputStream,将附加文件保存在生成的最终pdf中

我使用的代码是:

private void insertAttachments(输出流输出、ArrayList附件资源){
最终文件;
布尔hasPdfAttach=false;
试一试{
doc=PDDocument.load(新的ByteArrayInputStream(((ByteArrayOutputStream)out).toByteArray());
//最终PDFTextStripper pdfStripper=新PDFTextStripper();
//最终字符串text=pdfStripper.getText(doc);
final PDEmbeddedFileNameTreeNode efTree=新PDEmbeddedFileNameTreeNode();
final Map embeddedFileMap=新HashMap();
PDEmbeddedFile embeddedFile;
File=null;
用于(附件:附件资源){
//首先创建文件规范,它保存嵌入的文件
final PDComplexFileSpecification fileSpecification=新的PDComplexFileSpecification();
fileSpecification.setFile(attach.getFilename());
file=AttachmentUtils.getAttachmentFile(attach);
最终InputStream为=新文件InputStream(file.getAbsolutePath());
embeddedFile=新PDEmbeddedFile(文档,is);
//设置嵌入文件的某些属性
if(“application/pdf”.equals(attach.getMimetype())){
hasPdfAttach=true;
}
embeddedFile.setSubtype(attach.getMimetype());
embeddedFile.setSize((int)(long)attach.getFilesize());
setEmbeddedFile(embeddedFile);
//现在,将条目添加到嵌入式文件树并在文档中设置。
embeddedFileMap.put(attach.getFilename(),fileSpecification);
//最终字符串text2=pdfStripper.getText(doc);
}
//最终字符串text3=pdfStripper.getText(doc);
setNames(embeddedFileMap);
//((COSDictionary)efTree.getCOSObject()).removeItem(COSName.LIMITS);(这对我不起作用)
//附件作为“名称”字典的一部分存储在文档目录中
最终PDDocumentNameDictionary名称=新的PDDocumentNameDictionary(doc.getDocumentCatalog());
name.setEmbeddedFiles(efTree);
doc.getDocumentCatalog().setNames(名称);
//final ByteArrayOutputStream pdfboxToDocumentStream=新ByteArrayOutputStream();
最终字符串tmpfile=“temporary.pdf”;
if(hasPdfAttach){
最终文件f=新文件(tmpfile);
保存文件(f);
doc.close();
//我尝试过解析器,但也没有成功
//PDFParser parser=newpdfparser(newfileinputstream(tmpfile));
//parser.parse();
//PDDocument doc2=parser.getPDDocument();
final PDDocument doc2=PDDocument.loadNonSeq(f,新的随机访问文件
+"temppp.pdf","r",;
doc2.保存(输出);
doc2.close();
}否则{
单据保存(出);
doc.close();
}
//那也不行
//final InputStream in=新文件InputStream(tmpfile);
//IOUtils.copy(输入、输出);
//out=新文件输出流(tmpFile);
//doc.save(out);
}捕获(IOE1异常){
e1.printStackTrace();
}捕获(异常e2){
e2.printStackTrace();
}
}
致意

解决方案:

private void insertAttachments(输出流输出、ArrayList附件资源){
最终文件;
试一试{
doc=PDDocument.load(新的ByteArrayInputStream(((ByteArrayOutputStream)out).toByteArray());
((ByteArrayOutputStream)out).reset();
final PDEmbeddedFileNameTreeNode efTree=新PDEmbeddedFileNameTreeNode();
final Map embeddedFileMap=新HashMap();
PDEmbeddedFile embeddedFile;
File=null;
用于(附件:附件资源){
//首先创建文件规范,它保存嵌入的文件
final PDComplexFileSpecification fileSpecification=新的PDComplexFileSpecification();
fileSpecification.setFile(attach.getFilename());
file=AttachmentUtils.getAttachmentFile(attach);
最终InputStream为=新文件InputStream(file.getAbsolutePath());
embeddedFile=新PDEmbeddedFile(文档,is);
//设置嵌入文件的某些属性
embeddedFile.setSubtype(attach.getMimetype());
embeddedFile.setSize((int)(long)attach.getFilesize());
setEmbeddedFile(embeddedFile);
//现在,将条目添加到嵌入式文件树并在文档中设置。
embeddedFileMap.put(attach.getFilename(),fileSpecification);
}
setNames(embeddedFileMap);
((公司)
private void insertAttachments(OutputStream out, ArrayList<Attachment> attachmentsResources) {
    ...
            doc = PDDocument.load(new ByteArrayInputStream(((ByteArrayOutputStream) out).toByteArray()));
    ...
                doc2.save(out);
    ...
                doc.save(out);
((ByteArrayOutputStream) out).reset();
out = new ByteArrayOutputStream();
doc = PDDocument.load(new ByteArrayInputStream(((ByteArrayOutputStream) out).toByteArray()));
@Test
public void test() throws IOException, COSVisitorException
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (
            InputStream sourceStream = getClass().getResourceAsStream("test.pdf");
            InputStream attachStream = getClass().getResourceAsStream("artificial text.pdf"))
    {
        final PDDocument document = PDDocument.load(sourceStream);

        final PDEmbeddedFile embeddedFile = new PDEmbeddedFile(document, attachStream);
        embeddedFile.setSubtype("application/pdf");
        embeddedFile.setSize(10993);

        final PDComplexFileSpecification fileSpecification = new PDComplexFileSpecification();
        fileSpecification.setFile("artificial text.pdf");
        fileSpecification.setEmbeddedFile(embeddedFile);

        final Map<String, PDComplexFileSpecification> embeddedFileMap = new HashMap<String, PDComplexFileSpecification>();
        embeddedFileMap.put("artificial text.pdf", fileSpecification);

        final PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode();
        efTree.setNames(embeddedFileMap);

        final PDDocumentNameDictionary names = new PDDocumentNameDictionary(document.getDocumentCatalog());
        names.setEmbeddedFiles(efTree);
        document.getDocumentCatalog().setNames(names);

        document.save(baos);
        document.close();
    }
    Files.write(Paths.get("attachment.pdf"), baos.toByteArray());
}