2017-03-27 98 views
3

我搜索了问题的计算器。最近的链接是:
How to set custom page size with Ghostscript
How to convert multiple, different-sized PostScript files to a single PDF?ghostscript或python:如何将不同页面大小的pdf合并为相同页面大小的pdf?

但这解决不了我的问题。

这个问题很简单。
我们如何将多个PDF(不同页面大小)组合成一个组合的pdf,其中包含所有页面大小相同的页面。

实施例:
两个输入概率密度函数为:
hw1.pdf用的尺寸5.43x3.26英寸的单页(从Adobe阅读器中找到)
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脚本发现:

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中打开输出时,第一页是较小的尺寸,第二页是满的。
一般来说,我们如何才能使所有页面的大小相同?

回答

3

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

Python库的页面合并画布可以执行此操作。在示例目录和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作者。)

+0

它完美无缺! –

3

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

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

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

您将得到更好的建议(如你的第二次尝试)使用-dDEVICEWIDTHPOINTS-dDEVICEHEIGHTPOINTS设置介质尺寸,因为这些都不是取决于分辨率(不像-g),它可以通过输入的PostScript程序被重写。你不应该没有充分的理由干预分辨率,所以不要设置-r720

请注意,此过程不会“合并”,“组合”或其他任何暗示输入内容未改变的内容。您应该阅读关于该主题的documentation,并在尝试使用此过程之前了解该过程。

+0

可悲的是,总结是,它不能以简单的方式来完成,需要的源代码在对ghostscript有深入的了解之后进行修改?除GHOSTSCRIPT之外是否还有其他工具,例如pdftk等,我可以轻松做到这一点? –

+0

你可以修改PostScript程序,它不完全是源代码(它的排序,因为PostScript是一种解释型语言,但它不需要改变基于C的PostScript解释器)。我确实指出了你将不得不做出改变的地方,但这并不是特别困难,但它不会“开箱即用”。它反对网站的政策要求提供软件建议,我不知道任何可以做到这一点的事情。毕竟这是一个开发者网站,修改代码。 – KenS

+0

感谢@KenS严谨的回答,我有点期待一些简单的方法来做到这一点,它似乎比我想象的要复杂! –

相关问题