일부 잠긴 PDF를 병합해야 하며 모든 입력 PDF가 출력 PDF의 홀수 페이지에서 시작되도록 하고 싶습니다.
예: A.pdf
3페이지가 있습니다. B.pdf
4페이지가 있습니다. 나원하지 않는다내 출력에는 7 페이지가 있습니다. 내가 원하는 것은 1-3페이지가 에서 나오고 A.pdf
, 4페이지가 비어 있고, 5-8페이지가 에서 나오는 8페이지 PDF입니다 B.pdf
. 어떻게 해야 하나요?
pdftk에 대해 알고 있지만 매뉴얼 페이지에서 그러한 옵션을 찾을 수 없습니다.
답변1
이것pypdf 라이브러리Python 코드를 작성하려는 경우 이러한 작업이 쉬워집니다. 아래 코드를 pdf-cat-even
(또는 원하는 대로) 스크립트에 저장하고 실행 가능하게 만든 다음( chmod +x pdf-cat-even
) 실행하고 출력을 파일로 리디렉션합니다. ./pdf-cat-even a.pdf b.pdf >concatenated.pdf
현재 버전의 pypdf는 파이프에 쓰기를 지원하지 않습니다.
#!/usr/bin/env python3
import copy, sys
from pypdf import PdfWriter, PdfReader
output = PdfWriter()
output_page_number = 0
alignment = 2 # to align on even pages
for filename in sys.argv[1:]:
# This code is executed for every file in turn
input = PdfReader(filename)
for p in input.pages:
# This code is executed for every input page in turn
output.add_page(p)
output_page_number += 1
while output_page_number % alignment != 0:
output.add_blank_page()
output_page_number += 1
output.write(sys.stdout.buffer)
답변2
첫 번째 단계는 빈 페이지가 있는 PDF 파일을 생성하는 것입니다. 많은 프로그램(LibreOffice/OpenOffice, inkscape, (La)TeX, scribus 등)을 사용하여 쉽게 이 작업을 수행할 수 있습니다.
그런 다음 필요한 경우 다음 빈 페이지를 포함하세요.
pdftk A.pdf empty_page.pdf B.pdf output result.pdf
스크립트를 사용하여 이를 자동화하려면 예를 들어 pdftk file.pdf dump_data | grep NumberOfPages | egrep -o '[0-9]*'
페이지 수를 추출하는 데 사용할 수 있습니다.
답변3
자일스의 대답저에게는 효과가 있었지만 많은 파일을 병합해야 하기 때문에 텍스트 파일에서 파일 이름을 읽을 수 있으면 더 편리할 것입니다. 이를 위해 Giles의 코드를 약간 수정했습니다. 아마도 다른 사람들에게도 도움이 될 것입니다.
#!/usr/bin/env python
# requires PyPdf library, version 1.13 or above -
# its homepage is http://pybrary.net/pyPdf/
# running: ./this-script-name file-with-pdf-list > output.pdf
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0
# every new file should start on (n*alignment + 1)th page
# (with value 2 this means starting always on an odd page)
alignment = 2
listoffiles = open(sys.argv[1]).read().splitlines()
for filename in listoffiles:
# This code is executed for every file in turn
input = PdfFileReader(open(filename))
for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
# This code is executed for every input page in turn
output.addPage(p)
output_page_number += 1
while output_page_number % alignment != 0:
output.addBlankPage()
output_page_number += 1
output.write(sys.stdout)
답변4
이것은 PyPDF2 및 python3의 코드입니다.
#!/usr/bin/env python
# requires PyPdf2 library, version 1.26 or above -
# its homepage is https://pythonhosted.org/PyPDF2/index.html
# running: ./this-script-name output.pdf file-with-pdf-list
import copy, sys
from PyPDF2 import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0
# every new file should start on (n*alignment + 1)th page
# (with value 2 this means starting always on an odd page)
alignment = 2
for filename in sys.argv[2:]:
# This code is executed for every file in turn
input = PdfFileReader(open(filename, "rb"))
output.appendPagesFromReader(input)
output_page_number += input.getNumPages()
while output_page_number % alignment != 0:
output.addBlankPage()
output_page_number += 1
output.write(open(sys.argv[1], "wb"))