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

ghostscript或python:如何将不同页面大小的pdf组合成相同页面大小的pdf?,python,ghostscript,pdfrw,Python,Ghostscript,Pdfrw,我在堆垛机上搜索这个问题。最近的链接是: 但这并不能解决我的问题 问题很简单。 我们如何将多个pdf(具有不同的页面大小)组合成一个具有相同大小的所有页面的组合pdf 示例: 两个输入PDF是: hw1.pdf,单页尺寸为5.43x3.26英寸(可从adobe reader中找到) hw6.pdf,单页尺寸为5.43x6.51英寸 PDF可在此处找到: 代码是: gs -sDEVICE=pdfwrite -r720 -g2347x3909 -dPDFFitPage -o homeworks

我在堆垛机上搜索这个问题。最近的链接是:

但这并不能解决我的问题

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

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

PDF可在此处找到:

代码是:

gs -sDEVICE=pdfwrite -r720 -g2347x3909 -dPDFFitPage -o homeworks.pdf hw1.pdf hw6.pdf
问题:第一个pdf是纵向的,第二个页面是横向的。
问题:我们如何将两页都画成肖像

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

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)
这将首先显示两个页面的纵向,但它们的大小不同。
当我在AdobeReader中打开输出时,第一页较小,第二页已满。
一般来说,我们如何使所有页面的大小相同

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

为了防止这种情况发生,您需要重写FitPage过程,该过程在过程
pdf\PDF2PS\u矩阵
中的/ghostpdl/Resource/Init/pdf\u main.ps中定义。您可以修改该过程,使其不会旋转页面以获得更好的拟合

在第二种情况下,您没有设置
-dFIXEDMEDIA
-g
意味着
-dFIXEDMEDIA
-dDEVICE…POINTS
没有),因此PDF文件中的介质大小请求将覆盖您在命令行上设置的介质大小。这就是页面没有调整大小的原因。由于介质是PDF文件所要求的大小,因此页面无需修改即可适应,因此
-dPDFFitPage
将不起任何作用。因此,如果使用
-dDEVICE…POINTS
任何FitPage开关,则需要设置
-dFIXEDMEDIA

建议您(作为第二次尝试)使用
-dDEVICEWIDTHPOINTS
-dDEVICEHEIGHTPOINTS
来设置介质大小,因为它们不依赖于分辨率(不同于PostScript输入程序可以覆盖的
-g
)。您不应该在没有充分理由的情况下干预分辨率,因此不要设置
-r720


请注意,此过程不会“合并”、“合并”或任何其他暗示输入内容在输出中保持不变的内容。在尝试使用此过程之前,您应该阅读关于此主题的说明并理解该过程。

您已将此问题标记为“ghostscript”,但通过使用
subprocess.call()
,我认为您并不反对使用Python

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的主要作者。)

遗憾的是,总结是不能用简单的方式完成,需要在彻底了解ghostscript后修改源代码?除了GHOSTSCRIPT,还有其他工具吗,比如pdftk等等,我可以很容易地完成这件事吗?你可以修改PostScript程序,它并不完全是源代码(它有点像,因为PostScript是一种解释语言,但它不需要修改基于C的PostScript解释器)。我确实指出了你必须在哪里进行改变,这并不特别困难,但这并不是“开箱即用”的事情。要求提供软件推荐是违反网站政策的,我不知道有什么能做到这一点。这毕竟是一个开发者网站,修改代码。感谢@KenS的严格回答,我有点期待一些简单的方法来做到这一点,它似乎比我想象的要复杂!