Created
May 9, 2025 20:28
-
-
Save me-suzy/b09fcf786fbb72645a6262beeb48e150 to your computer and use it in GitHub Desktop.
Aduna si adauga toate fisierele html din folder intr-un singur pdf (Claude.ai SIMPLU)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import sys | |
from PyPDF2 import PdfMerger | |
from bs4 import BeautifulSoup | |
from reportlab.pdfgen import canvas | |
from reportlab.lib.pagesizes import A4 | |
from reportlab.pdfbase.ttfonts import TTFont | |
from reportlab.pdfbase import pdfmetrics | |
def convert_html_to_pdf(html_folder_path): | |
""" | |
Convertește toate fișierele HTML dintr-un folder în PDF-uri și le combină | |
Args: | |
html_folder_path: Calea către folderul cu fișiere HTML | |
""" | |
print(f"Începe conversia HTML în PDF în: {html_folder_path}") | |
# Verifică dacă folderul există | |
if not os.path.isdir(html_folder_path): | |
print(f"Eroare: Directorul '{html_folder_path}' nu există.") | |
return False | |
# Găsește toate fișierele HTML | |
html_files = [] | |
all_files = os.listdir(html_folder_path) | |
# Filtrează fișierele HTML | |
for file in all_files: | |
file_lower = file.lower() | |
if (file_lower.endswith('.html') or | |
file_lower.endswith('.htm') or | |
'vizualizare' in file_lower or | |
'html-articol=' in file_lower): | |
html_files.append(os.path.join(html_folder_path, file)) | |
print(f"Găsite {len(html_files)} fișiere HTML pentru conversie") | |
if not html_files: | |
print(f"Eroare: Nu s-au găsit fișiere HTML în '{html_folder_path}'.") | |
return False | |
# Crează un folder pentru PDF-uri | |
pdf_folder = os.path.join(html_folder_path, "pdf_files") | |
os.makedirs(pdf_folder, exist_ok=True) | |
# Încercarea de a găsi și înregistra fontul DejaVuSans | |
font_paths = [ | |
"DejaVuSans.ttf", # Caută în directorul curent | |
os.path.join(os.path.dirname(__file__), "DejaVuSans.ttf"), # Caută în directorul scriptului | |
"C:/Windows/Fonts/DejaVuSans.ttf", # Windows | |
"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", # Linux | |
"/usr/share/fonts/TTF/DejaVuSans.ttf", # Linux alternativ | |
"/Library/Fonts/DejaVuSans.ttf" # macOS | |
] | |
font_registered = False | |
for font_path in font_paths: | |
if os.path.exists(font_path): | |
try: | |
pdfmetrics.registerFont(TTFont('DejaVuSans', font_path)) | |
print(f"Font înregistrat: DejaVuSans din {font_path}") | |
font_registered = True | |
break | |
except: | |
continue | |
if not font_registered: | |
print("AVERTISMENT: Nu s-a găsit fontul DejaVuSans. Se va utiliza Helvetica, iar diacriticele ar putea să nu fie afișate corect.") | |
print("Descărcați fontul DejaVuSans.ttf și plasați-l în același director cu acest script.") | |
# Convertește fiecare fișier HTML în PDF | |
pdf_files = [] | |
for i, html_file in enumerate(html_files): | |
base_name = os.path.basename(html_file) | |
pdf_file = os.path.join(pdf_folder, f"{i+1:04d}_{base_name}.pdf") | |
print(f"Convertesc {base_name} în PDF... ({i+1}/{len(html_files)})") | |
try: | |
# Încearcă să citească fișierul HTML cu diferite codificări | |
html_content = None | |
for encoding in ['utf-8', 'latin-1', 'latin2', 'cp1250', 'cp1252', 'iso-8859-2']: | |
try: | |
with open(html_file, 'r', encoding=encoding) as f: | |
html_content = f.read() | |
break | |
except UnicodeDecodeError: | |
continue | |
if html_content is None: | |
print(f" Se omite {base_name} din cauza problemelor de codificare") | |
continue | |
# Analizează HTML | |
soup = BeautifulSoup(html_content, 'html.parser') | |
# Extrage textul | |
text = soup.get_text() | |
# Crează PDF cu reportlab | |
c = canvas.Canvas(pdf_file, pagesize=A4) | |
width, height = A4 | |
# Împarte textul în linii | |
lines = text.split('\n') | |
y = height - 50 # Pornește de sus | |
# Adaugă titlul | |
font_name = 'DejaVuSans' if font_registered else 'Helvetica' | |
c.setFont(font_name, 14) | |
title = base_name[:40] + "..." if len(base_name) > 40 else base_name | |
c.drawString(50, y, title) | |
y -= 30 | |
# Adaugă conținutul text | |
c.setFont(font_name, 10) | |
for line in lines: | |
if line.strip(): | |
# Gestionează liniile lungi prin înfășurare | |
words = line.split() | |
current_line = "" | |
for word in words: | |
try: | |
# Sanitizează cuvântul | |
word = ''.join(char for char in word if ord(char) >= 32) | |
if c.stringWidth(current_line + " " + word, font_name, 10) < width - 100: | |
current_line += " " + word if current_line else word | |
else: | |
c.drawString(50, y, current_line) | |
y -= 15 | |
if y < 50: # Adaugă pagină nouă dacă e nevoie | |
c.showPage() | |
c.setFont(font_name, 10) | |
y = height - 50 | |
current_line = word | |
except: | |
# Dacă există o problemă cu acest cuvânt, sari peste el | |
continue | |
if current_line: | |
try: | |
c.drawString(50, y, current_line) | |
except: | |
# Dacă există vreo problemă la afișarea liniei, o omitem | |
pass | |
y -= 15 | |
if y < 50: # Adaugă pagină nouă dacă e nevoie | |
c.showPage() | |
c.setFont(font_name, 10) | |
y = height - 50 | |
c.save() | |
pdf_files.append(pdf_file) | |
print(f" Conversie reușită pentru {base_name}") | |
except Exception as e: | |
print(f" Eroare la conversia {base_name}: {e}") | |
if not pdf_files: | |
print("Eroare: Nu s-a reușit conversia niciunui fișier HTML în PDF.") | |
return False | |
# Combină toate PDF-urile într-un singur fișier | |
print(f"Combinarea a {len(pdf_files)} PDF-uri într-un singur fișier...") | |
# Crează PDF-ul final | |
final_pdf_path = os.path.join(html_folder_path, "final.pdf") | |
merger = PdfMerger() | |
successful_merges = 0 | |
for pdf_file in pdf_files: | |
if os.path.exists(pdf_file) and os.path.getsize(pdf_file) > 0: | |
try: | |
merger.append(pdf_file) | |
successful_merges += 1 | |
except Exception as e: | |
print(f"Eroare la adăugarea {os.path.basename(pdf_file)}: {e}") | |
if successful_merges == 0: | |
print("Eroare: Nu s-a putut combina niciun PDF.") | |
return False | |
merger.write(final_pdf_path) | |
merger.close() | |
print(f"Combinare reușită a {successful_merges} PDF-uri") | |
print(f"PDF final creat: {final_pdf_path}") | |
print(f"PDF-uri individuale disponibile în: {pdf_folder}") | |
return True | |
if __name__ == "__main__": | |
if len(sys.argv) > 1: | |
folder_path = sys.argv[1] | |
else: | |
folder_path = input("Introduceți calea către folderul cu fișiere HTML: ") | |
convert_html_to_pdf(folder_path) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment