ghostscript还是python:如何将不同页面大小的pdf合并成相同页面大小的pdf?

2024-10-01 00:24:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但这不能解决我的问题。在

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

示例:
两个输入PDF是:
hw1.pdf,单页尺寸5.43x3.26英寸(可从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是像素/英寸。
大小-g2347x3909是使用python脚本找到的:

^{pr2}$

另一次尝试

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

这两个页面的第一个是纵向的,但大小不同。
在adobe reader中打开输出时,第一页的大小较小,第二页已满。
一般来说,如何使所有页面的大小相同?在


Tags: togspdf尺寸单页页面readerhow
2条回答

(在第一个例子中)其中一个页面被旋转的原因是因为它更适合这种方式。因为Ghostscript主要用作打印软件,所以假设您希望打印输入。如果输出为固定的媒体大小,则需要页面调整,并且旋转时请求的媒体大小更适合(即缩放比例更小),则内容将被旋转。在

为了防止这种情况发生,您需要重写FitPage过程,它在/ghostpdl/Resource/Init/pdf中定义_主.ps在pdf_PDF2PS_matrix过程中。您可以修改该过程,使其不旋转页面以获得更好的适合度。在

在第二种情况下,您没有设置-dFIXEDMEDIA-g表示-dFIXEDMEDIA-dDEVICE...POINTS没有),因此PDF文件中的媒体大小请求将覆盖您在命令行上设置的媒体大小。这就是为什么页面没有调整大小。由于介质是PDF文件所要求的大小,因此页面将不经修改就可以容纳,因此-dPDFFitPage将不起任何作用。因此,如果使用-dDEVICE...POINTS任何FitPage开关,则需要设置-dFIXEDMEDIA。在

最好(作为第二次尝试)使用-dDEVICEWIDTHPOINTS和{}来设置媒体大小,因为它们不依赖于分辨率(不像-g),后者可以被PostScript输入程序覆盖。你不应该在没有正当理由的情况下干涉分辨率,所以不要设置-r720。在

请注意,此过程不是“merge”、“combine”或任何其他表示输入内容在输出中保持不变的操作。在尝试使用此过程之前,您应该阅读有关此主题的documentation并理解该过程。在

您已经将这个问题标记为“ghostscript”,但是我假设您使用subprocess.call()并不反对使用Python。在

pdfrwPython库的pagemerge画布可以做到这一点。在examples目录和页面合并.py. 幻想_水印.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的主要作者。)

相关问题 更多 >