当前位置: 首页 > 知识库问答 >
问题:

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

柴瀚昂
2023-03-14

我在这里和《iText in Action》一书中找到了许多解决方案,可以使用PDFCopy和PDFSmartCopy类合并PDF,但我看到的唯一一个类似问题是,这家伙自己解决了,但没有给出答案。这篇文章使用iTextSharp将现有的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();
        }
    }

它接近于我想要的,但我显然不了解iText的全部工作原理,我想知道这是正确的方法还是有更好的方法来实现它。

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

任何指示将不胜感激。

共有2个答案

海鸣
2023-03-14

对于插入现有的PDF到新页面,我已经改变了订单

PdfImportedPage page2 = writer.GetImportedPage(pdf, 1);
                cb.AddTemplate(page2, 0, 0);
                document.NewPage();
年风华
2023-03-14

只是在答案中增加了一点内容。解决方案最终是通过研究PdfTemboard的哪些方法来找到的,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 );
     }
}
 类似资料:
  • 本文向大家介绍如何在HTML文档中包含Modernizr?,包括了如何在HTML文档中包含Modernizr?的使用技巧和注意事项,需要的朋友参考一下 Modernizr提供了一种检测任何新功能的简便方法,因此您可以采取相应的措施。例如,如果浏览器不支持视频功能,那么您想显示一个简单的页面。 您可以根据功能的可用性创建CSS规则,如果浏览器不支持新功能,这些规则将自动应用于网页。 您可以从Mode

  • 入口一:从本地上传文档到会话窗口,即新建了一份在线文档; 入口二:在桌面端-搜索框旁边的加号,选择新建文档即可; 入口三:桌面端【文档】Tab,选择“个人文件”或“共享文件”,点击新建文档。

  • 我需要创建一个fiRecovery文档,它也有一个集合,理想情况下是在单个写入操作中。 我在文档中没有看到类似的内容,因此,如果失败了,那么关于获取创建的文档id然后将多个文档添加到集合中有什么提示吗? 编辑:我正在用typescript/js开发

  • 我是新来的Spring和MongoDB。所以,听到是我想要理解的用例。 在SpringBoot和MongoDB结构中。我试图在Mongo中插入一个新文档,因此在POJO/Domain/Data类中使用了Java文档。现在,我已经编写了代码并启动了服务器。我的问题是,什么时候在MongoDB中创建集合?例如,当启动服务器时(Spring将扫描所有的类,并在创建类时创建集合id DB),或者当调用存储

  • 我在这里看到了一些关于如何在合流中包含LaTeX的文档,但查看链接的文档,我不清楚我应该期待什么开箱即用,什么需要Atlassian市场的插件。 例如,我想在汇流文档中包含符号sigma(∑)。查看这个链接,我希望创建希腊文大写字母Sigma,但它给了我一个“wiki标记”条目,而不是内联的latex。你知道我做错了什么吗?

  • 我们正在使用cosmosdb记录我们的应用程序日志。我们的日志有两层,一层有一般的信息,另一层有一般日志的更详细的信息。我们还在其他两个集合中记录了这些的副本以供备份。所以我们总共有四个系列。在我们的代码中,我们使用异步CreateDocumentAsync来创建这些日志。我们将任务存储在列表中,并使用Task.waitall来完成所有任务。在开发环境中,我们没有看到任何错误,但在生产中,当创建新