当前位置: 首页 > 知识库问答 >
问题:

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

全兴运
2023-03-14

我有一个小问题,我正在努力寻找一个解决办法。长话短说,我必须用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个答案

杨波娃
2023-03-14

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

根据您的描述,您不希望进行裁剪。相反,你需要剪辑。

我写了一个示例,通过引入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();
}

显然,您需要在使用这段代码之前研究它。一旦你理解了这段代码,你就会知道这段代码只适用于没有旋转的页面。如果您对代码理解得很好,那么将示例用于旋转页面应该没有问题。

使现代化

rehtml" target="_blank">操作符构造一个矩形。它采用四个参数(运算符前面的值)定义矩形:左下角的x坐标、左下角的y坐标、宽度和高度。

W运算符设置剪辑路径。我们刚刚绘制了一个矩形;这个矩形将用于剪辑下面的内容。

n运算符启动新路径。它丢弃了我们迄今为止构建的路径。在这种情况下,它会防止我们绘制的矩形(以及我们用作裁剪路径的矩形)实际绘制。

qQ运算符保存和恢复图形状态堆栈,但这相当明显。

所有这些都在ISO-32000-1(如果你搜索得好,可以在线获得)和《PDF的ABC》一书中进行了解释。

 类似资料:
  • 我想使用iTextSharp和rectangle(0,100,600,155)裁剪PDF文件。一切都很好,当你打开创建的*.pdf文件时,你只能看到裁剪的内容,但是!如果你解析那个pdf,仍然有信息和文本来自不可见的文档部分,我不能接受。如何完全删除该数据? 不幸的是,如果我想在不支付许可证的情况下将我的应用程序商业化,我就不能使用这些代码,所以我不得不考虑不同的库...

  • 我试图在一个PDF文件,其中有一个矢量图形的中心,但它有文字和其他标志周围的页面,我不需要。我只需要提取文件的向量部分,到目前为止,我所能做的就是创建一个CropBox,然后将CropBox转换为位图。 这导致只提取页面中心的图形,但缺点是它是位图。一旦我使用cropbox创建了PDF,如果我在窗口中打开它,它显示了我所需要的,但是当我将其导入CorelDraw或Adobe Illustrator

  • 问题内容: 使用’numpy’或’scipy’(我没有使用’OpenCV’)我试图裁剪一个 图像中的区域。 有没有类似于“cropPolygon(image,vertices=[(1,2),(3,4)…])”的东西 还是SciPy`? 问题答案: 你在用matplotlib吗?我以前采用的一种方法是使用方法 的构造一个布尔掩码,然后 用于索引到图像数组中。 例如: Plotting:

  • 我试图在从图库中选择图像后使用intent来裁剪图像。以下是我的代码片段 在这里,我使用PICK_IMAGE_REQUEST意图句柄调用上面的代码段 由于我在裁剪后使用了相同的意图,即PICK_IMAGE_REQUEST,可能会出现什么问题

  • 我已经编写了执行以下操作的代码: 以特定页面大小(例如8.5英寸x 11英寸)的PDF为例 为此,我使用方法从原始PDF获取当前页面,然后使用方法将原始页面放置到新PDF的当前页面上。 我的新挑战是,在将原始PDF添加到新PDF之前,我需要裁剪它。例如,假设我想在强制使用之前将原始PDF裁剪2英寸。输入PDF仍然是8.5英寸x11英寸,新PDF仍然是17英寸x11英寸,但新PDF中原始PDF的两个

  • 问题内容: 假设我有一些宽度x和高度y的图像。我必须将图像的中心部分裁剪为宽裁剪和高裁剪。假设cropx和cropty是正非零整数,并且小于各自的图像大小。对输出图像应用切片的最佳方法是什么? 问题答案: 遵循这些原则- 样品运行-