如何旋转PDF页面以便设置* Box(并且它不仅仅使用rot = 90)

时间:2017-04-01 20:30:00

标签: php fpdf fpdi

我们用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连接任何文件后,我再次运行“修复轮换”代码。

2 个答案:

答案 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旋转导入的页面。没有必要换成另一种语言。