Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save me-suzy/b09fcf786fbb72645a6262beeb48e150 to your computer and use it in GitHub Desktop.
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)
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