<?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/pl/tag/python-programming/</link>
    <description>Recent content in python programming on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>pl</language>
    <lastBuildDate>Wed, 29 Jan 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/pl/tag/python-programming/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Praca z plikami PDF w Pythonie</title>
      <link>https://blog.fileformat.com/pl/programming/working-with-pdf-files-in-python/</link>
      <pubDate>Wed, 29 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/pl/programming/working-with-pdf-files-in-python/</guid>
      <description>Naucz się, jak wyciągać tekst z PDF w Pythonie, obracać strony PDF, scalać wiele PDF-ów, dzielić je oraz dodawać znaki wodne do swoich PDF-ów przy użyciu bibliotek Pythona i prostych przykładów kodu.</description>
      <content:encoded><![CDATA[<p><strong>Ostatnia aktualizacja</strong>: 29 stycznia, 2025</p>
<figure class="align-center ">
    <img loading="lazy" src="images/working-with-pdf-files-in-python.png#center"
         alt="Tytuł - Praca z plikami PDF w Pythonie"/> 
</figure>

<p>W tym artykule przedstawimy, jak <strong>pracować z plikami PDF używając Pythona</strong>. W tym celu wykorzystamy bibliotekę <a href="https://pypi.org/project/pypdf/"><strong>pypdf</strong></a>.</p>
<p>Używając biblioteki <strong>pypdf</strong>, pokażemy, jak wykonać następujące operacje w Pythonie:</p>
<ul>
<li>Wyciąganie tekstu z PDF-ów</li>
<li>Obracanie stron PDF</li>
<li>Scalanie wielu PDF-ów</li>
<li>Dzielenie PDF-ów na osobne pliki</li>
<li>Dodawanie znaków wodnych do stron PDF</li>
</ul>
<p><em><strong>Uwaga</strong>: Artykuł zawiera wiele cennych informacji, więc możesz pominąć sekcje, które cię nie interesują! Treść jest uporządkowana dla łatwej nawigacji, więc możesz szybko skupić się na tym, co jest dla ciebie najbardziej istotne.</em></p>
<figure class="align-center ">
    <img loading="lazy" src="images/pdf-manipulation-with-pypdf.webp#center"
         alt="Ilustracja - Praca z plikami PDF w Pythonie"/> 
</figure>

<h2 id="przykładowe-kody">Przykładowe kody</h2>
<p>Możesz pobrać wszystkie przykładowe kody użyte w tym artykule z poniższego linku. Zawiera on kody, pliki wejściowe oraz pliki wyjściowe.</p>
<ul>
<li><a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python">Przykłady kodów i pliki wejściowe do pracy z plikami PDF w Pythonie</a></li>
</ul>
<h2 id="instalacja-pypdf">Instalacja pypdf</h2>
<p>Aby zainstalować pypdf, wystarczy uruchomić następujące polecenie w terminalu lub wierszu poleceń:</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>Uwaga:</strong> Powyższe polecenie jest uwzględniające wielkość liter.</p>
<h2 id="1-wyciąganie-tekstu-z-pliku-pdf-przy-użyciu-pythona">1. Wyciąganie tekstu z pliku PDF przy użyciu Pythona</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="wyjaśnienie-kodu"><strong>Wyjaśnienie kodu</strong></h3>
<p><strong>1. Tworzenie obiektu czytnika 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> ładuje plik PDF do <strong>obiektu czytnika</strong>.</li>
<li>Ten obiekt umożliwia dostęp do stron i ich zawartości.</li>
</ul>
<p><strong>2. Iteracja przez strony</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> zwraca listę stron w PDF-ie.</li>
<li><code>enumerate(..., start=1)</code> przypisuje <strong>numer strony zaczynając od 1</strong>.</li>
</ul>
<p><strong>3. Drukowanie wyekstrahowanego tekstu</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;Strona </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"># Separator dla lepszej czytelności</span>
</span></span></code></pre></div><ul>
<li><code>page.extract_text()</code> wyciąga treść tekstową z bieżącej strony.</li>
<li>Skrypt drukuje wyekstrahowany tekst wraz z <strong>numerem strony</strong>.</li>
<li><code>&quot;-&quot; * 50</code> drukuje linię separatora (<code>--------------------------------------------------</code>) dla lepszej czytelności.</li>
</ul>
<h3 id="plik-pdf-użyty-w-kodzie">Plik PDF użyty w kodzie</h3>
<ul>
<li><strong>Plik wejściowy:</strong> <a href="https://github.com/fileformat-blog-gists/code/blob/main/working-with-pdf-files-in-python/pdf-to-extract-text/">Link do pobrania</a></li>
</ul>
<h3 id="wynik-działania-kodu">Wynik działania kodu</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-obracanie-stron-pdf-przy-użyciu-pythona">2. Obracanie stron PDF przy użyciu Pythona</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="wyjaśnienie-kodu-1">Wyjaśnienie kodu</h3>
<p>Kod w zasadzie obraca <strong>pierwszą stronę</strong> o <strong>90° zgodnie z ruchem wskazówek zegara</strong> i zapisuje zmodyfikowany PDF bez wpływu na pozostałe strony.</p>
<p><strong>1. Importowanie wymaganych klas</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>: Odczytuje wejściowy PDF.</li>
<li><code>PdfWriter</code>: Tworzy nowy PDF z modyfikacjami.</li>
</ul>
<p><strong>2. Definiowanie ścieżek plików wejściowych i wyjściowych</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>Skrypt odczytuje plik <code>input.pdf</code> i zapisuje zmodyfikowany plik jako <code>rotated_output.pdf</code>.</li>
</ul>
<p><strong>3. Odczyt PDF-a i tworzenie obiektu zapisującego</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> ładuje istniejący PDF.</li>
<li><code>writer</code> jest używany do przechowywania zmodyfikowanych stron.</li>
</ul>
<p><strong>4. Obrót pierwszej strony o 90 stopni</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"># Obrót o 90 stopni zgodnie z ruchem wskazówek zegara</span>
</span></span><span style="display:flex;"><span>writer<span style="color:#f92672">.</span>add_page(page)
</span></span></code></pre></div><ul>
<li>Wyciąga <strong>stronę 1</strong>, obraca ją o <strong>90 stopni</strong> i dodaje ją do nowego PDF-a.</li>
</ul>
<p><strong>5. Dodanie pozostałych stron bez zmian</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>Przechodzi przez pozostałe strony i dodaje je bez zmian.</li>
</ul>
<p><strong>6. Zapisanie nowego PDF-a</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>Otwiera <code>rotated_output.pdf</code> w trybie zapisu binarnego i zapisuje nowy PDF.</li>
</ul>
<p><strong>7. Wydrukowanie potwierdzenia</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;Obrócona strona zapisana w </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>Wyświetla komunikat o sukcesie.</li>
</ul>
<h3 id="wejściowy-pdf-użyty-w-kodzie-i-jego-obrócony-wynik">Wejściowy PDF użyty w kodzie i jego obrócony wynik</h3>
<ul>
<li><strong>Plik wejściowy PDF:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-rotate/">Link do pobrania</a></li>
<li><strong>Plik wyjściowy obróconego 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">Link do pobrania</a></li>
</ul>
<p><strong>Zrzut ekranu</strong>
<img loading="lazy" src="https://raw.githubusercontent.com/fileformat-blog-gists/content/main/working-with-pdf-files-in-python/rotated-pdf.png" alt="Zrzut ekranu obróconej strony w PDF za pomocą Pythona"  />
</p>
<h2 id="3-scalanie-plików-pdf-przy-użyciu-pythona">3. Scalanie plików PDF przy użyciu Pythona</h2>
<p>Ten skrypt w Pythonie pokazuje, jak <strong>scalać wiele plików PDF</strong> z katalogu w jeden PDF używając biblioteki <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="wyjaśnienie-kodu-2">Wyjaśnienie kodu</h3>
<ul>
<li>Skrypt automatycznie scala wszystkie pliki PDF znalezione w określonym katalogu (<code>pdfs-to-merge</code>) w jeden plik wyjściowy (<code>merged_output.pdf</code>).</li>
<li>Zapewnia istnienie katalogu wyjściowego i dodaje strony każdego PDF-a w porządku, w jakim są wymienione.</li>
<li>Wynikowy plik zostanie zapisany w podkatalogu <code>output-dir</code>.</li>
</ul>
<p><strong>Rozbicie kodu</strong></p>
<p><strong>1. Importowanie bibliotek</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>: Używane do interakcji z systemem plików, takie jak czytanie katalogów i zarządzanie ścieżkami.</li>
<li><code>PdfReader</code>: Odczytuje zawartość pliku PDF.</li>
<li><code>PdfWriter</code>: Tworzy i zapisuje nowy plik PDF.</li>
</ul>
<p><strong>2. Definiowanie katalogu i pliku wyjściowego</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>: Określa folder, w którym przechowywane są pliki PDF.</li>
<li><code>output_file</code>: Definiuje ścieżkę wyjściową i nazwę scalonego PDF-a.</li>
</ul>
<p><strong>3. Tworzenie katalogu wyjściowego, jeśli nie istnieje</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>To zapewnia istnienie <strong>katalogu wyjściowego</strong>, a jeśli nie istnieje, tworzy go.</li>
</ul>
<p><strong>4. Tworzenie obiektu 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> jest używany do zbierania i łączenia wszystkich stron z PDF-ów.</li>
</ul>
<p><strong>5. Iteracja przez wszystkie pliki PDF w katalogu</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;Adding: </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>Ta pętla przechodzi przez wszystkie pliki w określonym katalogu, sprawdzając pliki z rozszerzeniem <code>.pdf</code>. Używa <code>sorted()</code>, aby przetwarzać je w porządku alfabetycznym.</li>
</ul>
<p><strong>6. Odczytanie każdego PDF-a i dodanie stron do zapisującego</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>Dla każdego PDF-a <code>PdfReader</code> odczytuje plik, następnie wszystkie jego strony są dodawane do <code>writer</code>.</li>
</ul>
<p><strong>7. Zapisanie scalonego pliku PDF do pliku wyjściowego</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>Po zebraniu wszystkich stron <code>writer.write()</code> zapisuje scalony PDF do określonej ścieżki wyjściowej.</li>
</ul>
<p><strong>8. Wydrukowanie potwierdzenia</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;Merged PDF saved as: </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>Wyświetla komunikat o sukcesie potwierdzający lokalizację zapisanego scalonego PDF-a.</li>
</ul>
<h3 id="pliki-pdf-użyte-w-kodzie-wejściowym-i-scalony-plik-wyjściowy">Pliki PDF użyte w kodzie wejściowym i scalony plik wyjściowy</h3>
<ul>
<li><strong>Wejściowe pliki PDF:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdfs-to-merge">Link do pobrania</a></li>
<li><strong>Scalony plik wyjściowy PDF:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdfs-to-merge/output-dir">Link do pobrania</a></li>
</ul>
<h2 id="4-dzielenie-pdf-a-przy-użyciu-pythona">4. Dzielenie PDF-a przy użyciu Pythona</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="wyjaśnienie-kodu-3">Wyjaśnienie kodu</h3>
<p>Powyższy skrypt w Pythonie dzieli PDF na oddzielne strony używając biblioteki <strong>PyPDF</strong>. Najpierw zapewnia, że cena katalogu wyjściowego istnieje, a następnie odczytuje plik PDF wejściowy. Skrypt przechodzi przez każdą stronę, tworzy nowy obiekt <strong>PdfWriter</strong> i zapisuje każdą stronę jako pojedynczy plik PDF. Pliki wynikowe są nazwane sekwencyjnie (np. <strong>page_1.pdf, page_2.pdf</strong>) i przechowywane w folderze <strong><code>output-dir</code></strong>. Na końcu drukuje komunikat potwierdzający utworzenie każdego pliku i informuje o zakończeniu procesu.</p>
<h3 id="wejściowy-pdf-i-podzielone-pliki-wyjściowe">Wejściowy PDF i podzielone pliki wyjściowe</h3>
<ul>
<li><strong>Wejściowy plik PDF:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-split">Link do pobrania</a></li>
<li><strong>Podzielone pliki wyjściowe:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-split/output-dir">Link do pobrania</a></li>
</ul>
<h2 id="5-dodawanie-znaku-wodnego-do-pdf-a-przy-użyciu-pythona">5. Dodawanie znaku wodnego do PDF-a przy użyciu Pythona</h2>
<p>Możesz dodać znak wodny do PDF-a używając biblioteki PyPDF, nakładając PDF ze znakiem wodnym na istniejący PDF. Upewnij się, że PDF ze znakiem wodnym ma tylko jedną stronę, aby prawidłowo zastosować go do każdej strony głównego PDF-a.</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="wyjaśnienie-kodu-4">Wyjaśnienie kodu</h3>
<p>Powyższy skrypt w Pythonie odczytuje wejściowy PDF, wyciąga jednokartkowy PDF znaku wodnego, nakłada znak wodny na każdą stronę wejściowego PDF-a i zapisuje końcowy PDF ze znakiem wodnym.</p>
<p><strong>Rozbicie kodu</strong></p>
<p>Poniżej znajduje się krótkie wyjaśnienie każdej części</p>
<p><strong>1. Importowanie wymaganych klas</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> służy do odczytu istniejących PDF-ów.</li>
<li><strong><code>PdfWriter</code></strong> służy do tworzenia i zapisu nowego PDF-a.</li>
</ul>
<p><strong>2. Definiowanie ścieżek plików</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>: Oryginalny PDF, do którego zostanie dodany znak wodny.</li>
<li><code>watermark_pdf</code>: Osobny <strong>jednostronny</strong> PDF pełniący rolę znaku wodnego.</li>
<li><code>output_pdf</code>: Plik wyjściowy, który będzie zawierał strony ze znakami wodnymi.</li>
</ul>
<p><strong>3. Odczyt PDF-ów</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>: Odczytuje PDF wejściowy.</li>
<li><code>watermark</code>: Odczytuje PDF ze znakiem wodnym.</li>
</ul>
<p><strong>4. Tworzenie obiektu zapisującego</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>Posłuży do stworzenia końcowego PDF-a ze znakiem wodnym.</li>
</ul>
<p><strong>5. Wyciąganie strony znaku wodnego</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>Zakłada się, że PDF ze znakiem wodnym ma tylko <strong>jedną stronę</strong>, która będzie użyta do nałożenia na wszystkie strony.</li>
</ul>
<p><strong>6. Iteracja przez strony wejściowego PDF-a i łączenie znaku wodnego</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"># Łączenie znaku wodnego z bieżącą stroną</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"># Dodanie zmodyfikowanej strony do zapisującego</span>
</span></span><span style="display:flex;"><span>    writer<span style="color:#f92672">.</span>add_page(page)
</span></span></code></pre></div><ul>
<li>Iteruje przez każdą stronę <code>input_pdf</code>.</li>
<li><strong><code>merge_page(watermark_page)</code></strong> nakłada znak wodny na bieżącą stronę.</li>
<li>Dodaje zmodyfikowaną stronę do <code>writer</code>.</li>
</ul>
<p><strong>7. Zapisanie PDF-a ze znakiem wodnym</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>Zapisuje zmodyfikowane strony do nowego pliku PDF.</li>
</ul>
<p><strong>8. Wydrukowanie potwierdzenia</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 ze znakiem wodnym zapisany jako: </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>Wyświetla informację o ścieżce do pliku wyjściowego jako potwierdzenie.</li>
</ul>
<h3 id="wejściowy-pdf-pdf-ze-znakiem-wodnym-i-wynikowy-pdf">Wejściowy PDF, PDF ze znakiem wodnym i wynikowy PDF</h3>
<ul>
<li><strong>Wejściowy plik PDF:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-watermark">Link do pobrania</a></li>
<li><strong>Plik PDF ze znakiem wodnym:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-watermark">Link do pobrania</a></li>
<li><strong>Plik wyjściowy PDF ze znakiem wodnym:</strong> <a href="https://github.com/fileformat-blog-gists/code/tree/main/working-with-pdf-files-in-python/pdf-to-watermark">Link do pobrania</a></li>
</ul>
<p><strong>Zrzut ekranu</strong>
<img loading="lazy" src="https://raw.githubusercontent.com/fileformat-blog-gists/content/main/working-with-pdf-files-in-python/watermark-pdf.png" alt="Zrzut ekranu PDF ze znakiem wodnym za pomocą Pythona"  />
</p>
<h2 id="podsumowanie">Podsumowanie</h2>
<p>W tym przewodniku przeszliśmy przez podstawowe operacje na plikach PDF w Pythonie, w tym wyciąganie tekstu, obracanie stron, scalanie, dzielenie oraz dodawanie znaków wodnych. Dzięki tym umiejętnościom możesz teraz stworzyć własnego menedżera PDF i automatyzować różne zadania związane z PDF-ami w efektywny sposób.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
