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

时间:2014-11-06 07:28:39

标签: java pdf itext crop

我遇到了一个小问题,我试了一段时间才找到解决方案。 长话短说我必须从带有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 个答案:

答案 0 :(得分:0)

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

根据您的说明,您不希望裁剪。相反,你想要剪切

我写了一个例子,通过引入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中解释。