我想知道一种从PDF文件中删除白边距的方法。就像Adobe 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();
}发布于 2012-05-03 01:25:54
我对PyPDF不是很熟悉,但我知道Ghostscript可以帮你做到这一点。以下是一些类似问题的其他答案的链接:
第三个答案可能是让你说“我知道它不适用于所有PDF文件”的原因。它使用pdfmark命令尝试将/CropBox设置到PDF page对象中。
前两个答案的方法很可能在第三个答案失败的地方成功。此方法使用<</PageOffset [NNN MMM]>> setpagedevice的PostScript命令片段在-gNNNNxMMMM参数(以像素为单位定义设备宽度和高度)定义的(较小)媒体大小上移动和放置页面。
如果你理解前两个答案背后的概念,你将很容易适应那里使用的方法来裁剪PDF页面所有4个边缘的页边距:
下面是一个示例命令,可将信纸大小的PDF (8.5x11in == 612x792pt)裁剪半英寸(==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.295011bbox设备在内存中呈现每个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这会告诉你..。
[57 29],右上角位于[561 667];第2页的内容矩形的左下角位于坐标[57 28],右上角位于[57 28]
这意味着:
正如您已经从这个简单的示例中看到的,每个页面的空格并不完全相同。根据您的需要(您可能希望多页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页面大小,或者它们是单页文档,那么完成起来就容易得多了……
发布于 2012-05-04 23:36:59
试试pdfcrop。它需要ghostscript。
https://stackoverflow.com/questions/10417151
复制相似问题