【问题标题】:Extract area from pdf从pdf中提取区域
【发布时间】:2013-04-01 07:27:49
【问题描述】:

我想从 pdf 页面中提取由 x-y 坐标给出的区域。提取的区域可以存储为新pdf文档中的页面。这需要多次执行,因此我希望对过程进行脚本化。是否有任何工具/库可以帮助做到这一点?

【问题讨论】:

  • 免费提供(一些受 AGPL 约束,一些受 LGPL 约束)工具(实际上是 Java 库)我只知道如何使现有页面成为不可见的 PDF XObject,其中某些部分(由坐标给出和大小)可以显示在新的 PDF 页面上。但是,这意味着整个原始页面都存在于生成的 PDF 中,并且(即使不可见)可以被熟悉 PDF 文件的人访问。这样的方法对你有用吗?
  • 当然,我认为您应该发布您的答案。我得到的答案也可能会保留所有内容。

标签: pdf


【解决方案1】:

如果 iText(用于 Java)或 iText(Sharp)(用于 .Net)对您来说是可接受的库,您可以使用它们从某个 PDF 导入现有页面作为模板,其中的部分可以在另一个 PDF 中显示。

查看来自chapter 6iText in Action — 2nd Edition 的示例TilingHero.java / TilingHero.cs。中心代码是:

PdfImportedPage page = writer.getImportedPage(reader, 1);
// adding the same page 16 times with a different offset
float x, y;
for (int i = 0; i < 16; i++) {
    x = -pagesize.getWidth() * (i % 4);
    y = pagesize.getHeight() * (i / 4 - 3);
    content.addTemplate(page, 4, 0, 0, 4, x, y);
    document.newPage();
}

如您所见,原始页面被导入一次,它的不同部分显示在不同的页面上。

(iText 和 iTextSharp 可免费获得——受 AGPL 约束——或商业)

【讨论】:

  • 谢谢,这是一个不错的解决方案。 +1 指出这个库。
【解决方案2】:

您可以使用 'pdftoppm' 来执行此任务:

pdftoppm -f <first page> -l <last page> -jpeg -x <start x> -y <start y> -W <width> -H <height> -jpeg <in file> > <out file>

例如,从 (x,y) = (100,200) 点(即裁剪区域的左上角)裁剪第一个 PDF 页面的区域,宽度为 50,高度为 80,然后保存JPEG 文件是通过以下方式完成的:

pdftoppm -f 1 -l 1 -jpeg -x 100 -y 200 -W 50 -H 80 'my.pdf' > 'crop.jpg'

如果您在文档分辨率方面遇到问题,可以使用“pdftoppm”的“-r”选项(有关更多信息,请参阅“pdftoppm”的手册页)。

当然,如果需要,您可以轻松地将 JPEG 文件转换为 PDF。

【讨论】:

  • 这将光栅化裁剪区域,这是我不想要的。
  • 谢谢 Roland,这正是我想要的
【解决方案3】:

使用ghostscript,您可以通过以下方式裁剪pdf:

gs -f original.pdf -o final.pdf -sDEVICE=pdfwrite \
    -c "[/CropBox [x-left y-bottom x-right y-top] /PAGES pdfmark"

x-lefty-bottom等,坐标可以用需要的坐标代替。请注意,对于gs,坐标(0, 0) 位于页面的左下角。

这可以很容易地编写脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2017-01-08
    • 2018-01-29
    • 2011-12-30
    • 1970-01-01
    • 2023-03-23
    • 2015-01-22
    相关资源
    最近更新 更多