2014-03-27 39 views
2

我在这里和'iText in Action'一书中发现了许多解决方案,使用PDFCopy和PDFSmartCopy类合并PDF,但唯一类似的问题问我见过,这个人自己解决了这个问题,但没有提供答案。这篇文章Add an existing PDF from file to an unwritten document using iTextSharp问最后一个问题,所以他们建议关闭现有的文档,然后使用PDFCopy,在这里我想插入任何地方。所以在这里。在iTextSharp中,如何在创建新文档时包含现有的PDF

我使用普通的章节,短语,文档和PDFWriter类创建一个带有文本和图像的iTextSharp文档。这是多年来编写的代码,并且工作正常。现在我们需要在创建这个文档时插入一个现有的PDF,如果这是不可能的,那么这个文档就是一个新的章节或章节。我将PDF作为Byte数组,因此在获取PDFReader时没有问题。但是,我无法知道如何阅读该PDF并在我所处的位置将其插入到现有文档中。如果需要,我可以访问PDFWriter,但对于文档的其余部分,所有访问均通过Sections进行。这是我已经得到的,如果需要的话,我可以添加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奇迹的全部运作,如果这是正确的做法或有更好的方法来做到这一点。

如果有任何其他信息可以提供,请告诉我。

任何指针,将不胜感激。

+0

您是在谈论从现有PDF中引入_content_还是引入_pages_。 PDFs没有“短语”或“段落”,尽管“章节”和“章节”是标记内容的方式,除非实际生成真实的标记pdf,否则这些信息在写出时会丢失。 iTextSharp最大的优势之一就是尽可能长时间隐藏/抽象PDF的内部。唯一既存在抽象又存在PDF对象的是“页面”,这就是为什么大多数代码都建议导入整个页面的原因。 –

+0

我只是试图将现有PDF'按原样'复制为正在创建的文档中的新页面。正如您声明的,我认为该章节或章节不可用,因为它是用于创建新内容的。我可以理解如何通过复制两者的整个Stream来在开始或结束时添加一个,但在中间插入会让我难住。我可以访问PDFWriter,我相信这是我需要的,但我不明白如何将内容添加到该文件中,而不会丢失在文档中构建的PDF。感谢您的评论。 – Graybo

+0

我取得了一些进展,所以修改了这个问题。 – Graybo

回答

4

只需在答案中增加一点肉就可以了。通过研究哪些方法与PdfTemplate一起工作,这是PdfImportedPage的派生方法,最终找到了解决方案。我已经添加了一些以显示它与正在构建的文档的其余部分之间的交互。我希望这可以帮助别人。

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); 
    } 
} 
+0

令人敬畏的答案,避免使用PdfCopy和文件合并。如果有人对“计划者”感到困惑,那么实际上应该是“读者”。 – Tronald

相关问题