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
运算符开始一条新路径。它丢弃了我们迄今为止构建的路径。在这种情况下,它可以防止我们绘制的矩形(以及我们用作剪切路径)被实际绘制。
q
和 Q
运算符保存和恢复图形状态堆栈,但这很明显。
所有这一切都在 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 文件的一部分的主要内容,如果未能解决你的问题,请参考以下文章