複数のPDFファイルを1つのPDFにマージ/変換


1071

複数のPDFファイルを1つの大きなPDFファイルにマージ/変換するにはどうすればよいですか?

以下を試しましたが、対象ファイルの内容が期待通りではありませんでした。

convert file1.pdf file2.pdf merged.pdf

非常にシンプルで基本的なコマンドライン(CLI)ソリューションが必要です。マージ/変換の出力をパイプで直接パイプできたら(ベストはpdf2ps、以前にここで尋ねた質問で最初に試みたように:Linuxパイピング(変換-> pdf2ps-> lp))。


3
ymmv、しかしこれはpdfuniteほど出力ファイルの解像度が良くないようで、pdfuniteからの出力よりもファイルサイズが大きくなります
sabujp '17


これらのソリューションによってリンクが保持されるかどうかは、この投稿で説明されています。リンクを(おそらく他の注釈とともに)保存したい場合は、コマンドラインインターフェースが必要な場合はpdftk、グラフィカルユーザーインターフェースが必要な場合はpdfsam、Webインターフェースが必要な場合はsejdaを使用します。
クレメント

回答:


1389

pdfuniteそれがpopplerの一部であることを考えると、インストールされる可能性が高く、使用方法も次のように単純ですpdftk

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf

20
高速ですが、ハイパーリンクが壊れるようです。blog.dbrgn.ch/2013/8/14/merge-multiple-pdfsを
Danilo Bargen

426
必ずout.pdfを提供することを忘れないでください。そうしないと、コマンドの最後のファイルを上書きします(ため息)。
mlissner 2013年

10
pdfuniteのパッケージは、debianではpoppler-utilsですが、古いdebianリリースには存在しない場合があります。
Jocelyn delalande 2013年

16
これはお勧めできません。結果のPDFのサイズが大きすぎます。たとえば、Pdfuniteは75MBのファイルを提供し、Ghostscriptはすべてを1MBにパックします。
Torben、

64
使用できるのはpdfunite *.pdf out.pdf、そのディレクトリに他のPDFが存在せず、その順序が「*」によって保持されていることを前提としています。保存されていない場合は、範囲:filename_ {0..9} .pdfを使用して解決します。
lepe

549

良いghostscriptを試してください:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=merged.pdf mine1.pdf mine2.pdf

またはこの方法で低解像度PDFの改良版を作成する(これを指摘してくれたAdrianoに感謝):

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdf

どちらの場合も、出力解像度は、convertを使用したこの方法よりもはるかに高く、優れています。

convert -density 300x300 -quality 100 mine1.pdf mine2.pdf merged.pdf

この方法では、他に何もインストールする必要はなく、システムに既にインストールされているものを操作するだけです(少なくとも両方ともデフォルトで私のrhelに含まれています)。

お役に立てれば、

更新:まず、あなたの素敵なコメントをありがとう!皆さんのために役立つヒントにすぎませんが、グーグルした後、PDFのサイズを縮小するための優れたトリックを見つけました。300MBのPDFを1つ、許容できる解像度でちょうど15 MBに減らしました!そして、これらすべてが良いghostscriptで、ここにあります:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=output.pdf input.pdf

乾杯!!


27
素晴らしいヒントgsです。非常に高速で実行され、圧縮率が高くなります。私はこのPARAMを使用した後、しかし、品質は多くの改善:-dPDFSETTINGS=/prepress
アドリアーノP

3
これ-dPDFSETTINGS=/prepressは、ページが広すぎて水平スクロールバーが煩わしいページを回転させるという非常に優れた効果があることがわかりました。
Robert Smith 14

24
次の行をに追加する.bash_profileと、便利なショートカットが作成されます。pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }これにより、コマンドを頻繁に使用する必要がある場合に、入力する手間が省けます。このような使用方法のルックスpdfmerge merged.pdf mine1.pdf mine2.pdf
トーベン

2
-dBATCHフラグの説明を見つけようとしましたが、見つかりませんでした。man gsでさえ何も言わない。しかし、素晴らしい、追加のプログラムなし!
Michal Gonda、2015

3
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfに短縮することができますgs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdfドキュメントから:「便利な省略形として、-o上記のようにオプションに続いて出力ファイル指定を使用できます。このオプション-o-dBATCHおよびオプションも設定し-dNOPAUSEます。これはghostscript、1つ以上の入力ファイルを変換するために呼び出す簡単な方法です。」
MiniMax 2019

513

申し訳ありませんが、Googleと少しの運で自分で答えを見つけることができました:)

興味のある方のために;

私たちのdebianサーバーにpdftk(pdfツールキット)をインストールし、次のコマンドを使用して目的の出力を達成しました。

pdftk file1.pdf file2.pdf cat output output.pdf

または

gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...

次に、これを直接pdf2psにパイプすることができます。


81
また、Ghostscriptを使用して動作するかもしれません: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
ネイト・コールズ

15
pdftkは暗号化されたpdfをマージでき、pdfuniteはできない
Thomas

3
pdftkを使用すると、デフォルトオプションで変換するよりも解像度が向上します。
キランKテルクンタ2014年

13
pdftk file1.pdf file2.pdf cat output out.pdfマージされたファイルを次のように出力しますout.pdf
jmiserez '28

2
pdftk依存関係がないため、EL7システムでは使用できませんlibgcj
コーダー

72

複数のファイルがあり、名前を1つずつ入力したくない場合は、これが最も簡単な解決策です。

qpdf --empty --pages *.pdf -- out.pdf


2
これははるかに簡単です
baxx

1
qpdfはドキュメントのハイパーリンクを壊すようです
David Granqvist

2
最初は複雑なオプションを理解するのは難しいですが、qpdfは非常に便利で強力なツールです。オンラインマニュアルはこちらから
ジョナサンホルベイ

間違いなく最も便利!
ラッキー

54

また、a.pdfとb.pdfのコンテンツpdfjoin a.pdf b.pdfを使用して新規作成しますb-joined.pdf


5
これは素晴らしくて簡潔ですが、ハイパーリンクを壊します。
明るい星、

3
pdfjoin(pdflatex)が、ページ数の多いファイルで失敗する。1kページのファイルへのマージに失敗しました。
mdrozdziel 2014

pdfjoinが注釈またはグラフィック以外の追加アイテムを
破壊

「URW Palladio L」フォントは、ページをpdfjoinした後に非表示になりました。
v_2e 2016年

9
pdfuniteは通常はうまく機能しますが、「実装されていない機能:暗号化されたファイルをマージできませんでした」と表示されている場合、pdfjoinは優れた代替手段です。何らかの理由で、pdfjoinは暗号化について不平を言いません。
Calaf、2017

38

あなたは直接convertコマンドを使うことができます、

例えば

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf

40
これは無損失ではありません。
Ben Ruijl、2014年

12
できconvert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdfますが、結果のファイルサイズは大きすぎる可能性があります。convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdf代わりに私がお勧めします。
arielnmz 14

21
これには、すべてをラスターイメージに変換する必要があるようですが、特にテキストベースのPDFを扱う場合は、これは間違いなく最適ではありません。
翼竜

5
OPが機能しないと説明している内容のほぼコピー
user829755

15
ベクターからラスターに移動して決して戻らない場合を除いて、postscriptまたはPDFファイルの変換は使用しないでください。これが悪い考えであると言っても過言ではありません。
markgalassi 2015年

32

pdfunitePDF全体をマージしても問題ありません。たとえば、file1.pdfの2〜7ページとfile2.pdfの1、3、4ページが必要な場合は、を使用pdfseparateして、ファイルをページごとに別々のPDFに分割してに渡す必要がありpdfuniteます。

その時点で、おそらくより多くのオプションを備えたプログラムが必要になります。qpdfPDFを操作するために見つけた最高のユーティリティです。pdftkgcjに依存しているため、Red Hat / Fedoraは大きくて遅く、パッケージ化しません。他のPDFユーティリティはMonoまたはPythonに依存しています。をqpdf使用pdfseparatepdfuniteてページを30ページの出力PDFに組み立てるよりもはるかに小さい出力ファイルを生成したことがわかりました(970kB対1,6450 kB)。より多くのオプションを提供するため、qpdfのコマンドラインはそれほど単純ではありません。file1とfile2をマージする元のリクエストは、

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf

2
これくらい。たとえば放物線pdftkは、に依存しているため、もうパッケージ化されていません。そのため、gcjサポートが削除されたと思います。を介してpdf操作ツールを検索したにもかかわらずpacman -Ss pdf、これを逃しました。この回答をありがとう!私はもっ​​と多くの賛成票を受け取る必要があるので、pdfuniteまたはの提案のすぐ隣に表示されpdftkます。
k.stm 2018

1
Linux Mintの新規インストールでは、これはターミナルウィンドウで実行され、インストールやパスの調整は必要ありませんでした。いいね!
ウォレスケリー

これは完全に機能し、私が試した他のコマンドよりも明確なマージされたドキュメントを提供しました。投稿ありがとうございます。
Siwoku Adeola

14

Apache PDFBox http://pdfbox.apache.org/

PDFMergerこのアプリケーションは、PDFドキュメントのリストを取得してそれらをマージし、結果を新しいドキュメントに保存します。

使用法:java -jar pdfbox-app-xyzjar PDFMerger "ソースPDFファイル(2 ..n)" "ターゲットPDFファイル"


11

python https://pypi.python.org/pypi/pdftools/1.0.6からPDFツールを使用する

tar.gzファイルをダウンロードして解凍し、以下のようにコマンドを実行します

python pdftools-1.1.0/pdfmerge.py -o output.pdf -d file1.pdf file2.pdf file3 

上記のコマンドを実行する前にpyhton3をインストールする必要があります

このツールは以下をサポートします

  • 追加
  • インサート
  • 削除する
  • 回転
  • スプリット
  • マージ
  • 郵便番号

詳細については、下記のリンクをご覧ください。オープンソースです。

https://github.com/MrLeeh/pdftools


これは完璧です。gs(上記のすべてのバリアント)を使用して、2MBと500Kbの2つのPDFを単純にマージすると、完了までに数分かかり、結果として40MBのファイルができました。pdftools同じファイルサイズで瞬時に完了します。
supergra 2018年

10

無料のオープンソースのsejda-consoleを使用できます。解凍して実行します sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

ブックマーク、リンクの注釈、アクロフォームなどを保持します。実際に使用できるオプションはたくさんありますsejda-console merge -h。実行すると、すべてが表示されます。


OMHOはこれらのタイプのタスクを実行するためのツールとして最適
mario ruiz

8

ダウンロードしたすべての画像を1つのPDFに変換する場合は、次を実行します。

convert img{0..19}.jpg slides.pdf


6
ベクターからラスターに移動して決して戻らない場合を除いて、postscriptまたはPDFファイルの変換は使用しないでください。これが悪い考えであると言っても過言ではありません。
markgalassi 2015年

6

私はpdfunite推薦を2番目に述べます。しかし、Argument list too long2k以上のPDFファイルをマージしようとすると、エラーが発生しました。

私はこれと2つの外部パッケージをPythonに向けました:PyPDF2(PDF関連のすべてのものを処理するため)とnatsort(ディレクトリのファイル名の「自然な」ソートを行うため)。これが誰かを助けることができる場合:

from PyPDF2 import PdfFileMerger
import natsort
import os

DIR = "dir-with-pdfs/"
OUTPUT = "output.pdf"

file_list = filter(lambda f: f.endswith('.pdf'), os.listdir(DIR))
file_list = natsort.natsorted(file_list)

# 'strict' used because of
# https://github.com/mstamy2/PyPDF2/issues/244#issuecomment-206952235
merger = PdfFileMerger(strict=False)

for f_name in file_list:
  f = open(os.path.join(DIR, f_name), "rb")
  merger.append(f)

output = open(OUTPUT, "wb")
merger.write(output)

6
「引数リストが長すぎます」は、環境に割り当てられたシェルのバッファサイズを超えていることを示しています。これは実際にはツールの制限ではありません。そのような場合、バッチ処理できるので、Pythonへの切り替えはやり過ぎになる可能性があります。find input -name * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" date +%soutput- .pdf' && pdfunite output-*。pdf output.pdf(これにより、連続して処理される500ファイルのバッチが作成され、結果の一時ファイルが正しい順序でソートされます、適切な出力ファイルを作成します。後で一時ファイルをクリーンアップする必要があります)
enkiv2

4

これは私が使用する方法であり、機能し、実装が簡単です。これには、ここからダウンロードできるfpdfおよびfpdiライブラリの両方が必要です。

  • FPDF:http ://www.fpdf.org/en/download.php
  • FPDI:https ://www.setasign.com/products/fpdi/downloads
require('fpdf.php');
require('fpdi.php');

$files = ['doc1.pdf', 'doc2.pdf', 'doc3.pdf'];

$pdf = new FPDI();

foreach ($files as $file) {
    $pdf->setSourceFile($file);
    $tpl = $pdf->importPage(1, '/MediaBox');
    $pdf->addPage();
    $pdf->useTemplate($tpl);
}

$pdf->Output('F','merged.pdf');

4

私はPyMuPDF(MuPDFのPythonバインディング)の開発者の1人であることに偏っています。

あなたはそれを使ってあなたが望むものを簡単に行うことができます(そしてもっとたくさん)。スケルトンコードは次のように機能します。

#-------------------------------------------------
import fitz         # the binding PyMuPDF
fout = fitz.open()  # new PDF for joined output
flist = ["1.pdf", "2.pdf", ...]  # list of filenames to be joined

for f in flist:
    fin = fitz.open(f)  # open an input file
    fout.insertPDF(fin) # append f
    fin.close()

fout.save("joined.pdf")
#-------------------------------------------------

それだけです。ページ範囲のみを選択したり、目次をまとめたり、ページシーケンスを逆にしたり、ページの回転を変更したりするなど、いくつかのオプションを利用できます。

私たちはPyPiにいます。


3

私はChasmoのアイデアが好きですが、私は次のようなものの利点を使用するのが好きです

convert $(ls *.pdf) ../merged.pdf

複数のソースファイルを提供convertすると、それらが共通のPDFにマージされます。このコマンド.pdfは、実際のディレクトリの拡張子を持つすべてのファイルをmerged.pdf親ディレクトリにマージします。


5
これが元の質問とどの程度似ているかを考えると、これは回答ではなくコメントである必要があるようです。もう少し担当者がいると、コメントを投稿できるようになります。それまでは、回答を回避策として使用しないでください。
Nathan Tuggy、2015年

1
@Silfheedいいえ、質問に答えます!答えは多分もっと精巧なはずですが。
peterh-2015年

7
ベクターからラスターに移動して決して戻らない場合を除いて、postscriptまたはPDFファイルの変換は使用しないでください。これが悪い考えであると言っても過言ではありません。
markgalassi 2015年

13
$(ls *.pdf)単純なワイルドカードの代わりに使用する意味は何*.pdfですか?
firegurafiku 2015

さらに、@ firegurafikuの回答を参照すると、ls *.pdfワイルドカードを使用すると、マージされたファイルの順序を制御できなくなります。例では、次のリスト:1.pdf、2.pdf、3.pdf、...、10.pdf、...、100.pdfは実際には1.pdf、10.pdf、100のようにマージされます。 PDF、2.pdf、3.pdf(原因ファイルを注文Linuxの道をデフォルトに-ここにあなたがこの問題についての詳細は持っている- stackoverflow.com/q/22948042/1977012を)。
Egel、

0

これはコマンドラインソリューションではありませんが、macosユーザーに役立つ場合があります。

  1. PDFファイルを選択
  2. ハイライトされたファイルを右クリック
  3. [ クイックアクション] > [ PDFの作成]を選択します

0

無料でオープンソースのpdftoolsの使用を確認できます(免責事項:私は作成者です)。

基本的には、Latex pdfpagesパッケージへのPythonインターフェイスです。

PDFファイルを1つずつマージするには、次のコマンドを実行します。

pdftools --input-file file1.pdf --input-file file2.pdf --output output.pdf

ディレクトリ内のすべてのPDFファイルをマージするには、次のコマンドを実行できます。

pdftools --input-dir ./dir_with_pdfs --output output.pdf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.