当前位置: 首页 > 面试题库 >

使用iText合并不同宽度的pdf文档

刘畅
2023-03-14
问题内容

使用iText合并不同宽度的文档时出现问题。

下面是我用来合并的代码。

        public static void doMerge(List<InputStream> list, OutputStream outputStream) throws Exception {

            Rectangle pagesize = new Rectangle(1700f, 20f);


            com.itextpdf.text.Document document = new com.itextpdf.text.Document(pagesize);

            PdfWriter writer = PdfWriter.getInstance(document, outputStream);
            document.open();
            document.setPageSize(pagesize);
            com.itextpdf.text.pdf.PdfContentByte cb = writer.getDirectContent();

            for (InputStream in : list){
                PdfReader reader = new PdfReader(in);
                for (int i = 1; i <= reader.getNumberOfPages(); i++){
                    document.newPage();
                    //import the page from source pdf
                    com.itextpdf.text.pdf.PdfImportedPage page = writer.getImportedPage(reader, i);

                    //calculate the y for merging it from top
                    float y = document.getPageSize().getHeight() - page.getHeight();
                    //add the page to the destination pdf

                    cb.addTemplate(page, 0, y);

                }
                reader.close();
                in.close();
            }

            outputStream.flush();
            document.close();
            outputStream.close();
        }

pdf的首页宽度为14英寸,高度为13英寸。文档上的所有其他页面将始终小于该页面。

我想将所有文档全部合并到一个文档中。

我不知道如何设置单个合并文档的宽度和高度。

我认为Rectangle pagesize = new Rectangle(1700f, 20f);应该这样做,但是如果将其更改为Rectangle pagesize = new Rectangle(1700f, 200f);,文档无效将不起作用。

请进一步指导我。


问题答案:

使用PdfWriter类合并文档违反了 官方 文档中的所有建议,尽管有一些 非正式的
示例可能会诱使您编写不良代码。我希望您了解,我发现这些不好的例子比您更讨厌。

请看本书第6章中的表6.1
。它为您提供了显示何时使用哪个类的概述。在这种情况下,您应该使用PdfCopy

String[] files = { MovieLinks1.RESULT, MovieHistory.RESULT };
// step 1
Document document = new Document();
// step 2
PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT));
// step 3
document.open();
// step 4
PdfReader reader;
int n;
// loop over the documents you want to concatenate
for (int i = 0; i < files.length; i++) {
    reader = new PdfReader(files[i]);
    // loop over the pages in that document
    n = reader.getNumberOfPages();
    for (int page = 0; page < n; ) {
        copy.addPage(copy.getImportedPage(reader, ++page));
    }
    copy.freeReader(reader);
    reader.close();
}
// step 5
document.close();

如果您使用的是iText的最新版本,则甚至可以使用此addDocument()方法,而无需遍历所有页面。如果涉及表格,则还需要特别小心。有许多示例在Sandbox中展示了新功能(从本书编写之后开始)。



 类似资料:
  • 我正在使用旧版本的iText(2.1.7)来合并PDF。因为这是MPL的最后一个版本。我无法改变这一点。 不管怎样。我正在尝试合并多个PDF。一切似乎都正常工作,但当我翻阅大约1500页时,生成的PDF无法打开(表现得好像它被破坏了一样)

  • 我正在尝试将多个pdf页面合并为一个pdf页面。有很多iText的例子展示了如何将pdf页面合并到一个文件中,但是我需要所有的页面都放在一个页面中(一路上缩小它们的宽度和高度) 编辑:尝试从这里这个代码,但它只是合并成一个文件的pdf页面,我需要他们收缩成一个单一的页面

  • 我想把几个PDF文档合并成一个。源文件可以由我创建的PDF文件和其他组织创建的PDF文件组成。我无法控制附加到非我创建的文档的权限。其中一些文档(不是我创建的)可能设置了权限。如果文档需要密码才能打开它,我不会尝试合并它。 我正在使用iText 5.5.1(我认为这是最新的)创建一个PDFCopy对象,以包含结果文档和循环中每个源PDF的阅读器(我正在传递一个要合并的文档列表)。我检查每个文档的页

  • 问题内容: 如何使用iText将书签添加到现有PDF? 我将多个PDF合并为一个PDF,并且需要为最终PDF构建书签。例如,我有三个PDF:doc1.pdf,doc2.pdf和doc3.pdf,doc1和doc2属于Group1,doc3属于Group2。我需要合并它们,并且必须为生成的PDF构建嵌套书签,如下所示: 等等 问题答案: 我已经制作了一个MergeWithOutlines示例,该示例

  • 我有一个使用Imagick PHP的PDF文件的缩略图创建脚本。 它将创建PDF文件第一页的缩略图。 我能够生产的缩略图没有任何问题与固定的高度和宽度 我必须得到PDF文件第一页的高度和宽度,并相应地计算缩略图的高度和宽度。 如果我必须从一个图像创建缩略图,我可以使用PHP中的getimagesize函数,但是有没有像那样的函数来获取PDF文件第一页的高度和宽度呢?

  • 问题内容: 我正在使用iText 通过使用PDFCopy合并多个PDF 来创建 单个PDF 。我需要在本文档的开头创建一个 目录 (不是书签),并带有指向每个源PDF的第一页的可单击链接。 合并PDF的代码 问题答案: 您在要求一些琐碎的事情,但事实并非如此。请看一下MergeWithToc示例。您会看到合并PDF的代码是正确的,但是在我的示例中,我添加了一个额外的功能: 对于每个首页,我都将一个