iText - 裁剪出 pdf 文件的一部分

Posted

技术标签:

【中文标题】iText - 裁剪出 pdf 文件的一部分【英文标题】:iText - crop out a part of pdf file 【发布时间】:2014-11-06 07:28:39 【问题描述】:

我有一个小问题,我正在努力寻找解决方案。 长话短说,我必须从带有 itext 的 pdf 中删除每一页的顶部。我设法用CROPBOX 做到了这一点,但问题是这会通过移除顶部而使页面变小。

有人可以帮我实现这一点,以使页面大小保持不变。我的想法是用白色矩形覆盖首页,但经过多次尝试,我没有设法做到这一点。

这是我用来裁剪页面的当前代码。

PdfRectangle rect = new PdfRectangle(55, 0, 1000, 1000);
PdfDictionary pageDict;
for (int curentPage = 2; curentPage <= pdfReader.getNumberOfPages(); curentPage++) 
    pageDict = pdfReader.getPageN(curentPage);
    pageDict.put(PdfName.CROPBOX, rect);

【问题讨论】:

【参考方案1】:

在您的代码示例中,您正在裁剪页面。这会减小页面的可见尺寸。

根据您的描述,您不需要裁剪。相反,您需要剪辑

我编写了一个示例,通过引入 200 个用户单位的边距(这是一个相当大的边距)来剪辑 PDF 的所有页面的内容。该示例名为ClipPdf,您可以在此处看到一个剪辑页面:hero_clipped.pdf(iText 超级英雄在剪辑过程中失去了手臂、脚和部分头部。)

public void manipulatePdf(String src, String dest) throws IOException, DocumentException 
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    int n = reader.getNumberOfPages();
    PdfDictionary page;
    PdfArray media;
    for (int p = 1; p <= n; p++) 
        page = reader.getPageN(p);
        media = page.getAsArray(PdfName.CROPBOX);
        if (media == null) 
            media = page.getAsArray(PdfName.MEDIABOX);
        
        float llx = media.getAsNumber(0).floatValue() + 200;
        float lly = media.getAsNumber(1).floatValue() + 200;
        float w = media.getAsNumber(2).floatValue() - media.getAsNumber(0).floatValue() - 400;
        float h = media.getAsNumber(3).floatValue() - media.getAsNumber(1).floatValue() - 400;
        String command = String.format(
                "\nq %.2f %.2f %.2f %.2f re W n\nq\n",
                llx, lly, w, h);
        stamper.getUnderContent(p).setLiteral(command);
        stamper.getOverContent(p).setLiteral("\nQ\nQ\n");
    
    stamper.close();
    reader.close();

显然,您需要在使用之前研究此代码。一旦你理解了这段代码,你就会知道这段代码只适用于没有旋转的页面。如果您很好地理解了代码,那么将示例改编为旋转页面应该没有问题。

更新

re 运算符构造一个矩形。它需要四个参数(运算符前面的值)来定义一个矩形:左下角的 x 坐标、左下角的 y 坐标、宽度和高度。

W 运算符设置剪切路径。我们刚刚画了一个矩形;该矩形将用于剪切后面的内容。

n 运算符开始一条新路径。它丢弃了我们迄今为止构建的路径。在这种情况下,它可以防止我们绘制的矩形(以及我们用作剪切路径)被实际绘制。

qQ 运算符保存和恢复图形状态堆栈,但这很明显。

所有这一切都在 ISO-32000-1(如果你谷歌很好,可以在线获得)和书 The ABC of PDF 中进行了解释。

【讨论】:

String.format("\nq %.2f %.2f %.2f %.2f re W n\nq\n", llx, lly, w, h) - format 重载使用小数点(点或逗号)的默认区域设置,因此在某些地区可能会产生不良影响。您可能希望使用接受语言环境的format 重载并使用例如美国地区。 @BrunoLowagie 我尝试搜索但我找不到,能否请您链接我一些有关如何理解命令及其含义的文档? pdf内容被旋转,我认为它与命令有关

以上是关于iText - 裁剪出 pdf 文件的一部分的主要内容,如果未能解决你的问题,请参考以下文章

pdf文件中截取eps图片并压缩

word和.txt文件转html 及pdf文件, 使用poi jsoup itext心得

iText 使用相同的代码生成不同的 pdf

使用 iText 将字体嵌入 PDF 文件

我们可以使用 iText 压缩 PDF 文件的大小吗?

iText - 将内容添加到现有的 PDF 文件