Java 将现有PDF文档添加到打开的文档

Java 将现有PDF文档添加到打开的文档,java,pdf,itext,Java,Pdf,Itext,使用iText 5.5.5。 我有一个通过PdfWriter实例打开的com.itextpdf.text.Document。在构建文档的不同阶段,我需要添加静态PDF页面。静态页面以字节[]的形式出现 在遵循各种示例之后,我无法将它们的示例与我的用例相匹配。代码如下: Document trunk = new Document(); PdfWriter writer = PdfWriter.getInstance(trunk, getTrunkStream()); writer.setPageE

使用iText 5.5.5。 我有一个通过
PdfWriter
实例打开的
com.itextpdf.text.Document
。在构建文档的不同阶段,我需要添加静态PDF页面。静态页面以
字节[]
的形式出现

在遵循各种示例之后,我无法将它们的示例与我的用例相匹配。代码如下:

Document trunk = new Document();
PdfWriter writer = PdfWriter.getInstance(trunk, getTrunkStream());
writer.setPageEvent(geTrunkPageEvent());
trunk.open();

....

PdfReader reader = new PdfReader(bytes);
// graft == my static content
Document graft = new Document(reader.getPageSizeWithRotation(1));
PdfCopy copy = new PdfCopy(graft, getTrunkStream());
graft.open();

int count = reader.getNumberOfPages();
for(int page = 0; page < count;) {
    copy.addPage(copy.getImportedPage(reader, ++page));
}

copy.freeReader(reader);
reader.close();
documenttrunk=新文档();
PdfWriter writer=PdfWriter.getInstance(trunk,getTrunkStream());
setPageEvent(geTrunkPageEvent());
trunk.open();
....
PdfReader reader=新PdfReader(字节);
//graft==我的静态内容
文档移植=新文档(reader.getPageSizeWithRotation(1));
PdfCopy copy=新的PdfCopy(graft,getTrunkStream());
移植物开放();
int count=reader.getNumberOfPages();
对于(int page=0;page

代码编译和运行时没有错误。但是移植页面无法与主干页面一起显示。

阅读此问题的答案 , 有关详细说明,请参见

使用
PdfContentByte
保存要添加的PDF内容

 PdfContentByte cb = writer.getDirectContent(); 
使用
getImportedPage()
为要从其他文档导入的每个页面创建
PDFIImportedPage
页面对象,并使用
addTemplate()
将页面添加到
writer

确保关闭
文档
PDF阅读器


注意:如果只想合并一组文件,请不要使用此代码段。你不应该这样做的原因在问题的答案中解释了

你下载了免费电子书吗?它包含了这个问题的答案。在代码中,您使用了两次
getTrunkStream()
:一次使用
PdfWriter
从头开始创建文档,一次使用
PdfCopy
组合现有文档。这违背了所有的逻辑。你没读过吗?为什么要支持这个问题?因为我是iText的赞助人。你去过硅谷吗?然后你就会知道SFO机场位于一个叫圣布鲁诺的地方:我明天将飞往圣何塞参加PDF的ISO会议。飞机起飞前我总是很紧张。当我降落在以圣布鲁诺命名的城市时,我会很高兴,尤其是当你飞那么远的时候。我已经更新了你的答案,因为它很容易被误解为一种合并文档的方式。导入页面时,了解问题答案中解释的注意事项非常重要,该问题被选为其中一个问题。有了这些变化,答案值得投票表决;-)@BrunoLowagie,我从未遇到过页面方向不同的情况,因此没有意识到这个问题。对于正确指出问题的答案,这是理所当然的!这个解决方案对我有效。尽管我必须确保并关闭我的主干的页面事件,并在重新打开之前调用一个新页面,因为我想保留检索到的内容。谢谢各位。
trunk.newPage();
page = writer.getImportedPage(pdfReader, pagenumber);
cb.addTemplate(page, 0, 0);