从PDF复制页面到新文档时调用AddPage()抛出iText异常的问题
解决iText复制PDF页面时AddPage抛出异常的问题
你现在碰到的这个问题我之前也踩过坑——直接把源PDF文档里的PdfPage对象加到新文档里肯定会报错,因为每个PdfPage实例都是和它所属的PdfDocument绑定的,不能直接跨文档复用。
先看看你原来的代码:
using (var writer = new PdfWriter(OutputFile)) { var reader = new PdfReader("Templates//PDF_Template_Empty.pdf"); PdfDocument template = new PdfDocument(reader); var titlepage = template.GetPage(1); using (var pdf = new PdfDocument(writer)) { pdf.AddPage(titlepage); // 抛出异常 } }
抛出的异常提示也很明确:iText.Kernel.PdfException: 'Page iText.Kernel.Pdf.PdfPage cannot be added to...
方法一:使用CopyTo方法复制单页
只需要修改一行代码,把直接添加原页面改成添加原页面的拷贝版本,用PdfPage的CopyTo()方法,把目标文档传进去,就能得到一个属于目标文档的页面实例:
using (var writer = new PdfWriter(OutputFile)) { var reader = new PdfReader("Templates//PDF_Template_Empty.pdf"); using (PdfDocument template = new PdfDocument(reader)) using (var pdf = new PdfDocument(writer)) { var titlepage = template.GetPage(1); // 复制页面到目标文档,再添加 pdf.AddPage(titlepage.CopyTo(pdf)); } }
方法二:使用CopyPagesTo批量拷贝(更适合多页场景)
如果之后需要复制多页,用PdfDocument的CopyPagesTo方法更高效,比如只复制第1页的话可以这么写:
using (var writer = new PdfWriter(OutputFile)) { var reader = new PdfReader("Templates//PDF_Template_Empty.pdf"); using (PdfDocument template = new PdfDocument(reader)) using (var pdf = new PdfDocument(writer)) { // 第一个参数是起始页码,第二个是结束页码,第三个是目标文档 template.CopyPagesTo(1, 1, pdf); } }
简单说下原因:原代码里的titlepage是属于template这个源文档的,当你调用pdf.AddPage(titlepage)时,iText会检测到这个页面不属于当前的pdf文档,所以直接抛出异常阻止这种非法操作。而CopyTo或者CopyPagesTo会创建一个全新的、属于目标文档的页面副本,这样就不会有绑定冲突了。
内容的提问来源于stack exchange,提问作者Сергей
相关产品推荐
相关产品推荐

