【问题标题】:PDF - Remove White MarginsPDF - 删除白边
【发布时间】:2012-05-12 03:04:38
【问题描述】:

我想知道一种从 PDF 文件中删除白边距的方法。就像 Adob​​e Acrobat X Pro 一样。我知道它不适用于每个 PDF 文件。

我猜想这样做的方法是获取文本边距,然后从该边距中裁剪出来。

PyPdf 是首选。

iText 根据此代码查找文本边距:

public void addMarginRectangle(String src, String dest)
    throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT));
    TextMarginFinder finder;
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        finder = parser.processContent(i, new TextMarginFinder());
        PdfContentByte cb = stamper.getOverContent(i);
        cb.rectangle(finder.getLlx(), finder.getLly(),
            finder.getWidth(), finder.getHeight());
        cb.stroke();
    }
    stamper.close();
}

【问题讨论】:

    标签: pdf pdf-generation itext ghostscript pypdf


    【解决方案1】:

    我对 PyPDF 不太熟悉,但我知道 Ghostscript 能够为您做到这一点。以下是类似问题的其他答案的链接:

    1. Convert PDF 2 sides per page to 1 side per page (SuperUser.com)
    2. Freeware to split a pdf's pages down the middle? (SuperUser.com)
    3. Cropping a PDF using Ghostscript 9.01 (StackOverflow.com)

    第三个答案可能是让您说“我知道它不适用于每个 PDF 文件”的原因。它使用 pdfmark 命令尝试将/CropBox 设置到 PDF 页面对象中。

    前两个答案的方法很可能在第三个失败的情况下成功。此方法使用 &lt;&lt;/PageOffset [NNN MMM]&gt;&gt; setpagedevice 的 PostScript 命令 sn-p 将 PDF 页面移动并放置在由 -gNNNNxMMMM 参数(定义设备宽度和高度,以像素为单位)定义的(较小的)媒体尺寸上。

    如果您了解前两个答案背后的概念,您将能够轻松地调整其中使用的方法来裁剪 PDF 页面所有 4 个边缘的边距:

    将字母大小的 PDF (8.5x11in == 612x792pt) 在 4 条边的每条边上裁剪半英寸 (==36pt) 的示例命令(该命令适用于 Windows):

    gswin32c.exe ^
        -o cropped.pdf ^
        -sDEVICE=pdfwrite ^
        -g5400x7200 ^
        -c "<</PageOffset [-36 -36]>> setpagedevice" ^
        -f input.pdf
    

    生成的页面大小将为 7.5x10in (== 540x720pt)。要在 Linux 或 Mac 上执行相同操作,请使用:

    gs \
        -o cropped.pdf \
        -sDEVICE=pdfwrite \
        -g5400x7200 \
        -c "<</PageOffset [-36 -36]>> setpagedevice" \
        -f input.pdf
    

    更新:如何使用 Ghostscript 确定“边距”

    一条评论要求“自动”确定白边。您也可以为此使用 Ghostscript。它的bbox 设备可以确定每页上(虚拟)墨水覆盖的区域(因此,间接确定画布每个边缘的空白区域)。

    命令如下:

    gs \
      -q -dBATCH -dNOPAUSE \
      -sDEVICE=bbox \
       input.pdf 
    

    输出(示例):

     %%BoundingBox: 57 29 562 764
     %%HiResBoundingBox: 57.265030 29.347046 560.245045 763.649977
     %%BoundingBox: 57 28 562 667
     %%HiResBoundingBox: 57.265030 28.347046 560.245045 666.295011
    

    bbox 设备在内存中渲染每个 PDF 页面(不将任何输出写入磁盘),然后将 BoundingBox 和 HiResBoundingBox 信息打印到 stderr。您可以像这样修改此命令以使结果更易于解析:

    gs \
        -q -dBATCH -dNOPAUSE \
        -sDEVICE=bbox \
         input.pdf \
         2>&1 \  
      | grep -v HiResBoundingBox
    

    输出(示例):

     %%BoundingBox: 57 29 562 764
     %%BoundingBox: 57 28 561 667
    

    这会告诉你...

    • ...第1页内容矩形的左下角在坐标[57 29],右上角在[562 741]
    • ...第2页内容矩形的左下角在坐标[57 28],右上角在[561 667]

    这意味着:

    • 第 1 页在左边缘使用 57pt 的空白 (72pt == 1in == 25,4mm)。
    • 第 1 页在底部边缘使用 29pt 的空白。
    • 第 2 页在左边缘使用 57pt 的空白。
    • 第 2 页在底部边缘使用 28pt 的空白。

    正如您已经从这个简单的示例中看到的那样,每个页面的空格并不完全相同。根据您的需要(您可能希望多页 PDF 的每一页都具有相同的大小,不是吗?),您必须计算出文档所有页面上每个边缘的最小边距。

    现在右边和上边的空白呢?要计算它,您需要知道每页的原始页面大小。确定这一点的最简单方法:pdfinfo 实用程序。 5 页 PDF 的示例命令:

    pdfinfo \
      -f 1 \
      -l 5 \
       input.pdf \
    | grep "Page "
    

    输出(示例):

    Page    1 size: 612 x 792 pts (letter)
    Page    2 size: 612 x 792 pts (letter)
    Page    3 size: 595 x 842 pts (A4)
    Page    4 size: 842 x 1191 pts (A3)
    Page    5 size: 612 x 792 pts (letter)
    

    这将帮助您确定所需的画布大小以及每个新 PDF 页面的顶部和右侧边缘所需的(最大)白边距。

    当然,这些计算也都可以编写脚本。

    但是,如果您的 PDF 都是 uniq 页面大小,或者它们是 1 页文档,那么这一切都更容易完成......

    【讨论】:

    • 如何自动知道白边在哪里?
    • @jacktrades:当然,如果你愿意,你可以使用 iText。随意。但是,对于 iText,您需要使用 iText API 编写一个 Java 程序来完成它。使用 Ghostscript,您可以留在脚本编程领域,在这种情况下我更喜欢...
    • 仍然无法理解如何找到 pdf 边距。 iText 做了类似上面发布的事情。
    • 哇...让我实现这个,然后我会回复你。
    • @PrakashK:我刚刚检查过——bbox 设备出于某种奇怪的原因使用了 4000 dpi 的默认分辨率。我一直认为它会使用 72 dpi。 (我通过运行gs -o /dev/null -sDEVICE=bbox -c "currentpagedevice {exch ==only ( ) print ==} forall quit" | grep -i resolution 进行了检查。另请参阅“Querying Ghostscript for the default options/settings of an output device (such as 'pdfwrite' or 'tiffg4')”。
    【解决方案2】:

    试试pdfcrop。它需要 ghostscript。

    【讨论】:

    • 关于“大文件”问题,在this blog post的cmets中建议使用pdfcrop --xetex --resolution 72 [other-options] input.pdf output.pdf来解决。
    • 免费、快速、自动、正确地识别页边距,预装。正是我需要的。
    • 它不适用于受密码保护的 pdf
    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 2020-01-23
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2016-05-22
    相关资源
    最近更新 更多