Python automatyzacja - obsługa plików .pof - Avendi
Szybki kontakt




W artykule znajdziesz informacje, w jaki sposób język Python można wykorzystać do pracy z plikami w formacie .pdf

W pierwszym kroku musisz 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 pypdf4 języka Python

Do łączenia plików .pdf potrzebujesz biblioteki pypdf4. Aby ją zainstalować, kliknij menu Start i wpisz polecenie cmd.

Menu Start polecenie cmd

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

Windows wiersz polecenia

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

Wiersz poleceń instalacja biblioteki pypdf4

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 pypdf4-1.27.0”.

Jeśli biblioteka pypdf4 została już wcześniej zainstalowana na Twoim komputerze, pojawi się komunikat, że wymaganie jest już spełnione „Requirement already satisfied”.

Komunikat - biblioteka pypdf4 została już wcześniej zainstalowana na komputerze

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.

Wiersz poleceń - wejście do konsoli Pythona

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

Wiersz poleceń - konsola Python biblioteka pypdf4 zainstalowana bez błędów

Gdyby biblioteka nie została zaimportowana, pojawiłby się następujący komunikat błędu:

Wiersz poleceń - konsola Pythona, błąd importu biblioteki pypdf4

Łączenie plików .pdf w jeden plik

W wybranym katalogu zapisz pliki pdf, które chcesz złączyć oraz plik .py, w którym mapiszesz program łączący pliki pdf.

Python łączenie plików pdf krok 1

W moim przypadku mam dwa dokumenty o nazwach „Python_1.pdf” oraz „Python_2.pdf”.

W pliku .py piszę następujący kod:

from PyPDF4 import PdfFileMerger, PdfFileReader

# pliki do złączania:
pdfs=['Python_1.pdf', 'Python_2.pdf']

merger = PdfFileMerger()
for filename in pdfs:
    merger.append(filename)


# plik ze wszystkimi stronami:
merger.write("python.pdf")

Uruchamiamy program. Po uruchomieniu programu w katalogu pojawi się dodatkowy plik .pdf o nazwie „python.pdf” zawierający złączone pliki.

Python łączenie plików pdf krok 3

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 PyPDF4 import PdfFileReader, PdfFileWriter

pdf='Python_materialy.pdf'
reader = PdfFileReader(pdf)
writer = PdfFileWriter()
# weź stronę 0 (0=pierwsza, 1=druga itd)
writer.addPage(reader.getPage(5)) 
writer.write(open('nowy_plik.pdf','wb'))

Kilka stron można wyodrębnić za pomocą poniższego kodu:

from PyPDF4 import PdfFileReader, PdfFileWriter

pdf='Python_materialy.pdf'
reader = PdfFileReader(pdf)
writer = PdfFileWriter()
# weź stronę 0 (0=pierwsza, 1=druga itd)
writer.addPage(reader.getPage(5)) 
writer.addPage(reader.getPage(7)) 
writer.addPage(reader.getPage(9)) 
writer.write(open('nowy_plik.pdf','wb'))

Skopiowanie strony z różnych pdf-ów do oddzielnego pliku pdf

Możemy wybrane strony z różnych plików .pdf skopiować i zapisać je do oddzielnego pliku pdf:

from PyPDF4 import PdfFileReader, PdfFileWriter

writer = PdfFileWriter()

reader = PdfFileReader('Python_materialy.pdf')
print('Liczba stron w pdf:', reader.getNumPages())
writer.addPage(reader.getPage(0))
writer.addPage(reader.getPage(1))
writer.addPage(reader.getPage(2))
reader = PdfFileReader('Python_materialy_new.pdf')
print('Liczba stron w pdf:', reader.getNumPages())
writer.addPage(reader.getPage(0))

writer.write(open('wybrane.pdf','wb'))

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 PyPDF4 import PdfFileReader, PdfFileWriter

reader1 = PdfFileReader('tło.pdf')
page_bk = reader1.getPage(0)
reader2 = PdfFileReader('tytuł.pdf')
page_fg = reader2.getPage(0)

page_bk.mergePage(page_fg) # złącz dwie strony w jedną

output_pdf = PdfFileWriter()
output_pdf.addPage(page_bk)
output_pdf.write(open('okładka.pdf', "wb"))

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 PyPDF4 import PdfFileReader, PdfFileWriter

writer = PdfFileWriter()

reader = PdfFileReader('Python_materialy.pdf')
print('Liczba stron w pdf:', reader.getNumPages())
writer.addPage(reader.getPage(0).rotateClockwise(90))
writer.addPage(reader.getPage(1).rotateClockwise(90))
writer.addPage(reader.getPage(2).rotateClockwise(90))
writer.addPage(reader.getPage(3).rotateCounterClockwise(90))
writer.write(open('Python_materialy_zmienione.pdf','wb'))

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

Wiersz poleceń - instalacja biblioteki 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, 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_materialy.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)

Dodaj komentarz

Twój adres email nie zostanie opublikowany.