首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDF -删除白边距

PDF -删除白边距
EN

Stack Overflow用户
提问于 2012-05-02 23:44:00
回答 2查看 16.8K关注 0票数 13

我想知道一种从PDF文件中删除白边距的方法。就像Adobe Acrobat X Pro一样。我知道它不会对每个PDF文件都起作用。

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

最好使用PyPdf。

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

代码语言:javascript
复制
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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-03 01:25:54

我对PyPDF不是很熟悉,但我知道Ghostscript可以帮你做到这一点。以下是一些类似问题的其他答案的链接:

  1. (SuperUser.com)
  2. (SuperUser.com)
  3. (StackOverflow.com)

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

前两个答案的方法很可能在第三个答案失败的地方成功。此方法使用<</PageOffset [NNN MMM]>> setpagedevice的PostScript命令片段在-gNNNNxMMMM参数(以像素为单位定义设备宽度和高度)定义的(较小)媒体大小上移动和放置页面。

如果你理解前两个答案背后的概念,你将很容易适应那里使用的方法来裁剪PDF页面所有4个边缘的页边距:

下面是一个示例命令,可将信纸大小的PDF (8.5x11in == 612x792pt)裁剪半英寸(==36pt) (此命令适用于Windows):

代码语言:javascript
复制
gswin32c.exe ^
    -o cropped.pdf ^
    -sDEVICE=pdfwrite ^
    -g5400x7200 ^
    -c "<</PageOffset [-36 -36]>> setpagedevice" ^
    -f input.pdf

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

代码语言:javascript
复制
gs \
    -o cropped.pdf \
    -sDEVICE=pdfwrite \
    -g5400x7200 \
    -c "<</PageOffset [-36 -36]>> setpagedevice" \
    -f input.pdf

更新:如何使用Ghostscript确定‘页边距’

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

下面是命令:

代码语言:javascript
复制
gs \
  -q -dBATCH -dNOPAUSE \
  -sDEVICE=bbox \
   input.pdf 

输出(示例):

代码语言:javascript
复制
 %%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。您可以像这样修改此命令,以使结果更易于解析:

代码语言:javascript
复制
gs \
    -q -dBATCH -dNOPAUSE \
    -sDEVICE=bbox \
     input.pdf \
     2>&1 \  
  | grep -v HiResBoundingBox

输出(示例):

代码语言:javascript
复制
 %%BoundingBox: 57 29 562 764
 %%BoundingBox: 57 28 561 667

这会告诉你..。

  • ...that 第1页的内容矩形的左下角位于坐标[57 29],右上角位于[561 667]

第2页的内容矩形的左下角位于坐标[57 28],右上角位于[57 28]

这意味着:

  • Page 1在左边缘使用57磅的空格edge.
  • Page 1在底部使用29磅的空格2在左边缘使用57磅的空格在底部边缘使用28磅的空格。

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

现在,右边缘和顶部边缘的空格是什么?要计算该值,您需要知道每个页面的原始页面大小。确定这一点的最简单方法是:pdfinfo实用程序。5页PDF的命令示例:

代码语言:javascript
复制
pdfinfo \
  -f 1 \
  -l 5 \
   input.pdf \
| grep "Page "

输出(示例):

代码语言:javascript
复制
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页面大小,或者它们是单页文档,那么完成起来就容易得多了……

票数 20
EN

Stack Overflow用户

发布于 2012-05-04 23:36:59

试试pdfcrop。它需要ghostscript。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10417151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档