我遇到了一个小问题,我试了一段时间才找到解决方案。
长话短说我必须从带有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);
}
答案 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
运算符启动新路径。它丢弃了我们迄今为止构建的路径。在这种情况下,它可以防止我们绘制的矩形(以及我们用作剪切路径)实际绘制。
q
和Q
运算符可以保存和恢复图形状态堆栈,但这很明显。
所有这一切都在ISO-32000-1(如果你谷歌好在线提供)和书籍The ABC of PDF中解释。