Last modified: August 03, 2025
This article is written in: 🇵🇱
Praca z plikami PDF w Pythonie jest możliwa dzięki kilku dostępnym bibliotekom. Jednym z najpopularniejszych narzędzi służących do tego celu jest PyPDF2.
Aby rozpocząć pracę z PyPDF2, najpierw należy ją zainstalować przy użyciu menedżera pakietów pip, co można zrobić za pomocą polecenia:
pip install PyPDF2
pypdf2.Możemy łatwo otworzyć plik PDF w trybie odczytu binarnego ('rb'), który jest wymagany do prawidłowego przetwarzania plików PDF.
from PyPDF2 import PdfFileReader
with open('plik.pdf', 'rb') as plik:
czytnik = PdfFileReader(plik)
PdfFileReader tworzy obiekt, który pozwala na interakcję z zawartością pliku PDF.PdfFileReader możemy uzyskać różne metadane dokumentu, takie jak liczba stron, autor czy tytuł.getNumPages(), która zwraca całkowitą liczbę stron w dokumencie.liczba_stron = czytnik.getNumPages()
print(f"Liczba stron: {liczba_stron}")
Metoda getDocumentInfo() zwraca obiekt zawierający informacje o dokumencie, które można wyświetlić lub przetworzyć.
informacje = czytnik.getDocumentInfo()
print(f"Autor: {informacje.author}")
print(f"Tytuł: {informacje.title}")
Metadane mogą być przydatne przy katalogowaniu dokumentów lub wyświetlaniu informacji w interfejsie użytkownika.
Aby uzyskać dostęp do treści konkretnej strony, używamy metody getPage(nr_strony), która zwraca obiekt reprezentujący daną stronę.
strona = czytnik.getPage(0) # Pobiera pierwszą stronę
Możemy następnie wyodrębnić tekst ze strony za pomocą metody extractText().
tekst = strona.extractText()
print(tekst)
extractText() może nie zawsze działać poprawnie z nowszymi formatami PDF lub jeśli dokument zawiera niestandardowe czcionki czy układy.Jeśli chcemy przetworzyć cały dokument, możemy iterować przez wszystkie strony za pomocą pętli for.
for nr_strony in range(liczba_stron):
strona = czytnik.getPage(nr_strony)
tekst = strona.extractText()
print(f"Strona {nr_strony + 1}:")
print(tekst)
Do modyfikacji dokumentów PDF używamy obiektu PdfFileWriter, który pozwala na tworzenie nowych dokumentów lub modyfikowanie istniejących.
from PyPDF2 import PdfFileWriter
pisarz = PdfFileWriter()
Możemy dodawać strony do nowego dokumentu za pomocą metody addPage().
strona = czytnik.getPage(0)
pisarz.addPage(strona)
PdfFileWriter nie modyfikuje istniejącego dokumentu, ale tworzy nowy, co jest ważne dla zachowania integralności oryginalnych plików.
Aby dodać nową stronę z własnym tekstem, potrzebujemy dodatkowej biblioteki, takiej jak ReportLab, która umożliwia generowanie stron PDF.
pip install reportlab
Następnie tworzymy nową stronę za pomocą canvas z ReportLab.
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from io import BytesIO
packet = BytesIO()
can = canvas.Canvas(packet, pagesize=A4)
can.drawString(100, 750, "Hello, World!")
can.save()
Po utworzeniu nowej strony, integrujemy ją z istniejącym dokumentem za pomocą PyPDF2.
packet.seek(0)
nowy_pdf = PdfFileReader(packet)
pisarz.addPage(nowy_pdf.getPage(0))
Proces ten pozwala na tworzenie złożonych dokumentów z własnymi treściami i istniejącymi stronami.
Aby zapisać nowy lub zmodyfikowany dokument, używamy metody write() obiektu PdfFileWriter.
with open('nowy_plik.pdf', 'wb') as plik_wyjsciowy:
pisarz.write(plik_wyjsciowy)
'wb') jest konieczny, aby plik został zapisany poprawnie.Do łączenia wielu plików PDF używamy klasy PdfFileMerger z biblioteki PyPDF2.
from PyPDF2 import PdfFileMerger
merger = PdfFileMerger()
Możemy dodawać pliki do obiektu merger za pomocą metody append().
pliki_do_polaczenia = ['plik1.pdf', 'plik2.pdf', 'plik3.pdf']
for plik_pdf in pliki_do_polaczenia:
merger.append(plik_pdf)
Na koniec zapisujemy połączony dokument do nowego pliku.
with open('polaczony_dokument.pdf', 'wb') as plik_wyjsciowy:
merger.write(plik_wyjsciowy)
Łączenie plików jest szczególnie przydatne przy tworzeniu raportów zbiorczych lub kompilacji dokumentów.
Możemy zabezpieczyć dokument hasłem za pomocą metody encrypt().
pisarz.encrypt(user_pwd='haslo_uzytkownika', owner_pwd='haslo_wlasciciela', use_128bit=True)
Możemy podzielić dokument na mniejsze części, wybierając konkretne strony do nowego dokumentu.
# Dodajemy strony od 2 do 5
for nr_strony in range(1, 5):
strona = czytnik.getPage(nr_strony)
pisarz.addPage(strona)
Chociaż PyPDF2 ma ograniczone wsparcie dla zakładek, możemy dodawać prosty tekst lub adnotacje.
# Dodanie adnotacji na pierwszej stronie
page = reader.pages[0] # Pobieramy pierwszą stronę
# Tworzymy adnotację (przykład prostego tekstu)
annotation = AnnotationBuilder.text(
"To jest przykładowa adnotacja tekstowa!",
rect=(100, 700, 300, 720), # Współrzędne (x1, y1, x2, y2) prostokąta
open=True # Domyślnie otwarta adnotacja
)
# Dodajemy adnotację do strony
page.add_annotation(annotation)
# Dodajemy strony do nowego pliku PDF
for page in reader.pages:
writer.add_page(page)
Możemy obrócić stronę o określony kąt za pomocą metody rotateClockwise().
strona = czytnik.getPage(0)
strona.rotateClockwise(90)
pisarz.addPage(strona)
Podczas pracy z plikami PDF mogą wystąpić różne błędy, dlatego ważne jest, aby implementować obsługę wyjątków.
try:
with open('plik.pdf', 'rb') as plik:
czytnik = PdfFileReader(plik)
except FileNotFoundError:
print("Plik nie został znaleziony.")
except Exception as e:
print(f"Wystąpił błąd: {e}")
with przy ich otwieraniu, ponieważ zapewnia to automatyczne zamknięcie plików, co zapobiega wyciekom pamięci i blokadom plików.