Ostatnia aktualizacja: 29 stycznia, 2025

Tytuł - Praca z plikami PDF w Pythonie

W tym artykule przedstawimy, jak pracować z plikami PDF używając Pythona. W tym celu wykorzystamy bibliotekę pypdf.

Używając biblioteki pypdf, pokażemy, jak wykonać następujące operacje w Pythonie:

  • Wyciąganie tekstu z PDF-ów
  • Obracanie stron PDF
  • Scalanie wielu PDF-ów
  • Dzielenie PDF-ów na osobne pliki
  • Dodawanie znaków wodnych do stron PDF

Uwaga: 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.

Ilustracja - Praca z plikami PDF w Pythonie

Przykładowe kody

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.

Instalacja pypdf

Aby zainstalować pypdf, wystarczy uruchomić następujące polecenie w terminalu lub wierszu poleceń:

pip install pypdf

Uwaga: Powyższe polecenie jest uwzględniające wielkość liter.

1. Wyciąganie tekstu z pliku PDF przy użyciu Pythona

from pypdf import PdfReader
# Path to the PDF file
pdf_file = "pdf-to-extract-text/input.pdf"
# Create a PDF reader object
reader = PdfReader(pdf_file)
# Loop through the pages and extract text
for page_number, page in enumerate(reader.pages, start=1):
print(f"Page {page_number}:")
print(page.extract_text())
print("-" * 50) # Separator for readability

Wyjaśnienie kodu

1. Tworzenie obiektu czytnika PDF

reader = PdfReader(pdf_file)
  • PdfReader(pdf_file) ładuje plik PDF do obiektu czytnika.
  • Ten obiekt umożliwia dostęp do stron i ich zawartości.

2. Iteracja przez strony

for page_number, page in enumerate(reader.pages, start=1):
  • reader.pages zwraca listę stron w PDF-ie.
  • enumerate(..., start=1) przypisuje numer strony zaczynając od 1.

3. Drukowanie wyekstrahowanego tekstu

    print(f"Strona {page_number}:")
    print(page.extract_text())
    print("-" * 50)  # Separator dla lepszej czytelności
  • page.extract_text() wyciąga treść tekstową z bieżącej strony.
  • Skrypt drukuje wyekstrahowany tekst wraz z numerem strony.
  • "-" * 50 drukuje linię separatora (--------------------------------------------------) dla lepszej czytelności.

Plik PDF użyty w kodzie

Wynik działania kodu

Page 1:
Python Tutorial
Release 3.7.0
Guido van Rossum
and the Python development team
September 02, 2018
Python Software Foundation
Email: docs@python.org
--------------------------------------------------
Page 2:
CONTENTS
1 Whetting Y our Appetite 3
2 Using the Python Interpreter 5
2.1 Invoking the Interpreter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 The Interpreter and Its Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 An Informal Introduction to Python 9
3.1 Using Python as a Calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 First Steps Towards Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4 More Control Flow T ools 19
4.1 if Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2 for Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.3 The range() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.4 break and continue Statements, andelse Clauses on Loops. . . . . . . . . . . . . . . . . . 21
4.5 pass Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.6 Defining Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.7 More on Defining Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.8 Intermezzo: Coding Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5 Data Structures 31
5.1 More on Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2 The del statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.3 Tuples and Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.4 Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.5 Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.6 Looping Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.7 More on Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.8 Comparing Sequences and Other Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6 Modules 43
6.1 More on Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.2 Standard Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.3 The dir() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.4 Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
7 Input and Output 53
7.1 Fancier Output Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.2 Reading and Writing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
8 Errors and Exceptions 61
i
--------------------------------------------------
Page 3:
Python Tutorial, Release 3.7.0
Python is an easy to learn, powerful programming language. It has efficient high-level data structures and
a simple but effective approach to object-oriented programming. Python’s elegant syntax and dynamic
typing, together with its interpreted nature, make it an ideal language for scripting and rapid application
development in many areas on most platforms.
The Python interpreter and the extensive standard library are freely available in source or binary form for all
major platforms from the Python Web site,https://www.python.org/, and may be freely distributed. The
same site also contains distributions of and pointers to many free third party Python modules, programs
and tools, and additional documentation.
The Python interpreter is easily extended with new functions and data types implemented in C or C++
(or other languages callable from C). Python is also suitable as an extension language for customizable
applications.
This tutorial introduces the reader informally to the basic concepts and features of the Python language
and system. It helps to have a Python interpreter handy for hands-on experience, but all examples are
self-contained, so the tutorial can be read off-line as well.
For a description of standard objects and modules, see library-index. reference-index gives a more formal
definition of the language. To write extensions in C or C++, read extending-index and c-api-index. There
are also several books covering Python in depth.
This tutorial does not attempt to be comprehensive and cover every single feature, or even every commonly
used feature. Instead, it introduces many of Python’s most noteworthy features, and will give you a good
idea of the language’s flavor and style. After reading it, you will be able to read and write Python modules
and programs, and you will be ready to learn more about the various Python library modules described in
library-index.
The
Glossary is also worth going through.
CONTENTS 1
--------------------------------------------------

2. Obracanie stron PDF przy użyciu Pythona

from pypdf import PdfReader, PdfWriter
# Input and output PDF files
input_pdf = "pdf-to-rotate/input.pdf"
output_pdf = "pdf-to-rotate/rotated_output.pdf"
# Read the PDF
reader = PdfReader(input_pdf)
writer = PdfWriter()
# Rotate the first page 90 degrees clockwise
page = reader.pages[0]
page.rotate(90) # Rotate 90 degrees clockwise
# Add the rotated page to the writer
writer.add_page(page)
# Add the rest of the pages without modification
for i in range(1, len(reader.pages)):
writer.add_page(reader.pages[i])
# Write the output to a new PDF file
with open(output_pdf, "wb") as file:
writer.write(file)
print(f"Rotated page saved to {output_pdf}")

Wyjaśnienie kodu

Kod w zasadzie obraca pierwszą stronę o 90° zgodnie z ruchem wskazówek zegara i zapisuje zmodyfikowany PDF bez wpływu na pozostałe strony.

1. Importowanie wymaganych klas

from pypdf import PdfReader, PdfWriter
  • PdfReader: Odczytuje wejściowy PDF.
  • PdfWriter: Tworzy nowy PDF z modyfikacjami.

2. Definiowanie ścieżek plików wejściowych i wyjściowych

input_pdf = "pdf-to-rotate/input.pdf"
output_pdf = "pdf-to-rotate/rotated_output.pdf"
  • Skrypt odczytuje plik input.pdf i zapisuje zmodyfikowany plik jako rotated_output.pdf.

3. Odczyt PDF-a i tworzenie obiektu zapisującego

reader = PdfReader(input_pdf)
writer = PdfWriter()
  • reader ładuje istniejący PDF.
  • writer jest używany do przechowywania zmodyfikowanych stron.

4. Obrót pierwszej strony o 90 stopni

page = reader.pages[0]
page.rotate(90)  # Obrót o 90 stopni zgodnie z ruchem wskazówek zegara
writer.add_page(page)
  • Wyciąga stronę 1, obraca ją o 90 stopni i dodaje ją do nowego PDF-a.

5. Dodanie pozostałych stron bez zmian

for i in range(1, len(reader.pages)):
    writer.add_page(reader.pages[i])
  • Przechodzi przez pozostałe strony i dodaje je bez zmian.

6. Zapisanie nowego PDF-a

with open(output_pdf, "wb") as file:
    writer.write(file)
  • Otwiera rotated_output.pdf w trybie zapisu binarnego i zapisuje nowy PDF.

7. Wydrukowanie potwierdzenia

print(f"Obrócona strona zapisana w {output_pdf}")
  • Wyświetla komunikat o sukcesie.

Wejściowy PDF użyty w kodzie i jego obrócony wynik

Zrzut ekranu Zrzut ekranu obróconej strony w PDF za pomocą Pythona

3. Scalanie plików PDF przy użyciu Pythona

Ten skrypt w Pythonie pokazuje, jak scalać wiele plików PDF z katalogu w jeden PDF używając biblioteki PyPDF.

import os
from pypdf import PdfReader, PdfWriter
# Directory containing PDF files
directory = "pdfs-to-merge"
# Output file name
output_file = "output-dir/merged_output.pdf"
# Ensure the output directory exists
os.makedirs(os.path.join(directory, "output-dir"), exist_ok=True)
# Create a PdfWriter object
writer = PdfWriter()
# Iterate over all PDF files in the directory
for file_name in sorted(os.listdir(directory)):
if file_name.endswith(".pdf"):
file_path = os.path.join(directory, file_name)
print(f"Adding: {file_name}")
# Read the PDF file
reader = PdfReader(file_path)
# Append all pages to the writer
writer.append(reader)
# Write the merged PDF to an output file
output_path = os.path.join(directory, output_file)
with open(output_path, "wb") as output_pdf:
writer.write(output_pdf)
print(f"Merged PDF saved as: {output_path}")

Wyjaśnienie kodu

  • Skrypt automatycznie scala wszystkie pliki PDF znalezione w określonym katalogu (pdfs-to-merge) w jeden plik wyjściowy (merged_output.pdf).
  • Zapewnia istnienie katalogu wyjściowego i dodaje strony każdego PDF-a w porządku, w jakim są wymienione.
  • Wynikowy plik zostanie zapisany w podkatalogu output-dir.

Rozbicie kodu

1. Importowanie bibliotek

import os
from pypdf import PdfReader, PdfWriter
  • os: Używane do interakcji z systemem plików, takie jak czytanie katalogów i zarządzanie ścieżkami.
  • PdfReader: Odczytuje zawartość pliku PDF.
  • PdfWriter: Tworzy i zapisuje nowy plik PDF.

2. Definiowanie katalogu i pliku wyjściowego

directory = "pdfs-to-merge"
output_file = "output-dir/merged_output.pdf"
  • directory: Określa folder, w którym przechowywane są pliki PDF.
  • output_file: Definiuje ścieżkę wyjściową i nazwę scalonego PDF-a.

3. Tworzenie katalogu wyjściowego, jeśli nie istnieje

os.makedirs(os.path.join(directory, "output-dir"), exist_ok=True)
  • To zapewnia istnienie katalogu wyjściowego, a jeśli nie istnieje, tworzy go.

4. Tworzenie obiektu PdfWriter

writer = PdfWriter()
  • writer jest używany do zbierania i łączenia wszystkich stron z PDF-ów.

5. Iteracja przez wszystkie pliki PDF w katalogu

for file_name in sorted(os.listdir(directory)):
    if file_name.endswith(".pdf"):
        file_path = os.path.join(directory, file_name)
        print(f"Adding: {file_name}")
  • Ta pętla przechodzi przez wszystkie pliki w określonym katalogu, sprawdzając pliki z rozszerzeniem .pdf. Używa sorted(), aby przetwarzać je w porządku alfabetycznym.

6. Odczytanie każdego PDF-a i dodanie stron do zapisującego

reader = PdfReader(file_path)
writer.append(reader)
  • Dla każdego PDF-a PdfReader odczytuje plik, następnie wszystkie jego strony są dodawane do writer.

7. Zapisanie scalonego pliku PDF do pliku wyjściowego

output_path = os.path.join(directory, output_file)
with open(output_path, "wb") as output_pdf:
    writer.write(output_pdf)
  • Po zebraniu wszystkich stron writer.write() zapisuje scalony PDF do określonej ścieżki wyjściowej.

8. Wydrukowanie potwierdzenia

print(f"Merged PDF saved as: {output_path}")
  • Wyświetla komunikat o sukcesie potwierdzający lokalizację zapisanego scalonego PDF-a.

Pliki PDF użyte w kodzie wejściowym i scalony plik wyjściowy

4. Dzielenie PDF-a przy użyciu Pythona

from pypdf import PdfReader, PdfWriter
import os
# Input PDF file
input_pdf = "pdf-to-split/input.pdf"
# Output directory
output_directory = "pdf-to-split/output-dir"
# Ensure the output directory exists
os.makedirs(output_directory, exist_ok=True)
# Read the input PDF
reader = PdfReader(input_pdf)
# Loop through each page and save it as a separate PDF
for page_num, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)
# Define the output file name
output_file = os.path.join(output_directory, f"page_{page_num + 1}.pdf")
# Write the page to a new PDF
with open(output_file, "wb") as output_pdf:
writer.write(output_pdf)
print(f"Created: {output_file}")
print("PDF splitting complete!")

Wyjaśnienie kodu

Powyższy skrypt w Pythonie dzieli PDF na oddzielne strony używając biblioteki PyPDF. 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 PdfWriter i zapisuje każdą stronę jako pojedynczy plik PDF. Pliki wynikowe są nazwane sekwencyjnie (np. page_1.pdf, page_2.pdf) i przechowywane w folderze output-dir. Na końcu drukuje komunikat potwierdzający utworzenie każdego pliku i informuje o zakończeniu procesu.

Wejściowy PDF i podzielone pliki wyjściowe

5. Dodawanie znaku wodnego do PDF-a przy użyciu Pythona

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.

from pypdf import PdfReader, PdfWriter
# Paths for the input PDF and watermark PDF
input_pdf = "pdf-to-watermark/input.pdf"
watermark_pdf = "pdf-to-watermark/watermark.pdf"
output_pdf = "pdf-to-watermark/output_with_watermark.pdf"
# Read the input PDF and watermark PDF
reader = PdfReader(input_pdf)
watermark = PdfReader(watermark_pdf)
# Create a PdfWriter object for the output PDF
writer = PdfWriter()
# Ensure the watermark has only one page (it should be one-page PDF)
watermark_page = watermark.pages[0]
# Loop through each page in the input PDF
for page in reader.pages:
# Merge the watermark with the current page
page.merge_page(watermark_page)
# Add the merged page to the writer
writer.add_page(page)
# Write the output PDF with watermark
with open(output_pdf, "wb") as output_file:
writer.write(output_file)
print(f"Watermarked PDF saved as: {output_pdf}")

Wyjaśnienie kodu

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.

Rozbicie kodu

Poniżej znajduje się krótkie wyjaśnienie każdej części

1. Importowanie wymaganych klas

from pypdf import PdfReader, PdfWriter
  • PdfReader służy do odczytu istniejących PDF-ów.
  • PdfWriter służy do tworzenia i zapisu nowego PDF-a.

2. Definiowanie ścieżek plików

input_pdf = "pdf-to-watermark/input.pdf"
watermark_pdf = "pdf-to-watermark/watermark.pdf"
output_pdf = "pdf-to-watermark/output_with_watermark.pdf"
  • input_pdf: Oryginalny PDF, do którego zostanie dodany znak wodny.
  • watermark_pdf: Osobny jednostronny PDF pełniący rolę znaku wodnego.
  • output_pdf: Plik wyjściowy, który będzie zawierał strony ze znakami wodnymi.

3. Odczyt PDF-ów

reader = PdfReader(input_pdf)
watermark = PdfReader(watermark_pdf)
  • reader: Odczytuje PDF wejściowy.
  • watermark: Odczytuje PDF ze znakiem wodnym.

4. Tworzenie obiektu zapisującego

writer = PdfWriter()
  • Posłuży do stworzenia końcowego PDF-a ze znakiem wodnym.

5. Wyciąganie strony znaku wodnego

watermark_page = watermark.pages[0]
  • Zakłada się, że PDF ze znakiem wodnym ma tylko jedną stronę, która będzie użyta do nałożenia na wszystkie strony.

6. Iteracja przez strony wejściowego PDF-a i łączenie znaku wodnego

for page in reader.pages:
    # Łączenie znaku wodnego z bieżącą stroną
    page.merge_page(watermark_page)
    
    # Dodanie zmodyfikowanej strony do zapisującego
    writer.add_page(page)
  • Iteruje przez każdą stronę input_pdf.
  • merge_page(watermark_page) nakłada znak wodny na bieżącą stronę.
  • Dodaje zmodyfikowaną stronę do writer.

7. Zapisanie PDF-a ze znakiem wodnym

with open(output_pdf, "wb") as output_file:
    writer.write(output_file)
  • Zapisuje zmodyfikowane strony do nowego pliku PDF.

8. Wydrukowanie potwierdzenia

print(f"PDF ze znakiem wodnym zapisany jako: {output_pdf}")
  • Wyświetla informację o ścieżce do pliku wyjściowego jako potwierdzenie.

Wejściowy PDF, PDF ze znakiem wodnym i wynikowy PDF

Zrzut ekranu Zrzut ekranu PDF ze znakiem wodnym za pomocą Pythona

Podsumowanie

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.