Data: 8.07.2021

Obsługa plików pdf w Pythonie

Obsługa plików pdf w Pythonie

Spis treści

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.

Title

Otworzy się wówczas konsola, w której możesz wpisywać polecenia.

Wpisz w konsoli następujące polecenie: py -m pip install pypdf

Title

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.

Title

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

Title

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.

Title

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.

Title

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

Title

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, PDFPageInterpreter
from pdfminer.converter import TextConverter, HTMLConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from 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, PDFPageInterpreter
from pdfminer.converter import TextConverter, HTMLConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from 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ń.

Rafał Lelusz
Rafał Lelusz
Programista Python, C#
Udostępnij wpis:udostępnij Facebookudostępnij Linkedinudostępnij e-mail

Polecane