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

标签 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);
}

最佳答案

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

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

我编写了一个示例,通过引入 200 个用户单位的边距(这是一个很大的边距)来剪辑 PDF 所有页面的内容。该示例称为 ClipPdf你可以在这里看到一个剪辑页面:hero_clipped.pdf (iText super 英雄在剪裁过程中失去了 ARM 、脚和部分头部。)

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 中解释。 .

关于java - iText - 裁剪出 pdf 文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26773942/

相关文章:

c# - 如何使用 C# 检查 PDF Reader 是否启用?

java - Swing 和 iText 字体渲染之间的差异

java - 访问 arrayList 中的子类变量

java - 带有 TextWatcher 的 EditText 显示有线行为并在递归循环中移动

Java:如何处理 "almost"不可变数据结构?

c# - 如何处理PDF文档?

java - 使用itext库在pdf文档中添加内联图像

java - Java 中是否有与 GetCompressedFileSize 等效的方法?

objective-c - Core Data NSDocument 应用程序 - 打开 PDF,另存为 bundle

pdf - LibreOffice:使用 --convert-to 将 PDF 转换为纯文本