在iTextSharp中,如何在创建新文档时包含现有PDF

在iTextSharp中,如何在创建新文档时包含现有PDF,pdf,pdf-generation,itextsharp,Pdf,Pdf Generation,Itextsharp,我在这里和《iText in Action》一书中找到了许多解决方案,使用PDFCopy和PDFSmartCopy类合并PDF,但我看到的唯一一个类似的问题是,这家伙自己解决了,但没有给出答案。这篇文章问了同样的问题,但它在最后,所以他们建议关闭现有的文档,然后使用PDFCopy,在这里我想把它插入任何地方。这就来了 我正在使用普通部分、短语、文档和PDFWriter类创建一个包含文本和图像的iTextSharp文档。这是多年来编写的代码,运行良好。现在,我们需要插入一个现有的PDF文件,同时创

我在这里和《iText in Action》一书中找到了许多解决方案,使用PDFCopy和PDFSmartCopy类合并PDF,但我看到的唯一一个类似的问题是,这家伙自己解决了,但没有给出答案。这篇文章问了同样的问题,但它在最后,所以他们建议关闭现有的文档,然后使用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();
        }
    }
内部静态void InsertPDF(第节,字节[]pdf)
{
这个.document.NewPage();
PdfReader PdfReader=新PdfReader(pdf);
Int32 pages=pdfreader.NumberOfPages;

对于(Int32 page=1;page只需在答案中添加一点内容。解决方案最终是通过研究PdfTemplate的方法找到的,而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 );
     }
}
内部静态void InsertPDF(PdfWriter编写器,文档,节,字节[]pdf)
{
段落段落=新段落();
//添加注释以显示空白页是有意的
添加(新短语(“PDF在下一页后面。”,);
第.节添加(第6段);
//需要更新文档以便呈现此页面。
文件。添加(第节);
PdfReader reader=新PdfReader(pdf);
PdfContentByte pcb=writer.DirectContentUnder;
Int32 pages=planreader.NumberOfPages;

对于(Int32 pagenum=1;pagenum只是在答案中添加了更多的内容。解决方案是通过研究PdfTemplate的方法找到的,而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 );
     }
}
内部静态void InsertPDF(PdfWriter编写器,文档,节,字节[]pdf)
{
段落段落=新段落();
//添加注释以显示空白页是有意的
添加(新短语(“PDF在下一页后面。”,);
第.节添加(第6段);
//需要更新文档以便呈现此页面。
文件。添加(第节);
PdfReader reader=新PdfReader(pdf);
PdfContentByte pcb=writer.DirectContentUnder;
Int32 pages=planreader.NumberOfPages;

对于(Int32 pagenum=1;pagenum,对于将现有pdf插入新页面,我已更改订单newpage

PdfImportedPage page2 = writer.GetImportedPage(pdf, 1);
                cb.AddTemplate(page2, 0, 0);
                document.NewPage();

对于将现有pdf插入新页面,我已更改订单newpage

PdfImportedPage page2 = writer.GetImportedPage(pdf, 1);
                cb.AddTemplate(page2, 0, 0);
                document.NewPage();

你说的是从现有的PDF中引入内容还是引入页面。PDF没有“短语”或“段落”,虽然有“章节”和“章节”是标记内容的方法,除非您实际生成的是真正的标记pdf,否则这些信息在写出时会丢失。iTextSharp最大的优势之一是它尽可能长时间地隐藏/抽象pdf的内部内容。作为抽象和pdf对象存在的唯一东西是“页面”这就是为什么大多数代码都建议导入一个完整的页面。我只是尝试将现有的PDF“原样”复制为我正在创建的文档中的新页面。正如您所说,我不认为该部分或章节可用于创建新内容。我可以理解如何通过复制整个内容在开始或结束时添加一个我认为我需要的是PDFWORD,但我不知道如何将内容添加到文档中,而不会丢失我在文档中建立的PDF。谢谢评论。我做了一些改进,修改了这个问题。问题是什么?好像你已经成功了。完全插入了现有的PDF。您现在是说希望插入的页面出现在大纲树中吗?我想知道这是正确的方法还是有更好的方法。-如果您真的想将其他PDF集成到新的PDF中,使用
PdfWriter
方法
GetImportedPage
可以。对于一般合并
PdfCopy
应该改为使用。它已经接近我想要的了——因为它只是接近了,我认为它并不完全是你想要的。因此,缺少什么?你是说从现有PDF引入内容还是引入页面。PDF没有“短语”或“段落”,尽管有“部分”和“章节”是标记内容的方法,除非您实际生成的是真正的标记pdf,否则这些信息在写出时会丢失。iTextSharp最大的优势之一是它尽可能长时间地隐藏/抽象pdf的内部内容。作为抽象和pdf对象存在的唯一东西是“页面”这就是为什么大多数代码都建议导入一个完整的页面。我只是尝试将现有的PDF“原样”复制为我正在创建的文档中的新页面。正如您所说,我不认为该部分或章节可用于创建新内容。我可以理解如何通过复制整个内容在开始或结束时添加一个两者都是,但在中间插入让我难堪。