Last modified: October 25, 2022

This article is written in: 🇵🇱

Manipulacja i analiza plików PDF

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.

Wprowadzenie do PyPDF2

Instalacja biblioteki 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

Otwieranie i odczytywanie pliku PDF

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)

Eksploracja informacji o pliku PDF

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.

Odczytywanie zawartości stron

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)

Iterowanie przez wszystkie strony dokumentu

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)

Modyfikowanie dokumentów PDF

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.

Dodawanie nowej strony z tekstem

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.

Zapisywanie zmodyfikowanego dokumentu

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)

Łączenie wielu plików PDF w jeden dokument

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.

Dodatkowe funkcje PyPDF2

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)

Obsługa wyjątków i błędów

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}")

Alternatywne biblioteki do manipulacji plikami PDF

Praktyczne zastosowania manipulacji plikami PDF

Dobre praktyki

Spis Treści

    Manipulacja i analiza plików PDF
    1. Wprowadzenie do PyPDF2
    2. Instalacja biblioteki PyPDF2
    3. Otwieranie i odczytywanie pliku PDF
    4. Eksploracja informacji o pliku PDF
    5. Odczytywanie zawartości stron
    6. Iterowanie przez wszystkie strony dokumentu
    7. Modyfikowanie dokumentów PDF
    8. Dodawanie nowej strony z tekstem
    9. Zapisywanie zmodyfikowanego dokumentu
    10. Łączenie wielu plików PDF w jeden dokument
    11. Dodatkowe funkcje PyPDF2
    12. Obsługa wyjątków i błędów
    13. Alternatywne biblioteki do manipulacji plikami PDF
    14. Praktyczne zastosowania manipulacji plikami PDF
    15. Dobre praktyki