Рубрики
Без рубрики

Расщепление и объединение PDFS с Python

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Pypdf2 Пакет позволяет делать много полезных операций на существующих PDF. В этой статье мы узнаем, как разделить один PDF на несколько небольших. Мы также узнаем, как взять серию PDFS и присоединиться к ним вместе в один PDF.

Начиная

PYPDF2 не приходит как часть стандартной библиотеки Python, поэтому вам нужно будет установить ее самостоятельно. Предпочтительный способ сделать это – использовать Пип Отказ

pip install pypdf2

Теперь, когда у нас установлено PypDF2, давайте узнаем, как разделить и объединить PDFS!

Разделение PDFS.

Пакет PypDF2 дает вам возможность разбить один PDF в несколько. Вам просто нужно сказать, сколько вам нужных страниц. Для этого примера мы скачаем Форма W9 из IRS и петли на всех шесть своих страниц. Мы расценимся с каждой страницы и превратим его в свой автономный PDF.

Давайте узнаем, как:

# pdf_splitter.py

import os
from PyPDF2 import PdfFileReader, PdfFileWriter


def pdf_splitter(path):
    fname = os.path.splitext(os.path.basename(path))[0]

    pdf = PdfFileReader(path)
    for page in range(pdf.getNumPages()):
        pdf_writer = PdfFileWriter()
        pdf_writer.addPage(pdf.getPage(page))

        output_filename = '{}_page_{}.pdf'.format(
            fname, page+1)

        with open(output_filename, 'wb') as out:
            pdf_writer.write(out)

        print('Created: {}'.format(output_filename))

if __name__ == '__main__':
    path = 'w9.pdf'
    pdf_splitter(path)

Для этого примера нам нужно импортировать как Pdffilereader и PdffileWriter Отказ Тогда мы создаем забавную маленькую функцию под названием pdf_splitter Отказ Это принимает путь ввода PDF. Первая строка этой функции будет схватить имя входного файла, минус расширение. Далее мы открываем PDF вверх и создаем объект Reader. Затем мы зацикливаем все страницы, используя объект Reader GetNUpages метод.

Внутри для Цикл, мы создаем экземпляр PdffileWriter Отказ Затем мы добавляем страницу на нашем объекте Writer, используя его addpage . метод. Этот метод принимает объект страницы, поэтому чтобы получить объект страницы, мы называем объект Reader GetPage метод. Теперь мы добавили одну страницу к нашему объекту писателя. Следующим шагом является создание уникального имени файла, которое мы делаем с помощью исходного имени файла плюс слово «Page», а также номер страницы + 1. Мы добавляем, что номера страниц Pypdf2 находятся на нуля, поэтому страница 0 на самом деле Страница 1.

Наконец мы открываем новое имя файла в бинарном режиме и используем объект PDF Writer Написать Метод для записи содержимого объекта на диск.

Объединение нескольких PDF вместе

Теперь, когда у нас есть куча PDFS, давайте узнаем, как мы можем принять их и объединить их вместе. Одно полезное использование для этого является для предприятий, чтобы объединить свои капли в одном PDF. Мне нужно было объединить PDF для работы и для развлечения. Один проект, который прилипает в моем уме – это сканирование документов. В зависимости от того, что у вас есть сканер, вы можете в конечном итоге сканирование документа на несколько PDF-файлов, поэтому возможность присоединиться к ним вместе, может быть замечательным.

Когда исчезли оригинал Pypdf, единственный способ получить его, чтобы объединить несколько PDFS вместе, было похоже:

# pdf_merger.py

import glob
from PyPDF2 import PdfFileWriter, PdfFileReader

def merger(output_path, input_paths):
    pdf_writer = PdfFileWriter()

    for path in input_paths:
        pdf_reader = PdfFileReader(path)
        for page in range(pdf_reader.getNumPages()):
            pdf_writer.addPage(pdf_reader.getPage(page))

    with open(output_path, 'wb') as fh:
        pdf_writer.write(fh)


if __name__ == '__main__':
    paths = glob.glob('w9_*.pdf')
    paths.sort()
    merger('pdf_merger.pdf', paths)

Здесь мы создаем PdffileWriter объект и несколько Pdffilereader объекты. Для каждого PDF-пути мы создаем Pdffilereader Объект, а затем петля по его страницам, добавляя каждую страницу на нашем объекте писателя. Затем мы выписываем содержимое объекта Writer на диск.

Pypdf2 сделал это немного проще, создав Pdffilemerger объект:

# pdf_merger2.py

import glob
from PyPDF2 import PdfFileMerger

def merger(output_path, input_paths):
    pdf_merger = PdfFileMerger()
    file_handles = []
    
    for path in input_paths:
        pdf_merger.append(path)
        
    with open(output_path, 'wb') as fileobj:
        pdf_merger.write(fileobj)
        
if __name__ == '__main__':
    paths = glob.glob('w9_*.pdf')
    paths.sort()
    merger('pdf_merger2.pdf', paths)

Здесь нам просто нужно создать Pdffilemerger Объект, а затем петлю через пути PDF, добавляя их в наш объект слияния. PYPDF2 автоматически добавит весь документ, чтобы вам не нужно питаться через все страницы каждого документа. Тогда мы просто пишем это на диск.

Pdffilemerger Класс также имеет слияние Метод, который вы можете использовать. Это определение кода выглядит так:

def merge(self, position, fileobj, bookmark=None, pages=None, import_bookmarks=True):
        """
        Merges the pages from the given file into the output file at the
        specified page number.

        :param int position: The *page number* to insert this file. File will
            be inserted after the given number.

        :param fileobj: A File Object or an object that supports the standard read
            and seek methods similar to a File Object. Could also be a
            string representing a path to a PDF file.

        :param str bookmark: Optionally, you may specify a bookmark to be applied at
            the beginning of the included file by supplying the text of the bookmark.

        :param pages: can be a :ref:`Page Range ` or a ``(start, stop[, step])`` tuple
            to merge only the specified range of pages from the source
            document into the output document.

        :param bool import_bookmarks: You may prevent the source document's bookmarks
            from being imported by specifying this as ``False``.
        """

В основном метод Merge позволяет вам сказать PypDF, где объединить страницу по номеру страницы. Поэтому, если вы создали объект слияния с 3 страницами в нем, вы можете сказать объект слияния, чтобы объединить следующий документ в определенной позиции. Это позволяет разработчику сделать некоторые довольно сложные слияние операций. Попробуйте посмотрите, что вы можете сделать!

Обертывание

Pypdf2 – мощный и полезный пакет. Я использовал его и в течение многих лет, чтобы работать на различных проектах домой и работы. Если вам нужно манипулировать существующими PDFS, то этот пакет может быть прямо вверх по вашему аллею!

Связанное чтение

  • Простой пошаговый ReportLab Руководство
  • ReportLab 101: TextObject.
  • ReportLab – Как добавить графики и графики
  • Извлечение PDF метаданных и текст с Python