Data: 8.07.2021

Obsługa plików pdf w Pythonie
Spis treści
- Obsługa plików pdf w Pythonie
- Instalacja IDLE
- Instalacja biblioteki pypdf języka Python
- Sprawdzenie instalacji biblioteki pypdf
- Obsługa plików pdf w Pythonie – łączenie plików .pdf w jeden plik
- Wycięcie jednej strony do osobnego pliku .pdf
- Skopiowanie strony z różnych plików pdf do oddzielnego pliku
- Nałożenie dwóch stron na jednej
- Obrócenie strony w pliku pdf
- Wydobycie treści z pliku .pdf
W artykule Obsługa plików pdf w Pythonie znajdziesz informacje na temat biblioteki Pythona, za pomocą której można przetwarzać pliki w formacie pdf.
Instalacja IDLE
W pierwszym kroku należy zainstalować IDLE, jeśli go nie masz na komputerze. Informacje o tym, w jaki sposób zainstalować Pythona, a wraz z nim IDLE, znajdziesz w artykule Python instalacja
Instalacja biblioteki pypdf języka Python
Do łączenia plików .pdf potrzebujesz biblioteki pypdf. Aby ją zainstalować, kliknij menu Start i wpisz polecenie cmd.

Otworzy się wówczas konsola, w której możesz wpisywać polecenia.
Wpisz w konsoli następujące polecenie: py -m pip install pypdf

Jeśli pojawi się ostrzeżenie (Warning) z informacją o dostępności nowszej wersji instalatora pip, możesz je zignorować.
Po poprawnym zainstalowaniu biblioteki, w konsoli pojawia się komunikat „Successfully installed pypdf-5.1.0”. Na dzień pisania artykułu dostępna jest wersja 5.1.0. Numer wersji zainstalowany na Twoim komputerze może być inny.
Jeśli biblioteka pypdf została już wcześniej zainstalowana na Twoim komputerze, pojawi się komunikat, że wymaganie jest już spełnione „Requirement already satisfied”.
Sprawdzenie instalacji biblioteki pypdf
Po zainstalowaniu biblioteki, można zweryfikować, czy udaje się ją zaimportować w konsoli Pythona. Aby to zrobić, w wierszu poleceń wpisz polecenie py i kliknij Enter. Uruchomisz w ten sposób konsolę języka Python.

Następnie wpisz polecenie import pypdf. Brak komunikatu błędu oznacza, że biblioteka pypdf została zaimportowana.

Obsługa plików pdf w Pythonie – łączenie plików .pdf w jeden plik
W wybranym katalogu zapisz pliki pdf, które chcesz złączyć oraz plik .py, w którym napiszesz program w Pythonie łączący pliki pdf.

W moim przypadku mam dwa dokumenty o nazwach „Python_1.pdf” oraz „Python_2.pdf”.
W pliku .py piszę następujący kod:
from pypdf import PdfWriter
# pliki do złączania:pdfs=['Python_1.pdf', 'Python_2.pdf']
writer = PdfWriter()for filename in pdfs: writer.append(filename)
# plik ze wszystkimi stronami:writer.write("python_all.pdf")Uruchamiamy program. Po uruchomieniu programu w katalogu pojawi się dodatkowy plik .pdf o nazwie „python_all.pdf” zawierający złączone pliki.

Uwaga! Plik .py zawierający program musi być w tym samym katalogu, w którym znajdują się pliki .pdf przeznaczone do złączenia.
Wycięcie jednej strony do osobnego pliku .pdf
Możemy wyodrębnić jedną lub więcej stron z pliku pdf i zapisać te strony w nowym pliku.
Jedną stronę można wyodrębnić za pomocą poniższego kodu:
from pypdf import PdfWriter, PdfReader
pdf='Python_materialy.pdf'reader = PdfReader(pdf)writer = PdfWriter()# weź stronę 0 (0=pierwsza, 1=druga itd)writer.add_page(reader.get_page(5))writer.write(open('nowy_plik.pdf','wb'))Kilka stron można wyodrębnić za pomocą poniższego kodu:
from pypdf import PdfWriter, PdfReader
pdf='Python_materialy.pdf'reader = PdfReader(pdf)writer = PdfWriter()# weź stronę 0 (0=pierwsza, 1=druga itd)writer.add_page(reader.get_page(5))writer.add_page(reader.get_page(7))writer.add_page(reader.get_page(9))writer.write(open('nowy_plik.pdf','wb'))Skopiowanie strony z różnych plików pdf do oddzielnego pliku
Możemy wybrane strony z różnych plików .pdf skopiować i zapisać je do oddzielnego pliku pdf:
from pypdf import PdfWriter, PdfReader
writer = PdfWriter()
reader = PdfReader('Python_1.pdf')print('Liczba stron w pdf:', len(reader.pages))writer.add_page(reader.get_page(0))writer.add_page(reader.get_page(1))writer.add_page(reader.get_page(2))reader = PdfReader('Python_2.pdf')print('Liczba stron w pdf:', len(reader.pages))writer.add_page(reader.get_page(0))
writer.write('wybrane.pdf')Nałożenie dwóch stron na jednej
Może to być przydane do nałożenia tekstów na widok formularza, albo do dodania tła do istniejącej strony z pdf.
from pypdf import PdfWriter, PdfReader
reader1 = PdfReader('Python_1.pdf')page_bk = reader1.get_page(0)reader2 = PdfReader('Python_2.pdf')page_fg = reader2.get_page(1)
page_bk.merge_page(page_fg) # złącz dwie strony w jedną
output_pdf = PdfWriter()output_pdf.add_page(page_bk)output_pdf.write('merged_1_2.pdf')Obrócenie strony w pliku pdf
Poszczególne strony można obracać. Funkcje rotateCounterClockwise() i rotateClockwise() służą do obrócenia strony odpowiednio w prawo i lewo.
from pypdf import PdfWriter, PdfReader
writer = PdfWriter()
reader = PdfReader('Python_1.pdf')print('Liczba stron w pdf:', len(reader.pages))writer.add_page(reader.get_page(0).rotate(90))writer.add_page(reader.get_page(1).rotate(90))writer.add_page(reader.get_page(2).rotate(90))writer.add_page(reader.get_page(3).rotate(-90))writer.write('Python_zmienione.pdf')Wydobycie treści z pliku .pdf
Do wydobycia treści z pliku .pdf służy biblioteka pdfminer
Aby zainstalować bibliotekę pdfminer, uruchom w konsoli instalator pip za pomocą jednego z poniższych poleceń:
py -m pip install pdfminer
python -m pip install pdfminer
python3 -m pip install pdfminer
pip install pdfminer
pip3 install pdfminer
Ja użyję polecenia py -m pip install pdfminer

Wydobycie treści z .pdf do pliku tekstowego
Aby wydobyć treść z .pdf do postaci tekstowej, możemy użyć poniższego kodu:
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreterfrom pdfminer.converter import TextConverter, HTMLConverterfrom pdfminer.layout import LAParamsfrom pdfminer.pdfpage import PDFPagefrom io import StringIO
def convert_pdf_to_txt(path): manager = PDFResourceManager() retstr = StringIO() laparams = LAParams() device = TextConverter(manager, retstr, laparams=laparams)
fp = open(path, 'rb') interpreter = PDFPageInterpreter(manager, device) password = "" maxpages = 0 caching = True pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True): interpreter.process_page(page)
text = retstr.getvalue()
fp.close() device.close() retstr.close() return text
path='Python_1.pdf'text = convert_pdf_to_txt(path)with open('wynik1.txt', 'w', encoding='utf-8') as f: f.write(text)Wydobycie treści z .pdf do pliku html
Możliwe jest też zakodowanie wyniku .pdf jako kodu html. Pozwoli to mniej więcej zachować podział na strony i układ poszczególnych stron.
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreterfrom pdfminer.converter import TextConverter, HTMLConverterfrom pdfminer.layout import LAParamsfrom pdfminer.pdfpage import PDFPagefrom io import StringIO
def convert_pdf_to_txt(path): manager = PDFResourceManager() retstr = StringIO() laparams = LAParams()
layout = LAParams(all_texts=True) layoutmode = 'normal' imagewriter = None device = HTMLConverter(manager, retstr, layoutmode=layoutmode, laparams=layout, imagewriter=imagewriter)
fp = open(path, 'rb') interpreter = PDFPageInterpreter(manager, device) password = "" maxpages = 0 caching = True pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True): interpreter.process_page(page)
html = retstr.getvalue()
fp.close() device.close() retstr.close() return html
path='Python_materialy.pdf'html = convert_pdf_to_txt(path)with open('wynik.html', 'w', encoding='utf-8') as f: f.write(html)Jeśli interesuje Cię Python i chcesz poćwiczyć jego składnię zobacz nasze kursy z Pythona. Na każdym ze szkoleń masz możliwość rozwiązania ponad 100 praktycznych ćwiczeń.
