23

我想知道是否有人有任何以编程方式处理 .pdf 文件的经验。我有一个 .pdf 文件,我需要将每一页裁剪到一定大小。

在快速谷歌搜索后,我找到了 python 的 pyPdf 库,但我的实验失败了。当我更改页面对象上的cropBox 和trimBox 属性时,结果不是我所期望的,而且看起来很随机。

有没有人有这方面的经验?代码示例将不胜感激,最好是在 python 中。

4

7 回答 7

37

pyPdf在这方面做了我所期望的。使用以下脚本:

#!/usr/bin/python
#

from pyPdf import PdfFileWriter, PdfFileReader

with open("in.pdf", "rb") as in_f:
    input1 = PdfFileReader(in_f)
    output = PdfFileWriter()

    numPages = input1.getNumPages()
    print "document has %s pages." % numPages

    for i in range(numPages):
        page = input1.getPage(i)
        print page.mediaBox.getUpperRight_x(), page.mediaBox.getUpperRight_y()
        page.trimBox.lowerLeft = (25, 25)
        page.trimBox.upperRight = (225, 225)
        page.cropBox.lowerLeft = (50, 50)
        page.cropBox.upperRight = (200, 200)
        output.addPage(page)

    with open("out.pdf", "wb") as out_f:
        output.write(out_f)

生成的文档有一个 200x200 点的裁切框,从媒体框内的 25,25 点开始。裁剪框在裁切框内 25 个点。

这是我的示例文档在使用上述代码处理后在 acrobat Professional 中的外观: 裁剪页面截图

此文档在 acrobat reader 中加载时将显示为空白。

于 2009-01-21T16:12:44.507 回答
10

使用它来获取 pdf 的尺寸

from PyPDF2 import PdfFileWriter,PdfFileReader,PdfFileMerger

pdf_file = PdfFileReader(open("/Users/user.name/Downloads/sample.pdf","rb"))
page = pdf_file.getPage(0)
print(page.cropBox.getLowerLeft())
print(page.cropBox.getLowerRight())
print(page.cropBox.getUpperLeft())
print(page.cropBox.getUpperRight())

在此获取页面参考之后,然后应用裁剪命令

page.mediaBox.lowerRight = (lower_right_new_x_coordinate, lower_right_new_y_coordinate)
page.mediaBox.lowerLeft = (lower_left_new_x_coordinate, lower_left_new_y_coordinate)
page.mediaBox.upperRight = (upper_right_new_x_coordinate, upper_right_new_y_coordinate)
page.mediaBox.upperLeft = (upper_left_new_x_coordinate, upper_left_new_y_coordinate)

#for example :- my custom coordinates 
#page.mediaBox.lowerRight = (611, 500)
#page.mediaBox.lowerLeft = (0, 500)
#page.mediaBox.upperRight = (611, 700)
#page.mediaBox.upperLeft = (0, 700)
于 2018-08-01T06:44:04.370 回答
4

我怎么知道要裁剪的坐标?

感谢以上所有答案。

步骤 1. 运行以下代码得到 (x1, y1)。

from PyPDF2 import PdfFileWriter, PdfFileReader

input = PdfFileReader(open("test.pdf","rb"))
page = input.getPage(0)
print(page.cropBox.getUpperRight())

步骤 2. 以全屏模式查看 pdf 文件。

步骤 3. 将屏幕捕获为图像文件 screen.jpg。

Step 4. 通过 M$paint 或 GIMP 打开 screen.jpg。这些应用程序显示光标的坐标。

步骤 5. 记住以下坐标,(x2, y2), (x3, y3), (x4, y4) 和 (x5, y5),其中 (x4, y4) 和 (x5, y5) 确定您想要的矩形庄稼。

在此处输入图像描述

Step 6. 通过以下公式获取 page.cropBox.upperLeft 和 page.cropBox.lowerRight。这是一个计算工具

page.cropBox.upperLeft = (x1*(x4-x2)/(x3-x2),(1-y4/y3)*y1)
page.cropBox.lowerRight = (x1*(x5-x2)/(x3-x2),(1-y5/y3)*y1)

步骤 7. 运行以下代码以裁剪 pdf 文件。

from PyPDF2 import PdfFileWriter, PdfFileReader

output = PdfFileWriter() 
input = PdfFileReader(open('test.pdf', 'rb')) 

n = input.getNumPages()

for i in range(n):
  page = input.getPage(i)
  page.cropBox.upperLeft = (100,200)
  page.cropBox.lowerRight = (300,400)
  output.addPage(page) 
  
outputStream = open('result.pdf','wb') 
output.write(outputStream) 
outputStream.close() 
于 2021-07-04T13:57:09.727 回答
2

您可能正在寻找免费的解决方案,但如果您有钱可以花钱,PDFlib是一个很棒的库。它从来没有让我失望过。

于 2009-01-19T16:24:51.767 回答
0

您可以将 PDF 转换为 Postscript(pstopdf 或 ps2pdf),然后对 Postscript 文件进行文本处理。之后,您可以将输出转换回 PDF。

如果您要处理的 PDF 都由同一个应用程序生成并且有些相似,这会很好地工作。如果它们来自不同的来源,通常很难处理 Postscript 文件 - 结构变化很大。但是,即使您可以使用一些正则表达式来修复页面大小等。

于 2009-01-19T22:54:55.833 回答
0

Acrobat Javascript API 有一个 setPageBoxes 方法,但 Adob​​e 不提供任何 Python 代码示例。只有 C++、C# 和 VB。

于 2009-01-19T23:39:01.797 回答
-1

裁剪 .pdf 文件的页面

from PIL import Image
def ImageCrop():
    img = Image.open("page_1.jpg")
    left = 90
    top = 580
    right = 1600
    bottom = 2000
    img_res = img.crop((left, top, right, bottom))
    with open(outfile4, 'w') as f:
        img_res.save(outfile4,'JPEG')
ImageCrop()
于 2021-11-22T11:26:49.167 回答