我们用php编写的网站从客户那里收到PDF文件。处理完毕后,下一步是来自供应商的代码。该代码要求每个页面的纵向为8.5x11“。代码还要求页面具有这样的数据(从pdfinfo输出):
Page 1 size: 612 x 792 pts (letter)
Page 1 rot: 0
Page 1 MediaBox: 0.00 0.00 612.00 792.00
Page 1 CropBox: 0.00 0.00 612.00 792.00
Page 1 BleedBox: 0.00 0.00 612.00 792.00
Page 1 TrimBox: 0.00 0.00 612.00 792.00
Page 1 ArtBox: 0.00 0.00 612.00 792.00
有时,客户会向我们提供包含一页或多页纵向的PDF。我们有使用FPDI重写文件的代码,将需要它的页面旋转90度:
$pdf->AddPage('L', array(215.9, 279.4), 90);
问题是只是设置rot = 90并且生成的文件有这个(从pdfinfo输出):
Page 3 size: 792 x 612 pts (letter)
Page 3 rot: 90
Page 3 MediaBox: 0.00 0.00 792.00 612.00
Page 3 CropBox: 0.00 0.00 792.00 612.00
Page 3 BleedBox: 0.00 0.00 792.00 612.00
Page 3 TrimBox: 0.00 0.00 792.00 612.00
Page 3 ArtBox: 0.00 0.00 792.00 612.00
我们的下一步代码无法识别rot = 90并将其视为横向页面。
我可以使用哪些方法将页面特征更改为第一组数据(肖像图像)?在我们的环境中,ghostscript可用。可以使用pdftk(更难)。
ADDED 我从帕特里克的pdfrw开始,但最终转移到了FPDF。我注意到一件奇怪的事情:当我使用ghostscript连接到其他东西时,我丢失了旋转修复大多数文件只旋转为字母,肖像使用FPDF和pdfrw。解决方案:在使用gs连接任何文件后,我再次运行“修复轮换”代码。
答案 0 :(得分:1)
以下是使用我的Python包pdfrw的示例。 pdfrw可能已安装或未安装在您的系统上;如果没有,你可以使用通常的pip或easy_install(甚至可能是apt-get install python-pdfrw
)安装它,或者直接从github上安装它。
此示例使用名为Form XObjects的PDF功能。如果您的输出处理软件不支持这些,那么我们可以创建一个版本,重新创建pdfrw完成的数学运算,但更新实际的页面流。 (在我开始使用Form XObjects之前,我曾经这样做过,但后者通常更清晰。)
另请注意,pdfrw不支持加密的PDF,因此必须先对其进行解密。如果这不适用于您的PDF,请给我一个例子,我会看一下。
除了这些警告之外,这实际上比你要求的功能更多 - 它会缩小太大的页面,而中心页面太小:
#!/usr/bin/env python
import sys
import os
from pdfrw import PdfReader, PdfWriter, PageMerge
# Change these constants to change output size or orientation
outbox = 0, 0, 8.5 * 72, 11 * 72
# Generic calculations from box
out_x = outbox[0]
out_y = outbox[1]
out_w = outbox[2] - out_x
out_h = outbox[3] - out_y
out_landscape = out_w > out_h
inpfn, = sys.argv[1:]
outfn = 'normalized.' + os.path.basename(inpfn)
inp = PdfReader(inpfn)
out = PdfWriter()
def fixpage():
# Figure out the rotation requirement before instantiating
landscape = bool(rotate % 180) ^ (mbox[2] - mbox[0] > mbox[3] - mbox[1])
rotation = 0 if landscape == out_landscape else 90
# Create a canvas, add the page, and get a reference to the page rectangle
canvas = PageMerge()
canvas.add(page, rotate=rotation)
rect = canvas[0]
# Scale the page rectangle if it doesn't fit our output size
scaling = max(rect.w / out_w, rect.h / out_h)
if scaling > 1.0:
rect.scale(1.0/scaling)
# Center the page rectangle on the output
rect.x = out_x + (out_w - rect.w) / 2
rect.y = out_y + (out_h - rect.h) / 2
canvas.mbox = outbox
return canvas.render()
for page in inp.pages:
rotate = int(page.inheritable.Rotate or 0)
mbox = tuple(float(x) for x in page.inheritable.MediaBox)
out.addpage(fixpage() if rotate or mbox != outbox else page)
out.write(outfn)
答案 1 :(得分:1)
在使用useTemplate()之前,只需使用this脚本中的Rotate()函数,就可以使用FPDF旋转导入的页面。没有必要换成另一种语言。