Cykl: Automatyzacja procesów z n8n — od danych do AI w jednym narzędziu · Część 7/19

Łączenie plików PDF w jeden plik w Pythonie

Kacper Sieradziński
Kacper Sieradziński18 stycznia 2025 · 2 min czytania
Streszczenie
  • Podstawowe łączenie plików PDF
  • Batch merge z sortowaniem
  • Kontrola metadanych
  • Wybór stron z każdego dokumentu
Łączenie plików PDF w jeden plik w Pythonie

Łączenie wielu plików PDF w jeden spójny dokument to jedna z najczęstszych potrzeb w automatyzacji biurowej. Bez względu na to, czy pracujesz z raportami, fakturami, czy dokumentacją projektową — ręczne scalanie plików w narzędziach graficznych jest czasochłonne i podatne na błędy. Python oferuje proste i niezawodne rozwiązanie: możesz zautomatyzować cały proces łączenia plików PDF za pomocą bibliotek takich jak pypdf (następca PyPDF2) lub PyPDF2, oszczędzając godziny pracy przy jednoczesnym zachowaniu spójności dokumentów.

Podstawowe łączenie plików PDF

Biblioteka pypdf (wcześniej znana jako PyPDF2) to standardowe narzędzie do pracy z plikami PDF w Pythonie. Oferuje prosty interfejs do łączenia dokumentów, który sprawdza się zarówno w prostych, jak i bardziej złożonych scenariuszach. Najprostszy sposób łączenia plików PDF wygląda następująco:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 from pypdf import PdfMerger from pathlib import Path def merge_pdfs(pdf_files: list[str], output_path: str): """Łączy wiele plików PDF w jeden dokument.""" merger = PdfMerger() for pdf_file in pdf_files: merger.append(pdf_file) merger.write(output_path) merger.close() print(f"Połączono {len(pdf_files)} plików PDF w: {output_path}") # Uruchomienie: łączenie trzech plików PDF pdf_files = ["dokument1.pdf", "dokument2.pdf", "dokument3.pdf"] merge_pdfs(pdf_files, "polaczony_dokument.pdf")

Batch merge z sortowaniem

W praktyce często musisz połączyć wszystkie pliki PDF znajdujące się w określonym katalogu. Zamiast ręcznie wybierać każdy plik, możesz zautomatyzować ten proces, przeszukując katalog i łącząc wszystkie znalezione dokumenty. Kluczowe jest tutaj odpowiednie sortowanie — dzięki niemu strony będą w logicznej kolejności. Oto jak to zrobić:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from pypdf import PdfMerger from pathlib import Path import os def batch_merge_pdfs(directory: str, output_path: str): """Łączy wszystkie pliki PDF z katalogu w kolejności alfabetycznej.""" pdf_files = sorted([ os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.pdf') ]) if not pdf_files: print("Nie znaleziono plików PDF w katalogu.") return merger = PdfMerger() for pdf_file in pdf_files: print(f"Dodawanie: {pdf_file}") merger.append(pdf_file) merger.write(output_path) merger.close() print(f"\nPołączono {len(pdf_files)} plików PDF w: {output_path}") # Uruchomienie: batch merge z katalogu batch_merge_pdfs("./pliki_pdf/", "wszystkie_dokumenty.pdf")

Kontrola metadanych

Kurs · 24 lekcje8h 14m
Kurs

Kurs Python dla początkujących — PyStart

Zacznij programować w Pythonie! Idealne dla osób bez doświadczenia. Praktyczne zadania, projekty i wsparcie społeczności.

  • 24 lekcje wideo + 80 ćwiczeń
  • Realne bazy z e-commerce
  • Społeczność i code-review
499 zł799 zł−38%
Rozpocznij naukę

Każdy plik PDF zawiera metadane — informacje o tytule, autorze, dacie utworzenia i innych właściwościach dokumentu. Podczas łączenia plików warto zadbać o to, aby wynikowy dokument miał odpowiednie metadane, które ułatwią późniejszą identyfikację i organizację. Biblioteka pypdf pozwala na łatwe zarządzanie tymi informacjami:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 from pypdf import PdfMerger def merge_with_metadata(pdf_files: list[str], output_path: str, title: str = None, author: str = None): """Łączy pliki PDF z ustawieniem metadanych.""" merger = PdfMerger() for pdf_file in pdf_files: merger.append(pdf_file) # Ustawienie metadanych if title or author: merger.add_metadata({ "/Title": title or "Połączony dokument", "/Author": author or "Automatyzacja Python" }) merger.write(output_path) merger.close() merge_with_metadata( ["dok1.pdf", "dok2.pdf"], "wynik.pdf", title="Raport roczny 2024", author="System automatyzacji" )

Wybór stron z każdego dokumentu

Nie zawsze potrzebujesz wszystkich stron z każdego dokumentu. Czasem chcesz wybrać tylko konkretne strony — na przykład pierwsze trzy strony z każdego raportu lub tylko strony z określonymi rozdziałami. Biblioteka pypdf pozwala na precyzyjne wybieranie stron podczas łączenia dokumentów:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from pypdf import PdfMerger def merge_specific_pages(pdf_files: dict, output_path: str): """ Łączy wybrane strony z plików PDF. pdf_files: dict w formacie {ścieżka: [lista_stron]} Przykład: {"dok1.pdf": [1, 3, 5], "dok2.pdf": [1, 2]} """ merger = PdfMerger() for pdf_file, pages in pdf_files.items(): merger.append(pdf_file, pages=pages) merger.write(output_path) merger.close() merge_specific_pages( { "dokument1.pdf": [1, 3, 5], "dokument2.pdf": [1, 2] }, "wybrane_strony.pdf" )

Obsługa błędów

W rzeczywistych scenariuszach automatyzacji musisz być przygotowany na sytuacje, gdy niektóre pliki mogą być uszkodzone, nieistniejące lub mieć nieprawidłowy format. Bez odpowiedniej obsługi błędów cały proces łączenia może się zatrzymać, a częściowo utworzony dokument zostanie uszkodzony. Oto jak zabezpieczyć swój kod przed takimi problemami:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 from pypdf import PdfMerger from pathlib import Path def safe_merge_pdfs(pdf_files: list[str], output_path: str): """Bezpieczne łączenie plików PDF z obsługą błędów.""" merger = PdfMerger() successful = 0 failed = [] for pdf_file in pdf_files: if not Path(pdf_file).exists(): print(f"Ostrzeżenie: Plik {pdf_file} nie istnieje. Pomijanie.") failed.append(pdf_file) continue try: merger.append(pdf_file) successful += 1 except Exception as e: print(f"Błąd podczas dodawania {pdf_file}: {e}") failed.append(pdf_file) if successful > 0: merger.write(output_path) merger.close() print(f"\nSukces: Połączono {successful} plików PDF w: {output_path}") if failed: print(f"Nie udało się dodać {len(failed)} plików: {failed}") else: merger.close() print("Błąd: Nie udało się połączyć żadnych plików PDF.") safe_merge_pdfs( ["dok1.pdf", "dok2.pdf", "nieistniejacy.pdf"], "bezpieczny_merge.pdf" )

Podsumowanie

Newsletter · co środę

Python co tydzień — newsletter dla programistów

Otrzymuj codzienne ćwiczenia, ciekawostki z ekosystemu Pythona i wskazówki do rozmów rekrutacyjnych.

2 312 czytelników · ⭐ 4,8

Łączenie plików PDF w Pythonie to proste zadanie dzięki bibliotece pypdf. Możesz:

  • Łączyć wiele plików w jeden
  • Automatycznie przetwarzać całe katalogi
  • Kontrolować metadane wynikowego dokumentu
  • Wybierać konkretne strony z każdego dokumentu
  • Obsługiwać błędy bezpiecznie

To narzędzie doskonale sprawdza się w automatyzacji biurowej i przetwarzaniu dokumentów.

➡️ Następny artykuł

Po opanowaniu łączenia plików PDF, poznaj techniki ich rozdzielania i manipulacji stronami:

Rozdzielanie i scalanie stron PDF w Pythonie — wycinanie zakresów stron, dzielenie dokumentów na rozdziały i zaawansowane techniki organizacji dużych dokumentów PDF.

Część 8 z 19

Lista zadań i pipeline'y w Pythonie: makefile/invoke/fabric

druga lekcja cyklu „Automatyzacja procesów z n8n — od danych do AI w jednym narzędziu"

Czytaj kolejny →