2017-03-27 7 views
3

問題のスタックオーバーフローを検索しました。最寄りのリンクは次のとおりです。
How to set custom page size with Ghostscript
How to convert multiple, different-sized PostScript files to a single PDF?ゴーストスクリプトまたはpython:異なるページサイズのPDFを同じページサイズのPDFに結合するにはどうすればいいですか?

しかし、これは私の問題を解決することができませんでした。

質問は簡単です。
どのようにして、同じサイズのすべてのページを持つ結合pdfに複数のpdf(異なるページサイズ)を組み合わせることができますか?

例:
二つの入力のPDFである:(アドビリーダーから見出さ)サイズ5.43x6.51インチ

の単一ページと
hw6.pdfサイズ5.43x3.26インチの単一ページと
hw1.pdf

PDFはここで見つけることができます:
https://github.com/bhishanpdl/Questions

コードは次のとおりです。

gs -sDEVICE=pdfwrite -r720 -g2347x3909 -dPDFFitPage -o homeworks.pdf hw1.pdf hw6.pdf 

問題:最初のpdfはポートレートで、2ページ目は横向きです。
質問:両方のページをポートレートにするにはどうすればよいですか?


-r720は、ピクセル/インチです。

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) 

が、彼らは同じ大きさを持っていない:
サイズ-g2347x3909は、Pythonスクリプトを使用して発見されました。
最初のページは小さいですが、私はAdobe Readerで出力を開くと2番目のページがいっぱいです。
一般に、どのようにすべてのページのサイズを同じにすることができますか?

答えて

3

あなたはこの質問に「ghostscript」というタグを付けましたが、私はあなたがsubprocess.call()を使用して、あなたがPythonを嫌うとは思わないと思います。

pdfrwのpagemergeキャンバスはこれを行うことができます。 examplesディレクトリとpagemerge.pyのソースに異なるサイズのページを扱う例がいくつかあります。 fancy_watermark.pyは、ウォーターマークを適用するコンテキストで、異なるページサイズを扱う例を示しています。

pdfrwは、ソースページを回転、拡大縮小、または単純に出力に配置することができます。ローテーションやスケーリングが必要な場合は、examplesディレクトリを参照してください。 (これは宿題のため、余分なクレジットのためにさまざまなページサイズを見ることによってスケーリングと回転を制御できます:)しかし、もしあなたが望むのは、2ページ目を最初のページと同じ長さに伸ばすことです。このコードのビットを持つこと:

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

ページの1つが回転している理由(最初の例では)が、より良く一致するためです。 Ghostscriptは主に印刷ソフトウェアとして意図されているため、入力を印刷することを前提としています。出力が固定メディアサイズになる場合は、ページフィッティングが要求され、回転すると要求されたメディアサイズがより良く(すなわちスケーリングが少なくても)フィットし、コンテンツが回転します。

これを防ぐには、pdf_PDF2PS_matrixの/ghostpdl/Resource/Init/pdf_main.psに定義されているFitPageプロシージャを書き直す必要があります。そのプロシージャを変更して、ページを回転させないようにすることができます。第2のケースで

あなたが-dFIXEDMEDIAを設定していない(-gは、-dFIXEDMEDIA意味-dDEVICE...POINTSしない)、PDFファイル内のメディアサイズの要求は、コマンドラインで設定したメディアのサイズを上書きしますので。ページのサイズが変更されないのはこのためです。メディアはPDFファイルで要求されたサイズなので、ページは変更されずに収まるため、-dPDFFitPageは何も行いません。したがって、-dDEVICE...POINTSのFitPageスイッチを使用する場合は、-dFIXEDMEDIAを設定する必要があります。

あなたはより良いこれらがPostScript入力プログラムで上書きすることができます(-gとは違って)、解像度に依存しないので、メディアサイズを設定する-dDEVICEWIDTHPOINTS-dDEVICEHEIGHTPOINTSを使用する(2番目の試みとして)のが賢明でしょう。正当な理由なしに決議に耳を傾けるべきではないので、-r720を設定しないでください。

このプロセスは、入力の内容が出力に変更されていないことを意味する「マージ」、「結合」、またはその他のものではないことに注意してください。この手順を使用する前に、件名のdocumentationを読み、プロセスを理解しておく必要があります。

+0

は、悲しいことに、要約は、それは簡単な方法で行うことができないということである、とのソースコードを必要としますゴーストスクリプトの徹底的な知識の後に変更されるでしょうか? GHOSTSCRIPT以外のツールがありますか?私はこのことを簡単にやることができますか? –

+0

PostScriptプログラムを修正することができます。PostScriptプログラムはソースコードとは異なります(PostScriptは翻訳されたものですが、CベースのPostScriptインタプリタを変更する必要はありません)。私はあなたが変更を加えなければならないところを指摘しました。特にそれほど難しいことではありませんが、「箱から外れて」起こることはありません。それはサイトのポリシーに反してソフトウェアの推奨事項を尋ねるものであり、私はこれを行うものは何も知らない。これは結局のところ開発者サイトであり、コードを変更します。 – KenS

+0

厳しい答えのための@KenS、私はそれをするためのいくつかの簡単な方法を期待していたのkindでした、それは思ったより複雑なようです! –

関連する問題