ghostscript 或 python:如何将不同页面大小的 pdf 合并为相同页面大小的 pdf?
ghostscript or python : how to combine pdf of different page sizes into a pdf of same page sizes?
我在 Whosebug 上搜索了这个问题。最近的 link 是:
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 是 pixels/inch.
使用 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。
一般来说,我们如何才能使所有页面的大小相同?
其中一个页面被旋转的原因(在第一个示例中)是因为它更适合旋转。因为 Ghostscript 主要用作打印软件,所以假设您要打印输入。如果输出为固定媒体大小,请求页面适合,并且请求的媒体大小在旋转时更适合(即缩放比例较小),然后内容将被旋转。
为了防止出现这种情况,您需要重写 FitPage 过程,该过程定义在过程 /ghostpdl/Resource/Init/pdf_main.ps 中 pdf_PDF2PS_matrix
。您可以修改该过程,使其不旋转页面以使其更适合。
在第二种情况下,您没有设置 -dFIXEDMEDIA
(-g
表示 -dFIXEDMEDIA
,-dDEVICE...POINTS
不表示),因此 PDF 文件中的媒体大小请求将覆盖您在命令行上设置的介质尺寸。这就是页面未调整大小的原因。由于媒体是 PDF 文件要求的大小,因此页面无需修改即可适应,因此 -dPDFFitPage
将不执行任何操作。因此,如果您使用 -dDEVICE...POINTS
和 任何 FitPage 开关,则需要设置 -dFIXEDMEDIA
。
最好建议您(作为第二次尝试)使用 -dDEVICEWIDTHPOINTS
和 -dDEVICEHEIGHTPOINTS
来设置媒体大小,因为它们不依赖于分辨率(不像 -g
) 可以被 PostScript 输入程序覆盖。如果没有充分的理由,你不应该干预分辨率,所以不要设置 -r720
.
请注意,此过程不会 'merge'、'combine' 或任何其他暗示输入内容在输出中未更改的内容。在尝试使用此过程之前,您应该阅读有关该主题的 documentation 并了解该过程。
您已将此问题标记为 "ghostscript",但我假设您使用 subprocess.call()
表示您不反对使用 Python。
pdfrwPython库的pagemergecanvas可以做到这一点。在示例目录和 pagemerge.py 的源代码中有一些处理不同大小页面的示例。 fancy_watermark.py 显示了在应用水印的上下文中处理不同页面大小的示例。
pdfrw 可以在输出中旋转、缩放或简单地定位源页面。如果你想要旋转或缩放,你可以查看示例目录。 (因为这是家庭作业,为了获得额外的学分,您可以通过查看各种页面大小来控制缩放和旋转。:)但是如果您只想将第二页扩展到与第一页一样长,您可以这样做使用这段代码:
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 的主要作者。)
我在 Whosebug 上搜索了这个问题。最近的 link 是:
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 是 pixels/inch.
使用 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。
一般来说,我们如何才能使所有页面的大小相同?
其中一个页面被旋转的原因(在第一个示例中)是因为它更适合旋转。因为 Ghostscript 主要用作打印软件,所以假设您要打印输入。如果输出为固定媒体大小,请求页面适合,并且请求的媒体大小在旋转时更适合(即缩放比例较小),然后内容将被旋转。
为了防止出现这种情况,您需要重写 FitPage 过程,该过程定义在过程 /ghostpdl/Resource/Init/pdf_main.ps 中 pdf_PDF2PS_matrix
。您可以修改该过程,使其不旋转页面以使其更适合。
在第二种情况下,您没有设置 -dFIXEDMEDIA
(-g
表示 -dFIXEDMEDIA
,-dDEVICE...POINTS
不表示),因此 PDF 文件中的媒体大小请求将覆盖您在命令行上设置的介质尺寸。这就是页面未调整大小的原因。由于媒体是 PDF 文件要求的大小,因此页面无需修改即可适应,因此 -dPDFFitPage
将不执行任何操作。因此,如果您使用 -dDEVICE...POINTS
和 任何 FitPage 开关,则需要设置 -dFIXEDMEDIA
。
最好建议您(作为第二次尝试)使用 -dDEVICEWIDTHPOINTS
和 -dDEVICEHEIGHTPOINTS
来设置媒体大小,因为它们不依赖于分辨率(不像 -g
) 可以被 PostScript 输入程序覆盖。如果没有充分的理由,你不应该干预分辨率,所以不要设置 -r720
.
请注意,此过程不会 'merge'、'combine' 或任何其他暗示输入内容在输出中未更改的内容。在尝试使用此过程之前,您应该阅读有关该主题的 documentation 并了解该过程。
您已将此问题标记为 "ghostscript",但我假设您使用 subprocess.call()
表示您不反对使用 Python。
pdfrwPython库的pagemergecanvas可以做到这一点。在示例目录和 pagemerge.py 的源代码中有一些处理不同大小页面的示例。 fancy_watermark.py 显示了在应用水印的上下文中处理不同页面大小的示例。
pdfrw 可以在输出中旋转、缩放或简单地定位源页面。如果你想要旋转或缩放,你可以查看示例目录。 (因为这是家庭作业,为了获得额外的学分,您可以通过查看各种页面大小来控制缩放和旋转。:)但是如果您只想将第二页扩展到与第一页一样长,您可以这样做使用这段代码:
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 的主要作者。)