여러 PDF 파일을 하나의 PDF로 병합 / 변환


1069

여러 PDF 파일을 하나의 큰 PDF 파일로 병합 / 변환하려면 어떻게해야합니까?

다음을 시도했지만 대상 파일의 내용이 예상과 다릅니다.

convert file1.pdf file2.pdf merged.pdf

매우 간단한 / 기본 명령 줄 (CLI) 솔루션이 필요합니다. 병합 / 변환의 출력을 똑바로 파이프 할 수있는 것이 가장 좋습니다 (pdf2ps 이전의 질문에서 원래 시도한 것처럼 : Linux pipeing (convert-> pdf2ps-> lp) ).


3
ymmv, 그러나 이것은 출력 파일에서 pdfunite만큼 해상도가 좋지 않은 것 같으며 파일 크기가 pdfunite의 출력보다 큽니다
sabujp


이러한 솔루션에 의해 링크가 유지되거나 유지되지 않을 때마다이 게시물에서 설명 합니다. 링크를 유지하려면 (아마 다른 주석과 함께) 명령 행 인터페이스를 원하는 경우 pdftk를 사용하고 그래픽 사용자 인터페이스를 원하는 경우 pdfsam을 사용하고 웹 인터페이스를 원하는 경우 sejda를 사용하십시오.
Clément

답변:


1387

pdfunitepoppler의 일부인 것을 고려하면 설치 가능성이 높으며 사용법도 다음보다 간단합니다 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

425
out.pdf를 제공해야합니다. 그렇지 않으면 명령의 마지막 파일 인 sigh를 덮어 씁니다.
mlissner

10
pdfunite 용 패키지는 데비안의 poppler-utils이지만 이전 데비안 릴리스에는 없을 수 있습니다.
Jocelyn delalande

16
이것을 추천 할 수 없습니다. 결과 PDF의 크기가 너무 큽니다. 예를 들어 Pdfunite는 75MB 파일을 제공하지만 Ghostscript는 모든 것을 1MB로 압축합니다.
Torben

64
pdfunite *.pdf out.pdf해당 디렉토리에 다른 pdf가없고 순서가 "*"로 유지된다고 가정하면 다음을 사용할 수 있습니다 . 파일 이름이 유지되지 않으면 filename_ {0..9} .pdf 범위를 사용하여 문제를 해결합니다.
lepe

548

좋은 고스트 스크립트를 사용해보십시오.

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를 15MB로 줄였습니다. 좋은 고스트 스크립트로이 모든 것들이 여기 있습니다 :

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

건배!!


27
좋은 팁, gs매우 빠르게 실행되며 많이 압축됩니다. 그러나이 매개 변수를 사용한 후 품질이 크게 향상되었습니다.-dPDFSETTINGS=/prepress
Adriano P

3
그 발견 -dPDFSETTINGS=/prepress이 너무 넓은 성가신 가로 스크롤 막대를 강제로 페이지를 회전의 아주 좋은 효과가 있습니다.
Robert Smith

24
다음 줄을 추가하면 .bash_profile멋진 지름길 pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }을 찾을 수 있습니다. 명령을 많이 사용해야하는 경우 입력 내용이 절약됩니다. 사용법은 다음과 같습니다.pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben

2
-dBATCH flag에 대한 설명을 찾으려고했지만 실패했습니다. 남자들조차도 아무 말도하지 않습니다. 그러나 위대하고 추가 프로그램이 없습니다!
Michal Gonda

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하나 개 이상의 입력 파일을 변환 할 수 있습니다."
MiniMax

513

죄송합니다 .Google과 약간의 행운을 사용하여 스스로 답을 찾을 수있었습니다. :)

관심있는 사람들을 위해;

데비안 서버에 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
유령 스크립트를 사용하는 것도 효과가있을 수 있습니다. gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl

15
pdftk는 암호화 된 PDF를 병합 할 수 있지만 pdfunite는 캔트 할 수 없습니다.
Thomas

3
기본 옵션으로 변환하기 위해 pdftk로 더 나은 해상도를 제공합니다.
Kiran K Telukunta

13
pdftk file1.pdf file2.pdf cat output out.pdf의지 출력 병합 된 파일로out.pdf
jmiserez

2
pdftk종속성이 없어 EL7 시스템에 사용할 수 없습니다 libgcj.
코더

72

파일이 여러 개이고 이름을 하나씩 입력하지 않으려는 경우 가장 쉬운 솔루션입니다.

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


2
이것은 지금까지 가장 쉬운 것 같습니다
baxx

1
qpdf 문서에 브레이크 하이퍼 링크로 보인다
데이비드 Granqvist에게

2
복잡한 옵션부터 시작하기는 어렵지만 qpdf는 매우 편리하고 강력한 도구입니다. 온라인 설명서를 볼 수 있습니다 여기에
조나단 Holvey

확실히 가장 편리합니다!
럭키

54

또한 a.pdf와 b.pdf의 내용으로 pdfjoin a.pdf b.pdf새로운 것을 만들 것입니다b-joined.pdf


5
이것은 간결하지만 간결하지만 하이퍼 링크를 끊습니다.
밝은 별

3
pdfjoin (pdflatex)은 페이지가 많은 파일에서 실패합니다. 1k 페이지 파일로 병합하지 못했습니다.
mdrozdziel

pdfjoin은 주석 또는 그래픽 이외의 추가 항목을
깨뜨립니다

"URW Palladio L"글꼴은 페이지를 pdfjoining 한 후에 보이지 않습니다.
v_2e

9
pdfunite는 일반적으로 잘 작동하지만 "구현되지 않은 기능 : 암호화 된 파일을 병합 할 수 없습니다"라고 표시되면 pdfjoin이 좋은 대안입니다. 어떤 이유로 든 pdfjoin은 암호화에 대해 불평하지 않습니다.
Calaf 2019

38

convert 명령을 직접 사용할 수 있습니다.

예 :

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

40
이것은 무손실이 아닙니다.
Ben Ruijl

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

21
여기에는 모든 것을 래스터 이미지로 변환하는 것이 포함됩니다. 특히 텍스트 기반 PDF를 처리 할 때 최고는 아닙니다.
익룡

5
OP가 작동하지 않는 것으로 묘사 된 내용의 거의 사본
user829755

15
벡터에서 래스터로 이동하고 다시는 돌아 가지 않는 한 포스트 스크립트 또는 PDF 파일에 변환을 사용하지 마십시오. 이것이 어떤 나쁜 생각인지 과장하기는 어렵습니다.
markgalassi

32

pdfunite전체 PDF를 병합하는 것이 좋습니다. 예를 들어, file1.pdf의 2-7 페이지와 file2.pdf의 1,3,4 페이지를 원하면 pdfseparate각 페이지에 대해 파일을 별도의 PDF로 분할하여를 제공해야 pdfunite합니다.

이 시점에서 더 많은 옵션을 가진 프로그램을 원할 것입니다. qpdfPDF를 조작 할 때 찾은 최고의 유틸리티입니다. pdftk더 크고 느리며 Red Hat / Fedora는 gcj에 의존하기 때문에 패키지하지 않습니다. 다른 PDF 유틸리티에는 Mono 또는 Python 종속성이 있습니다. 나는 발견 qpdf사용하는 것보다 훨씬 작은 출력 파일을 생성 pdfseparate하고 pdfunite30 페이지 출력 PDF, 970kB 대 1,6450 킬로바이트로 페이지를 조립. 더 많은 옵션을 제공하기 때문에 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

아파치 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의 두 PDF를 간단히 병합하는 데 몇 분이 걸리고 40MB 파일이 생성되었습니다! pdftools동일한 파일 크기로 즉시 완료됩니다.
supergra

10

sejda-console , 무료 및 오픈 소스를 사용할 수 있습니다 . 압축을 풀고 실행 sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

그것은 북마크, 링크 주석, 아크로 폼 등을 보존합니다. 실제로 당신이 가지고 놀 수있는 많은 옵션이 있습니다 sejda-console merge -h.


OMHO는 이러한 유형의 작업을 수행하는 데 가장 적합한 도구
mario ruiz

8

다운로드 한 모든 이미지를 하나의 pdf로 변환하려면 다음을 실행하십시오.

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


6
벡터에서 래스터로 이동하고 다시는 돌아 가지 않는 한 포스트 스크립트 또는 PDF 파일에 변환을 사용하지 마십시오. 이것이 어떤 나쁜 생각인지 과장하기는 어렵습니다.
markgalassi

6

나는 pdfunite추천을 두 번째로한다 . 그러나 나는 점점지고 있었다Argument list too long > 2k PDF 파일을 병합하려고 할 오류 발생했습니다.

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 "$ @"output- date +%s.pdf'&& pdfunite output- *. pdf output.pdf (이것은 500 개의 파일을 연속적으로 처리하여 결과적으로 생성 된 임시 파일을 올바른 순서로 정렬합니다. , 적절한 출력 파일을 생성합니다. 이후에 임시 파일을 정리해야합니다.)
enkiv2

4

다음은 작동하고 구현하기 쉬운 방법입니다. 여기에서 다운로드 할 수있는 fpdffpdi 라이브러리 가 모두 필요합니다 .

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 바인딩) 개발자 중 한 명인 편견입니다.

원하는 것을 쉽게 할 수 있습니다. 스켈레톤 코드는 다음과 같이 작동합니다 :

#-------------------------------------------------
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

1
@Silfheed 아니오, 질문에 답변합니다! 대답은 더 정교해야 할 것입니다.
peterh-복원 모니카

7
벡터에서 래스터로 이동하고 다시는 돌아 가지 않는 한 포스트 스크립트 또는 PDF 파일에 변환을 사용하지 마십시오. 이것이 어떤 나쁜 생각인지 과장하기는 어렵습니다.
markgalassi

13
$(ls *.pdf)간단한 와일드 카드 대신 사용하는 요점은 무엇입니까 *.pdf?
firegurafiku

또한 @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 파일을 하나씩 병합하려면 다음을 실행하십시오.

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.