Можно ли с помощью Python объединить отдельные файлы PDF?
Предполагая, что это так, мне нужно расширить это немного дальше. Я надеюсь перебрать папки в каталоге и повторить эту процедуру.
И я, возможно, испытываю удачу, но можно ли исключить страницу, содержащуюся в PDF-файлах (при создании моего отчета всегда создается дополнительная пустая страница).
Библиотека Pure-Python, созданная как набор инструментов PDF. Он способен:
* разбивать документы по страницам,
* объединять документы по страницам,
(и многое другое)
Вот пример программы, которая работает с обеими версиями.
#!/usr/bin/env pythonimport sys
try:fromPyPDF2importPdfFileReader,PdfFileWriterexceptImportError:from pyPdf importPdfFileReader,PdfFileWriterdef pdf_cat(input_files, output_stream):
input_streams =[]try:# First open all the files, then produce the output file, and# finally close the input files. This is necessary because# the data isn't read from the input files until the write# operation. Thanks to# /programming/6773631/problem-with-closing-python-pypdf-writing-getting-a-valueerror-i-o-operation/6773733#6773733for input_file in input_files:
input_streams.append(open(input_file,'rb'))
writer =PdfFileWriter()for reader in map(PdfFileReader, input_streams):for n in range(reader.getNumPages()):
writer.addPage(reader.getPage(n))
writer.write(output_stream)finally:for f in input_streams:
f.close()if __name__ =='__main__':if sys.platform =="win32":import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
pdf_cat(sys.argv[1:], sys.stdout)
У меня работает только с открытием в двоичном режиме (входные потоки, а также выходной поток). open(input_file), 'r+b', а вместо sys.stdout использую output_stream = open('result.pdf', 'w+b').
Симеон Борко
@SimeonBorko Отбросьте +, это означает «чтение и запись», и ни один файл не читается и не записывается одновременно. Я добавил поддержку вывода поддержки Windows на основе stackoverflow.com/questions/2374427/… .
Жиль 'SO- перестань быть злом'
PyPDF2 / 3 нестабилен, как я могу объединить файлы PDF без PyPDF2 / 3.
GoingMyWay
2
Мне пришлось использовать sys.stdout.bufferPython 3.6.8 (Linux)
fromPyPDF2importPdfFileMerger
pdfs =['file1.pdf','file2.pdf','file3.pdf','file4.pdf']
merger =PdfFileMerger()for pdf in pdfs:
merger.append(pdf)
merger.write("result.pdf")
merger.close()
Вы можете передавать дескрипторы файлов вместо путей к файлам, если хотите.
Слияние файлов
Если вам нужен более детальный контроль слияния, существует mergeметод PdfMerger, который позволяет вам указать точку вставки в выходном файле, что означает, что вы можете вставлять страницы в любом месте файла. Этот appendметод можно представить как mergeточку вставки в конце файла.
например
merger.merge(2, pdf)
Здесь мы вставляем в выходной файл весь PDF-файл, но на странице 2.
Диапазоны страниц
Если вы хотите контролировать, какие страницы добавляются из определенного файла, вы можете использовать pagesаргумент ключевого слова appendи merge, передавая кортеж в форме (start, stop[, step])(как обычная rangeфункция).
например
merger.append(pdf, pages=(0,3))# first 3 pages
merger.append(pdf, pages=(0,6,2))# pages 1,3, 5
Если вы укажете недопустимый диапазон, вы получите расширение IndexError.
Примечание: также, чтобы файлы не оставались открытыми, метод PdfFileMergers close следует вызывать после записи объединенного файла. Это гарантирует своевременное закрытие всех файлов (ввод и вывод). Жаль, что PdfFileMergerон не реализован в качестве диспетчера контекста, поэтому мы можем использовать withключевое слово, избежать явного вызова закрытия и получить легкую защиту от исключений.
Вы также можете посмотреть pdfcatсценарий, предоставленный как часть pypdf2. Потенциально вы можете вообще избежать необходимости писать код.
В github PyPdf2 также есть пример кода, демонстрирующий слияние.
Объединить все файлы pdf, которые присутствуют в каталоге
Поместите файлы pdf в каталог. Запустить программу. Вы получаете один PDF-файл со всеми объединенными PDF-файлами.
import os
fromPyPDF2importPdfFileMerger
x =[a for a in os.listdir()if a.endswith(".pdf")]
merger =PdfFileMerger()for pdf in x:
merger.append(open(pdf,'rb'))with open("result.pdf","wb")as fout:
merger.write(fout)
pdfrwБиблиотека может сделать это довольно легко, при условии , что вам не нужно , чтобы сохранить закладки и аннотации, и ваши PDF - файлы не шифруются. cat.pyпример сценария конкатенации, иsubset.py пример сценария разбиения страницы.
Соответствующая часть сценария конкатенации - предполагает, inputsчто это список имен входных файлов и outfnимя выходного файла:
from pdfrw importPdfReader,PdfWriter
writer =PdfWriter()for inpfn in inputs:
writer.addpages(PdfReader(inpfn).pages)
writer.write(outfn)
Как видно из этого, было бы довольно легко пропустить последнюю страницу, например, что-то вроде:
writer.addpages(PdfReader(inpfn).pages[:-1])
Отказ от ответственности: я являюсь основным pdfrwавтором.
fromPyPDF2importPdfFileMergerimport webbrowser
import os
dir_path = os.path.dirname(os.path.realpath(__file__))def list_files(directory, extension):return(f for f in os.listdir(directory)if f.endswith('.'+ extension))
pdfs = list_files(dir_path,"pdf")
merger =PdfFileMerger()for pdf in pdfs:
merger.append(open(pdf,'rb'))with open('result.pdf','wb')as fout:
merger.write(fout)
webbrowser.open_new('file://'+ dir_path +'/result.pdf')
Небольшая вариация с использованием словаря для большей гибкости (например, сортировка, дедупликация):
import os
fromPyPDF2importPdfFileMerger# use dict to sort by filepath or filename
file_dict ={}for subdir, dirs, files in os.walk("<dir>"):for file in files:
filepath = subdir + os.sep + file
# you can have multiple endswithif filepath.endswith((".pdf",".PDF")):
file_dict[file]= filepath
# use strict = False to ignore PdfReadError: Illegal character error
merger =PdfFileMerger(strict=False)for k, v in file_dict.items():print(k, v)
merger.append(v)
merger.write("combined_result.pdf")
Я использовал pdf unite в терминале Linux, используя подпроцесс (предполагается, что в каталоге существуют one.pdf и two.pdf), и цель состоит в том, чтобы объединить их с three.pdf
open(input_file), 'r+b'
, а вместо sys.stdout используюoutput_stream = open('result.pdf', 'w+b')
.+
, это означает «чтение и запись», и ни один файл не читается и не записывается одновременно. Я добавил поддержку вывода поддержки Windows на основе stackoverflow.com/questions/2374427/… .sys.stdout.buffer
Python 3.6.8 (Linux)Вы можете использовать PyPdf2 сек
PdfMerger
класс.Объединение файлов
Вы можете просто объединить файлы с помощью
append
метода.Вы можете передавать дескрипторы файлов вместо путей к файлам, если хотите.
Слияние файлов
Если вам нужен более детальный контроль слияния, существует
merge
методPdfMerger
, который позволяет вам указать точку вставки в выходном файле, что означает, что вы можете вставлять страницы в любом месте файла. Этотappend
метод можно представить какmerge
точку вставки в конце файла.например
Здесь мы вставляем в выходной файл весь PDF-файл, но на странице 2.
Диапазоны страниц
Если вы хотите контролировать, какие страницы добавляются из определенного файла, вы можете использовать
pages
аргумент ключевого словаappend
иmerge
, передавая кортеж в форме(start, stop[, step])
(как обычнаяrange
функция).например
Если вы укажете недопустимый диапазон, вы получите расширение
IndexError
.Примечание: также, чтобы файлы не оставались открытыми, метод
PdfFileMerger
s close следует вызывать после записи объединенного файла. Это гарантирует своевременное закрытие всех файлов (ввод и вывод). Жаль, чтоPdfFileMerger
он не реализован в качестве диспетчера контекста, поэтому мы можем использоватьwith
ключевое слово, избежать явного вызова закрытия и получить легкую защиту от исключений.Вы также можете посмотреть
pdfcat
сценарий, предоставленный как часть pypdf2. Потенциально вы можете вообще избежать необходимости писать код.В github PyPdf2 также есть пример кода, демонстрирующий слияние.
источник
Объединить все файлы pdf, которые присутствуют в каталоге
Поместите файлы pdf в каталог. Запустить программу. Вы получаете один PDF-файл со всеми объединенными PDF-файлами.
источник
pdfrw
Библиотека может сделать это довольно легко, при условии , что вам не нужно , чтобы сохранить закладки и аннотации, и ваши PDF - файлы не шифруются.cat.py
пример сценария конкатенации, иsubset.py
пример сценария разбиения страницы.Соответствующая часть сценария конкатенации - предполагает,
inputs
что это список имен входных файлов иoutfn
имя выходного файла:Как видно из этого, было бы довольно легко пропустить последнюю страницу, например, что-то вроде:
Отказ от ответственности: я являюсь основным
pdfrw
автором.источник
Можно ли с помощью Python объединить отдельные файлы PDF?
Да.
В следующем примере все файлы в одной папке объединяются в один новый PDF-файл:
источник
Репозиторий Git: https://github.com/mahaguru24/Python_Merge_PDF.git
источник
здесь http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/ дает решение.
так же:
источник
Небольшая вариация с использованием словаря для большей гибкости (например, сортировка, дедупликация):
источник
Я использовал pdf unite в терминале Linux, используя подпроцесс (предполагается, что в каталоге существуют one.pdf и two.pdf), и цель состоит в том, чтобы объединить их с three.pdf
источник