在iTextSharp中,如何在创建新文档时包含现有PDF [英] In iTextSharp, how to include an existing PDF while creating a new document
问题描述
我在这里和"iText in Action"一书中找到了许多使用PDFCopy和PDFSmartCopy类合并PDF的解决方案,但我见过的唯一一个类似的问题是,这个人自己算出了答案,但没有发布答案。这个帖子Add an existing PDF from file to an unwritten document using iTextSharp问了同样的问题,但是已经结束了,所以他们建议关闭现有的文档,然后使用PDFCopy,这里我想把它插入到任何地方。那就这样吧。
我正在使用普通的节、短语、文档和PDFWriter类创建一个iTextSharp文档,其中包含文本和图像。这是多年编写的代码,运行良好。现在,我们需要在将此文档创建为新章节或章节时插入现有PDF(如果这是不可能的)。我有一个字节数组形式的PDF,所以获取PDFReader没有问题。但是,我不知道如何阅读PDF并将其插入到我所处位置现有文档中。如果需要,我可以访问PDFWriter,但对于文档的睡觉,所有访问都是通过节进行的。这就是我得到的最多信息,如果需要,我可以将PDFWriter添加为另一个参数。
自从最初的帖子以来,我取得了一些进展,并相应地修改了代码。
internal static void InsertPDF( Section section, Byte[] pdf )
{
this.document.NewPage();
PdfReader pdfreader = new PdfReader( pdf );
Int32 pages = pdfreader.NumberOfPages;
for ( Int32 page = 1; page <= pages; page++ )
{
PdfImportedPage page = this.writer.GetImportedPage( planreader, pagenum );
PdfContentByte pcb = this.writer.DirectContentUnder;
pcb.AddTemplate( page, 0, 0 );
this.document.NewPage();
}
}
它几乎是在做我想做的事情,但是我显然不了解iText的全部工作原理,我想知道这是不是正确的方法,或者有更好的方法来做这件事。
如果我可以提供任何其他信息,请告诉我。
任何指针都将不胜感激。
推荐答案
只是在答案中多加了一点肉。通过研究使用PdfTemplate的方法,最终找到了解决方案,而PdfImportdPage就是从该模板派生出来的。我添加了更多内容,以显示它如何与正在构建的文档的睡觉交互。我希望这对其他人有帮助。
internal static void InsertPDF( PdfWriter writer, Document document, Section section, Byte[] pdf )
{
Paragraph para = new Paragraph();
// Add note to show blank page is intentional
para.Add( new Phrase( "PDF follows on the next page.", <your font> ) );
section.Add( para );
// Need to update the document so we render this page.
document.Add( section );
PdfReader reader = new PdfReader( pdf );
PdfContentByte pcb = writer.DirectContentUnder;
Int32 pages = planreader.NumberOfPages;
for ( Int32 pagenum = 1; pagenum <= pages; pagenum++ )
{
document.NewPage();
PdfImportedPage page = writer.GetImportedPage( reader, pagenum );
// Render their page in our document.
pcb.AddTemplate( page, 0, 0 );
}
}
这篇关于在iTextSharp中,如何在创建新文档时包含现有PDF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!