2017-03-27 96 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嚴謹的回答,我有點期待一些簡單的方法來做到這一點,它似乎比我想象的要複雜! –

相關問題