我有一个小问题,我正在努力寻找解决方案。
长话短说,我必须用 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
运算符开始一条新路径。它丢弃了我们到目前为止构建的路径。在这种情况下,它会阻止我们绘制的矩形(以及我们用作剪切路径的矩形)实际绘制。
q
和 Q
运算符保存和恢复图形状态堆栈,但这是很明显的。
所有这些都在 ISO-32000-1(如果你谷歌好的话可以在线获取)和书 The ABC of PDF 中解释。 .
关于java - iText - 裁剪出 pdf 文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26773942/