Ostatnia aktualizacja: 29 stycznia, 2025

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.

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
- Plik wejściowy: Link do pobrania
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 jakorotated_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
- Plik wejściowy PDF: Link do pobrania
- Plik wyjściowy obróconego PDF: Link do pobrania
Zrzut ekranu
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żywasorted()
, 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 dowriter
.
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
- Wejściowe pliki PDF: Link do pobrania
- Scalony plik wyjściowy PDF: Link do pobrania
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
- Wejściowy plik PDF: Link do pobrania
- Podzielone pliki wyjściowe: Link do pobrania
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
- Wejściowy plik PDF: Link do pobrania
- Plik PDF ze znakiem wodnym: Link do pobrania
- Plik wyjściowy PDF ze znakiem wodnym: Link do pobrania
Zrzut ekranu
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.