ghostscript或python:如何将不同页面大小的pdf组合成相同页面大小的pdf?

时间:2017-03-27 20:43:25

标签: python ghostscript pdfrw

我在stackoverflow中搜索了问题。最近的链接是:
How to set custom page size with Ghostscript
How to convert multiple, different-sized PostScript files to a single PDF?

但这无法解决我的问题。

问题很简单 我们如何将多个pdf(具有不同的页面大小)组合成具有相同大小的所有页面的组合pdf。

例:
两个输入pdf是:
单页面尺寸为5.43x3.26英寸的hw1.pdf(从adobe reader中找到)
hw6.pdf,单页面积为5.43x6.51英寸

pdf可以在这里找到:
https://github.com/bhishanpdl/Questions

代码是:

gs -sDEVICE=pdfwrite -r720 -g2347x3909 -dPDFFitPage -o homeworks.pdf hw1.pdf hw6.pdf

问题:首先是pdf是肖像,第二页是横向 问题:我们怎样才能让两个页面都成像?

注意
-r720是像素/英寸  使用python脚本找到大小-g2347x3909:

wd = int(np.floor(720 * 5.43))
ht = int(np.floor(720 * 3.26))    

gsize = '-g' + str(ht) + 'x' + str(wd) + ' '
# this gives:  gsize = -g4308x6066

另一种尝试

commands = 'gs -o homeworks.pdf -sDEVICE=pdfwrite -dDEVICEWIDTHPOINTS=674 ' +\
               ' -dDEVICEHEIGHTPOINTS=912 -dPDFFitPage ' +\
               'hw1.pdf hw6.pdf'
subprocess.call(commands, shell=1)

这首先给出两个页面的肖像,但它们的大小不同 第一页的尺寸较小,第二页在adobe reader中打开输出时已满 一般来说,我们如何才能使所有页面的大小相同?

2 个答案:

答案 0 :(得分:3)

其中一个页面被旋转的原因(在第一个例子中)是因为它更适合这种方式。因为Ghostscript主要用作打印软件,所以假设您要打印输入。如果输出是固定介质尺寸,则请求页面拟合,并且在旋转时所请求的介质尺寸更适合(即缩放更少),然后内容将旋转。

为了防止这种情况,您需要重写FitPage过程,该过程在过程pdf_PDF2PS_matrix中的/ghostpdl/Resource/Init/pdf_main.ps中定义。您可以修改该过程,使其不会旋转页面以便更好地适应。

在第二种情况下,您尚未设置-dFIXEDMEDIA-g隐含-dFIXEDMEDIA-dDEVICE...POINTS没有),因此PDF文件中的媒体大小请求将覆盖您在命令行上设置的媒体大小。这就是为什么页面没有调整大小。由于媒体是PDF文件所请求的大小,因此页面将适合而不进行修改,因此-dPDFFitPage将不执行任何操作。因此,如果您使用-dFIXEDMEDIA 任何FitPage切换,则需要设置-dDEVICE...POINTS

您最好建议(作为第二次尝试)使用-dDEVICEWIDTHPOINTS-dDEVICEHEIGHTPOINTS来设置媒体大小,因为这些不依赖于分辨率(与-g不同)可以被PostScript输入程序覆盖。你不应该没有充分的理由干涉决议,所以不要设置-r720

请注意,此过程不会合并','合并'或其他暗示输入内容在输出中不变的其他内容。在尝试使用此过程之前,您应该阅读有关主题的documentation并了解该过程。

答案 1 :(得分:2)

您已标记此问题" ghostscript"但我假设您使用subprocess.call()表示您不反对使用Python。

pdfrw Python库的pagemerge画布可以做到这一点。有一些例子在examples目录和pagemerge.py的源头处理不同大小的页面。 fancy_watermark.py显示了在应用水印的上下文中处理不同页面大小的示例。

pdfrw可以在输出上旋转,缩放或简单地定位源页面。如果要旋转或缩放,可以查看examples目录。 (因为这是用于家庭作业,为了额外的功劳,您可以通过查看各种页面大小来控制缩放和旋转。:)但是,如果您想要的第二页要扩展到第一页,那么您可以做用这段代码:

from pdfrw import PdfReader, PdfWriter, PageMerge

pages = PdfReader('hw1.pdf').pages + PdfReader('hw6.pdf').pages
output = PdfWriter()

rects = [[float(num) for num in page.MediaBox] for page in pages] 
height = max(x[3] - x[1] for x in rects)
width = max(x[2] - x[0] for x in rects)

mbox = [0, 0, width, height]

for page in pages:
    newpage = PageMerge()
    newpage.mbox = mbox              # Set boundaries of output page
    newpage.add(page)                # Add one old page to new page
    image = newpage[0]               # Get image of old page (first item)
    image.x = (width - image.w) / 2  # Center old page left/right
    image.y = (height - image.h)     # Move old page to top of output page
    output.addpage(newpage.render())

output.write('homeworks.pdf')

(免责声明:我是主要的pdfrw作者。)