<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>python programming on File Format Blog</title>
    <link>https://blog.fileformat.com/ru/tag/python-programming/</link>
    <description>Recent content in python programming on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ru</language>
    <lastBuildDate>Wed, 29 Jan 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/ru/tag/python-programming/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Работа с PDF файлами в Python</title>
      <link>https://blog.fileformat.com/ru/programming/working-with-pdf-files-in-python/</link>
      <pubDate>Wed, 29 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/ru/programming/working-with-pdf-files-in-python/</guid>
      <description>Узнайте, как извлекать текст из PDF в Python, поворачивать страницы PDF, объединять несколько PDF, разделять PDF и добавлять водяные знаки в ваши PDF с использованием библиотек Python и простых примеров кода.</description>
      <content:encoded><![CDATA[<p><strong>Последнее обновление</strong>: 29 января 2025</p>
<figure class="align-center ">
    <img loading="lazy" src="images/working-with-pdf-files-in-python.png#center"
         alt="Заголовок - Работа с PDF файлами в Python"/> 
</figure>

<p>В этой статье мы расскажем вам, <strong>как работать с PDF-файлами, используя Python</strong>. Для этого мы воспользуемся библиотекой <a href="https://pypi.org/project/pypdf/"><strong>pypdf</strong></a>.</p>
<p>С помощью библиотеки <strong>pypdf</strong> мы покажем, как выполнить следующие операции в Python:</p>
<ul>
<li>Извлечение текста из PDF</li>
<li>Поворот страниц PDF</li>
<li>Объединение нескольких PDF</li>
<li>Разделение PDF на отдельные файлы</li>
<li>Добавление водяных знаков на страницы PDF</li>
</ul>
<p><em><strong>Примечание</strong>: Эта статья охватывает множество ценных деталей, так что не стесняйтесь переходить к разделам, которые интересуют вас больше всего! Контент организован для простой навигации, так что вы сможете быстро сосредоточиться на наиболее актуальных для вас темах.</em></p>
<figure class="align-center ">
    <img loading="lazy" src="images/pdf-manipulation-with-pypdf.webp#center"
         alt="Иллюстрация - Работа с PDF файлами в Python"/> 
</figure>

<h2 id="примеры-кода">Примеры кода</h2>
<p>Вы можете загрузить весь код, использованный в этой статье, по следующей ссылке. Она включает код, входные и выходные файлы.</p>
<ul>
<li><a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python">Примеры кода и входные файлы для работы с PDF файлами в Python</a></li>
</ul>
<h2 id="установка-pypdf">Установка pypdf</h2>
<p>Чтобы установить pypdf, просто выполните следующую команду в своем терминале или командной строке:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip install pypdf
</span></span></code></pre></div><p><strong>Примечание:</strong> Эта команда чувствительна к регистру.</p>
<h2 id="1-извлечение-текста-из-pdf-файла-с-использованием-python">1. Извлечение текста из PDF файла с использованием Python</h2>
<script type="application/javascript" src="https://gist.github.com/fileformat-blog-gists/e2b43a49dbad9e89745f8f9777817acb.js?file=extract-text-from-pdf-using-pypdf-in-python.py"></script>

<h3 id="объяснение-кода"><strong>Объяснение кода</strong></h3>
<p><strong>1. Создание объекта чтения PDF</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>reader <span style="color:#f92672">=</span> PdfReader(pdf_file)
</span></span></code></pre></div><ul>
<li><code>PdfReader(pdf_file)</code> загружает PDF файл в <strong>объект чтения</strong>.</li>
<li>Этот объект позволяет получить доступ к страницам и их содержимому.</li>
</ul>
<p><strong>2. Перебор страниц</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">for</span> page_number, page <span style="color:#f92672">in</span> enumerate(reader<span style="color:#f92672">.</span>pages, start<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>):
</span></span></code></pre></div><ul>
<li><code>reader.pages</code> возвращает список страниц в PDF.</li>
<li><code>enumerate(..., start=1)</code> присваивает <strong>номер страницы, начиная с 1</strong>.</li>
</ul>
<p><strong>3. Печать извлеченного текста</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Страница </span><span style="color:#e6db74">{</span>page_number<span style="color:#e6db74">}</span><span style="color:#e6db74">:&#34;</span>)
</span></span><span style="display:flex;"><span>    print(page<span style="color:#f92672">.</span>extract_text())
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">&#34;-&#34;</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">50</span>)  <span style="color:#75715e"># Разделитель для удобства чтения</span>
</span></span></code></pre></div><ul>
<li><code>page.extract_text()</code> извлекает текстовое содержимое из текущей страницы.</li>
<li>Скрипт выводит извлеченный текст вместе с <strong>номером страницы</strong>.</li>
<li><code>&quot;-&quot; * 50</code> печатает строку-разделитель (<code>--------------------------------------------------</code>) для удобства чтения.</li>
</ul>
<h3 id="входной-pdf-файл-использованный-в-коде">Входной PDF файл, использованный в коде</h3>
<ul>
<li><strong>Входной файл:</strong> <a href="https://github.com/fileformat-blog-gists/code/blob/main/working-with-pdf-files-in-python/pdf-to-extract-text/">Ссылка для загрузки</a></li>
</ul>
<h3 id="выходные-данные-кода">Выходные данные кода</h3>
<script type="application/javascript" src="https://gist.github.com/fileformat-blog-gists/ab6976aa3a0fc2999093f5f9320a9e20.js?file=Output%20-%20extract-text-from-pdf-using-pypdf-in-python.txt"></script>

<h2 id="2-поворот-страниц-pdf-используя-python">2. Поворот страниц PDF, используя Python</h2>
<script type="application/javascript" src="https://gist.github.com/fileformat-blog-gists/760d480cfede4178296c353d60662e1a.js?file=rotate-pdf-page-using-pypdf-in-python.py"></script>

<h3 id="объяснение-кода-1">Объяснение кода</h3>
<p>Код в целом поворачивает <strong>первую страницу</strong> на <strong>90° по часовой стрелке</strong> и сохраняет измененный PDF без воздействия на другие страницы.</p>
<p><strong>1. Импорт требуемых классов</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> pypdf <span style="color:#f92672">import</span> PdfReader, PdfWriter
</span></span></code></pre></div><ul>
<li><code>PdfReader</code>: Читает входной PDF.</li>
<li><code>PdfWriter</code>: Создает новый PDF с изменениями.</li>
</ul>
<p><strong>2. Определите пути к входным и выходным файлам</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>input_pdf <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pdf-to-rotate/input.pdf&#34;</span>
</span></span><span style="display:flex;"><span>output_pdf <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pdf-to-rotate/rotated_output.pdf&#34;</span>
</span></span></code></pre></div><ul>
<li>Скрипт читает из <code>input.pdf</code> и сохраняет измененный файл как <code>rotated_output.pdf</code>.</li>
</ul>
<p><strong>3. Чтение PDF и создание объекта Writer</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>reader <span style="color:#f92672">=</span> PdfReader(input_pdf)
</span></span><span style="display:flex;"><span>writer <span style="color:#f92672">=</span> PdfWriter()
</span></span></code></pre></div><ul>
<li><code>reader</code> загружает существующий PDF.</li>
<li><code>writer</code> используется для хранения измененных страниц.</li>
</ul>
<p><strong>4. Поворот первой страницы на 90 градусов</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>page <span style="color:#f92672">=</span> reader<span style="color:#f92672">.</span>pages[<span style="color:#ae81ff">0</span>]
</span></span><span style="display:flex;"><span>page<span style="color:#f92672">.</span>rotate(<span style="color:#ae81ff">90</span>)  <span style="color:#75715e"># Поворот на 90 градусов по часовой стрелке</span>
</span></span><span style="display:flex;"><span>writer<span style="color:#f92672">.</span>add_page(page)
</span></span></code></pre></div><ul>
<li>Извлекает <strong>первую страницу</strong>, поворачивает ее <strong>на 90 градусов</strong> и добавляет в новый PDF.</li>
</ul>
<p><strong>5. Добавление оставшихся страниц без изменений</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">1</span>, len(reader<span style="color:#f92672">.</span>pages)):
</span></span><span style="display:flex;"><span>    writer<span style="color:#f92672">.</span>add_page(reader<span style="color:#f92672">.</span>pages[i])
</span></span></code></pre></div><ul>
<li>Перебирает оставшиеся страницы и добавляет их как есть.</li>
</ul>
<p><strong>6. Сохранение нового PDF</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(output_pdf, <span style="color:#e6db74">&#34;wb&#34;</span>) <span style="color:#66d9ef">as</span> file:
</span></span><span style="display:flex;"><span>    writer<span style="color:#f92672">.</span>write(file)
</span></span></code></pre></div><ul>
<li>Открывает <code>rotated_output.pdf</code> в двоичном режиме записи и сохраняет новый PDF.</li>
</ul>
<p><strong>7. Печать подтверждения</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Повернутая страница сохранена в </span><span style="color:#e6db74">{</span>output_pdf<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><ul>
<li>Выводит сообщение о успешном сохранении.</li>
</ul>
<h3 id="входной-pdf-использованный-в-коде-и-его-повёрнутый-выходной-файл">Входной PDF, использованный в коде, и его повёрнутый выходной файл</h3>
<ul>
<li><strong>Входной PDF файл:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-rotate/">Ссылка для загрузки</a></li>
<li><strong>Выходной повёрнутый PDF файл:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-rotate/rotated_output.pdf">Ссылка для загрузки</a></li>
</ul>
<p><strong>Скриншот</strong>
<img loading="lazy" src="https://raw.githubusercontent.com/fileformat-blog-gists/content/main/working-with-pdf-files-in-python/rotated-pdf.png" alt="Скриншот повёрнутой страницы в PDF с использованием Python"  />
</p>
<h2 id="3-объединение-pdf-файлов-с-использованием-python">3. Объединение PDF файлов с использованием Python</h2>
<p>Этот скрипт Python демонстрирует, как <strong>объединить несколько PDF файлов</strong> из директории в один PDF с использованием библиотеки <strong>PyPDF</strong>.</p>
<script type="application/javascript" src="https://gist.github.com/fileformat-blog-gists/a1a571783e0f5e699678d1094bf1afa5.js?file=merge_pdf_files_using_pypdf_in_python.py"></script>

<h3 id="объяснение-кода-2">Объяснение кода</h3>
<ul>
<li>Этот скрипт автоматически объединяет все PDF файлы, найденные в указанной директории (<code>pdfs-to-merge</code>), в один выходной файл (<code>merged_output.pdf</code>).</li>
<li>Он обеспечивает существование выходной директории и добавляет страницы каждого PDF в том порядке, в котором они перечислены.</li>
<li>Он выводит финальный объединенный файл в поддиректорию <code>output-dir</code>.</li>
</ul>
<p><strong>Разбор кода</strong></p>
<p><strong>1. Импорт библиотек</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> os
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> pypdf <span style="color:#f92672">import</span> PdfReader, PdfWriter
</span></span></code></pre></div><ul>
<li><code>os</code>: Используется для взаимодействия с файловой системой, например, для чтения директорий и управления путями к файлам.</li>
<li><code>PdfReader</code>: Читает содержимое PDF файла.</li>
<li><code>PdfWriter</code>: Создает и записывает новый PDF файл.</li>
</ul>
<p><strong>2. Определите директорию и выходной файл</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>directory <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pdfs-to-merge&#34;</span>
</span></span><span style="display:flex;"><span>output_file <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;output-dir/merged_output.pdf&#34;</span>
</span></span></code></pre></div><ul>
<li><code>directory</code>: Указывает папку, в которой хранятся PDF файлы.</li>
<li><code>output_file</code>: Определяет выходной путь и название объединенного PDF.</li>
</ul>
<p><strong>3. Создание выходной директории, если она не существует</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>os<span style="color:#f92672">.</span>makedirs(os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>join(directory, <span style="color:#e6db74">&#34;output-dir&#34;</span>), exist_ok<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span></code></pre></div><ul>
<li>Это гарантирует, что <strong>выходная директория</strong> существует, и если ее нет, она создается.</li>
</ul>
<p><strong>4. Создать объект PdfWriter</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>writer <span style="color:#f92672">=</span> PdfWriter()
</span></span></code></pre></div><ul>
<li><code>writer</code> используется для сбора и объединения всех страниц из PDF.</li>
</ul>
<p><strong>5. Итерация по всем PDF файлам в директории</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">for</span> file_name <span style="color:#f92672">in</span> sorted(os<span style="color:#f92672">.</span>listdir(directory)):
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> file_name<span style="color:#f92672">.</span>endswith(<span style="color:#e6db74">&#34;.pdf&#34;</span>):
</span></span><span style="display:flex;"><span>        file_path <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>join(directory, file_name)
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Добавление: </span><span style="color:#e6db74">{</span>file_name<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><ul>
<li>Этот цикл проходит по всем файлам в указанной директории, проверяя, чтобы файлы имели расширение <code>.pdf</code>. Он использует <code>sorted()</code>, чтобы обрабатывать их в алфавитном порядке.</li>
</ul>
<p><strong>6. Чтение каждого PDF и добавление страниц в Writer</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>reader <span style="color:#f92672">=</span> PdfReader(file_path)
</span></span><span style="display:flex;"><span>writer<span style="color:#f92672">.</span>append(reader)
</span></span></code></pre></div><ul>
<li>Для каждого PDF <code>PdfReader</code> читает файл, а затем все страницы этого PDF добавляются в <code>writer</code>.</li>
</ul>
<p><strong>7. Запись объединенного PDF в выходной файл</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>output_path <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>join(directory, output_file)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(output_path, <span style="color:#e6db74">&#34;wb&#34;</span>) <span style="color:#66d9ef">as</span> output_pdf:
</span></span><span style="display:flex;"><span>    writer<span style="color:#f92672">.</span>write(output_pdf)
</span></span></code></pre></div><ul>
<li>После сбора всех страниц <code>writer.write()</code> записывает объединённый PDF в указанный выходной путь.</li>
</ul>
<p><strong>8. Печать подтверждения</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Объединенный PDF сохранен как: </span><span style="color:#e6db74">{</span>output_path<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><ul>
<li>Печатает сообщение о успехе, подтверждающее место сохранения объединённого PDF.</li>
</ul>
<h3 id="входные-pdf-файлы-использованные-в-коде-и-объединённый-выходной-pdf">Входные PDF файлы, использованные в коде, и объединённый выходной PDF</h3>
<ul>
<li><strong>Входные PDF файлы:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdfs-to-merge">Ссылка для загрузки</a></li>
<li><strong>Объединённый выходной PDF:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdfs-to-merge/output-dir">Ссылка для загрузки</a></li>
</ul>
<h2 id="4-разделение-pdf-с-использованием-python">4. Разделение PDF с использованием Python</h2>
<script type="application/javascript" src="https://gist.github.com/fileformat-blog-gists/0dee64422ac0dcf44cf027d90567bbf8.js?file=split-pdf-using-pypdf-in-python.py"></script>

<h3 id="объяснение-кода-3">Объяснение кода</h3>
<p>Вышеуказанный скрипт Python разделяет PDF на отдельные страницы с помощью библиотеки <strong>PyPDF</strong>. Сначала он проверяет наличие выходной директории, затем считывает входной PDF файл. Скрипт перебирает каждую страницу, создает новый объект <strong>PdfWriter</strong> и сохраняет каждую страницу как отдельный PDF файл. Выходные файлы называются последовательно (например, <strong>page_1.pdf, page_2.pdf</strong>) и хранятся в папке <strong><code>output-dir</code></strong>. В конце скрипт выводит сообщение подтверждения для каждого созданного файла и уведомляет, когда процесс завершен.</p>
<h3 id="входной-pdf-и-выходные-разделенные-файлы">Входной PDF и выходные разделенные файлы</h3>
<ul>
<li><strong>Входной PDF файл:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-split">Ссылка для загрузки</a></li>
<li><strong>Разделённые выходные файлы:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-split/output-dir">Ссылка для загрузки</a></li>
</ul>
<h2 id="5-добавление-водяного-знака-в-pdf-с-использованием-python">5. Добавление водяного знака в PDF с использованием Python</h2>
<p>Вы можете добавить водяной знак в PDF, используя библиотеку PyPDF, накладывая PDF с водяным знаком на существующий PDF. Убедитесь, что PDF с водяным знаком содержит только одну страницу, чтобы он правильно применялся к каждой странице основного PDF.</p>
<script type="application/javascript" src="https://gist.github.com/fileformat-blog-gists/af057943580e2fcde6a635df34d7e39a.js?file=watermark-pdf-using-pypdf-in-python.py"></script>

<h3 id="объяснение-кода-4">Объяснение кода</h3>
<p>Вышеуказанный скрипт Python читает входной PDF, извлекает одностраничный PDF водяного знака, накладывает водяной знак на каждую страницу входного PDF и сохраняет итоговый PDF с водяными знаками.</p>
<p><strong>Разбор кода</strong></p>
<p>Вот краткое объяснение каждой части</p>
<p><strong>1. Импорт необходимых классов</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> pypdf <span style="color:#f92672">import</span> PdfReader, PdfWriter
</span></span></code></pre></div><ul>
<li><strong><code>PdfReader</code></strong> используется для чтения существующих PDF.</li>
<li><strong><code>PdfWriter</code></strong> используется для создания и записи нового PDF.</li>
</ul>
<p><strong>2. Определите пути к файлам</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>input_pdf <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pdf-to-watermark/input.pdf&#34;</span>
</span></span><span style="display:flex;"><span>watermark_pdf <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pdf-to-watermark/watermark.pdf&#34;</span>
</span></span><span style="display:flex;"><span>output_pdf <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pdf-to-watermark/output_with_watermark.pdf&#34;</span>
</span></span></code></pre></div><ul>
<li><code>input_pdf</code>: Оригинальный PDF, к которому будет добавлен водяной знак.</li>
<li><code>watermark_pdf</code>: Отдельный <strong>одностраничный</strong> PDF, выступающий в качестве водяного знака.</li>
<li><code>output_pdf</code>: Выходной файл, который будет содержать страницы с водяными знаками.</li>
</ul>
<p><strong>3. Чтение PDF</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>reader <span style="color:#f92672">=</span> PdfReader(input_pdf)
</span></span><span style="display:flex;"><span>watermark <span style="color:#f92672">=</span> PdfReader(watermark_pdf)
</span></span></code></pre></div><ul>
<li><code>reader</code>: Читает входной PDF.</li>
<li><code>watermark</code>: Читает PDF с водяным знаком.</li>
</ul>
<p><strong>4. Создание объекта Writer</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>writer <span style="color:#f92672">=</span> PdfWriter()
</span></span></code></pre></div><ul>
<li>Это будет использовано для создания финального PDF с водяными знаками.</li>
</ul>
<p><strong>5. Извлечение страницы с водяным знаком</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>watermark_page <span style="color:#f92672">=</span> watermark<span style="color:#f92672">.</span>pages[<span style="color:#ae81ff">0</span>]
</span></span></code></pre></div><ul>
<li>Предполагается, что PDF с водяным знаком содержит только <strong>одну страницу</strong>, которая используется для наложения на все страницы.</li>
</ul>
<p><strong>6. Перебор страниц входного PDF и наложение водяного знака</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">for</span> page <span style="color:#f92672">in</span> reader<span style="color:#f92672">.</span>pages:
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Совмещение водяного знака и текущей страницы</span>
</span></span><span style="display:flex;"><span>    page<span style="color:#f92672">.</span>merge_page(watermark_page)
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Добавление объединённой страницы в writer</span>
</span></span><span style="display:flex;"><span>    writer<span style="color:#f92672">.</span>add_page(page)
</span></span></code></pre></div><ul>
<li>Перебирает каждую страницу из <code>input_pdf</code>.</li>
<li><strong><code>merge_page(watermark_page)</code></strong> накладывает водяной знак поверх текущей страницы.</li>
<li>Добавляет изменённую страницу в <code>writer</code>.</li>
</ul>
<p><strong>7. Сохранение PDF с водяными знаками</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(output_pdf, <span style="color:#e6db74">&#34;wb&#34;</span>) <span style="color:#66d9ef">as</span> output_file:
</span></span><span style="display:flex;"><span>    writer<span style="color:#f92672">.</span>write(output_file)
</span></span></code></pre></div><ul>
<li>Записывает изменённые страницы в новый PDF файл.</li>
</ul>
<p><strong>8. Печать подтверждения</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;PDF с водяным знаком сохранён как: </span><span style="color:#e6db74">{</span>output_pdf<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><ul>
<li>Выводит путь к выходному файлу для подтверждения.</li>
</ul>
<h3 id="входной-pdf-pdf-с-водяным-знаком-и-выходной-pdf-с-водяными-знаками">Входной PDF, PDF с водяным знаком и выходной PDF с водяными знаками</h3>
<ul>
<li><strong>Входной PDF файл:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-watermark">Ссылка для загрузки</a></li>
<li><strong>PDF файл с водяным знаком:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-watermark">Ссылка для загрузки</a></li>
<li><strong>Выходной файл с водяным знаком:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-watermark">Ссылка для загрузки</a></li>
</ul>
<p><strong>Скриншот</strong>
<img loading="lazy" src="https://raw.githubusercontent.com/fileformat-blog-gists/content/main/working-with-pdf-files-in-python/watermark-pdf.png" alt="Скриншот PDF с водяным знаком с использованием Python"  />
</p>
<h2 id="заключение">Заключение</h2>
<p>В этом руководстве мы изучили основные операции с PDF в Python, включая извлечение текста, поворот страниц, объединение, разделение и добавление водяных знаков. Обладая этими навыками, вы теперь можете создать собственный менеджер PDF и эффективно автоматизировать различные задачи, связанные с PDF.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
