Last modified: October 29, 2023
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.