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

iText-如何将页面添加到使用PdfCopy创建的文档中

楮庆
2023-03-14

我正在使用iText(特别是iTextSharp 4.1.6),我想通过组合现有PDF中的页面来创建一个PDF,但也要插入从图像创建的新页面。

我已经分别使用PdfCopy和PdfWriter实现了这两个部分的工作。从图像创建页面的代码如下所示:

PdfWriter pw = PdfWriter.GetInstance(doc, outputStream);
Image img = Image.GetInstance(inputStream);
doc.Add(img);
doc.NewPage();

现在,由于PdfCopy继承自PdfWriter,我想我可以使用相同的技术将这样的“图像页面”添加到我的PdfCopy对象中,但这不起作用(如果在上面的示例中实例化一个PdfCopy而不是PdfWriter,页面上什么也不会出现)。

通过快速查看源代码,我注意到当PdfCopy的contstructor调用超类构造函数时,它使用的是一个新的Document对象,而不是传入的对象,所以我想这就是原因。

有没有更好的办法呢?目前,我的最佳猜测是使用PdfWriter从图像创建一个单页Pdf,然后使用PdfCopy将其添加到文档中,但这似乎有点变通。

共有1个答案

公冶渝
2023-03-14

我最近有这个问题,这里的答案实际上没有那么有用。我的用例基本上是“取一堆PDF和图像(.jpg、.png等)并将它们全部组合成一个PDF”。我不得不使用PdfCopy,因为它保留了表单字段和标签,而PdfWriter没有。

基本上,因为PdfCopy不允许您使用addPage()创建新页面,所以您必须在内存中创建一个新的PDF,其中包含页面上的图像,然后使用PdfCopy从该PDF中复制出该页面。

例如:

    Document pdfDocument = new Document();
    ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream();
    PdfCopy copy = new PdfCopy(pdfDocument, pdfOutputStream);

    pdfDocument.open();

    for (File file : allFiles) {
       if (/* file is PDF */) {
           /* Copy all the pages in the PDF file into the new PDF */
           PdfReader reader = new PdfReader(file.getAllBytes());
           for (int i = 1; i <= reader.getNumberOfPages(); i++) {
              copy.addPage(copy.getImportedPage(reader, i);
           }
       } else {
           /* File is image. Create a new PDF in memory, write the image to its first page, and then use PdfCopy to copy that first page back into the main PDF */
           Document imageDocument = new Document();
           ByteArrayOutputStream imageDocumentOutputStream = new ByteArrayOutputStream();
           PdfWriter imageDocumentWriter = PdfWriter.getInstance(imageDocument, imageDocumentOutputStream);

            imageDocument.open();

            if (imageDocument.newPage()) {

                image = Image.getInstance(file.getAllBytes());

                if (!imageDocument.add(image)) {
                   throw new Exception("Unable to add image to page!");
                }

                imageDocument.close();
                imageDocumentWriter.close();

                PdfReader imageDocumentReader = new PdfReader(imageDocumentOutputStream.toByteArray());

                copy.addPage(copy.getImportedPage(imageDocumentReader, 1));

                imageDocumentReader.close();
         }

     }
 类似资料:
  • 使用iTextSharp,您可以通过将事件附加到PDF来向PDF添加页眉/页脚,如本SO答案中所述:https://stackoverflow.com/a/19004392 我怎样才能用 iText 7 做同样的事情? 这个链接有Java代码示例,但看起来不像它使用的页面事件。

  • 我正在使用iText 5.3.5创建一个pdf文档。现在,我正试图在文档的每一页上得到一个矩形,但我不太确定如何做到这一点。我试着在代码的末尾添加这个(我是在网上找到的): 但这只是在最后一页添加了矩形,这有点意义,因为我没有在任何地方使用pgCnt。我如何指定我想要页号pgCnt上的矩形,以便我可以在每一页上添加矩形? 希望我能解释清楚。提前感谢你的帮助。:)

  • 问题内容: 我需要有关iText的帮助。我需要在其他现有的iText文档或PDF文档中添加现有的pdf封面。有人可以帮助我吗?我已经搜索了一些书籍(iText在使用中),但有些复杂。 问题答案: 假设我们有一个名为pages.pdf的文档,并且我们想添加封面hero.pdf作为本文档的封面。 方法1: 使用 看一下AddCover1示例: 结果是一个文档,在这里您首先有封面,然后是文档的其余部分:

  • 在浏览了几天的网页和帖子之后,我仍然对如何将“csv”文件附件添加到使用Java“iText 5.3.1”创建的PDF文件中感到困惑。 在我继承的Java可执行文件中,创建了多个PDF文件,然后将它们连接到一个PDF文件中。现在,需要将一个“csv”文件附加到这个PDF文档中。在《iText in Action》(清单16.6)一书的第16章中,有一个例子使用PdfileSpecification

  • 我不需要添加书签或其他动态内容,只需要添加一些具有名称的目的地,从而注入一个/Dests集合,该集合具有在生成的PDF中定义的名称。 我使用了iText 5.3.0并且阅读了iText Inaction(第2版)的第7章,但是我仍然不知道如何添加目的地,所以在浏览器中使用#namedest。 我正在用PdfReader和PDFStamper阅读和操作文档。在使用定制的侦听器和PdfContentS