Advertisement
nicuf

Convert all html to PDF in a single book

Jan 11th, 2024
1,212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.11 KB | None | 0 0
  1. from fpdf import fpdf, html
  2. import os
  3. import re
  4. from PyPDF2 import PdfMerger
  5.  
  6.  
  7.  
  8. def read_text_from_file(file_path):
  9.     """
  10.    Aceasta functie returneaza continutul unui fisier.
  11.    file_path: calea catre fisierul din care vrei sa citesti
  12.    """
  13.     with open(file_path, encoding='utf8', errors='ignore') as f:
  14.         text = f.read()
  15.         f.close()
  16.         return text
  17.  
  18. def write_to_file(text, file_path):
  19.     """
  20.    Aceasta functie scrie un text intr-un fisier.
  21.    text: textul pe care vrei sa il scrii
  22.    file_path: calea catre fisierul in care vrei sa scrii
  23.    """
  24.     with open(file_path, 'wb') as f:
  25.         f.write(text.encode('utf8', 'ignore'))
  26.         f.close()
  27.  
  28. dict_simboluri = dict()
  29. dict_simboluri['ă'] = 'ă'
  30. dict_simboluri['â'] = 'â'
  31. dict_simboluri['ã'] = 'ã'
  32. dict_simboluri['â'] = 'â'
  33. dict_simboluri['ă'] = 'ă'
  34. dict_simboluri['â'] = 'a'
  35. dict_simboluri['  '] = ' '
  36. dict_simboluri['î'] = 'î'
  37. dict_simboluri['Î'] = 'Î'
  38. dict_simboluri['î'] = 'î'
  39. dict_simboluri['î'] = 'î'
  40. dict_simboluri['Î'] = 'Î'
  41. dict_simboluri['Î'] = 'Î'
  42. dict_simboluri['î'] = 'î'
  43. dict_simboluri['Î'] = 'i'
  44. dict_simboluri['Î'] = 'Î'
  45. dict_simboluri[' '] = ' '
  46. dict_simboluri['ș'] = 'ș'
  47. dict_simboluri['Ș'] = 'Ș'
  48. dict_simboluri['Ş'] = 'Ş'
  49. dict_simboluri['ș'] = 'ș'
  50. dict_simboluri['ş'] = 'ș'
  51. dict_simboluri['&'] = ''
  52. dict_simboluri['ț'] = 'ț'
  53. dict_simboluri['ţ'] = 'ț'
  54. dict_simboluri['Ţ'] = 'Ţ'
  55. dict_simboluri['ț'] = 'ț'
  56. dict_simboluri['”'] = '"'
  57. dict_simboluri['“'] = '"'
  58. dict_simboluri['&'] = ''
  59.  
  60. def save_to_pdf(directory_path):
  61.     modified_files = []
  62.     file_count = 0
  63.     for root, dirs, files in os.walk(directory_path):
  64.         for file_name in files:
  65.             if file_name.endswith(".html"):
  66.                 try:
  67.  
  68.                 # ignora fisierele care contin 'webinar' in numele lor
  69.                     if "webinar" in file_name:
  70.                         print(f"Fișierul {file_name} conține 'webinar' în numele său și va fi ignorat.")
  71.                         continue
  72.  
  73.                     file_path = root + os.sep + file_name
  74.                     file_content = read_text_from_file(file_path)
  75.  
  76.                     # ignora fisierele care contin 'https://pastebin.com' in continutul lor
  77.                     if "https://pastebin.com" in file_content:
  78.                         print(f"Fișierul {file_name} conține 'https://pastebin.com' în conținutul său și va fi ignorat.")
  79.                         continue
  80.  
  81.                     # creare fisier PDF
  82.                     class PDF(fpdf.FPDF, html.HTMLMixin):
  83.                         pass
  84.  
  85.                     if '<!-- ARTICOL START -->' in file_content:
  86.                         pdf = PDF()
  87.                         pdf.add_page()
  88.                         pdf.add_font("Kanit", fname="e:/Carte/BB/17 - Site Leadership/alte/Ionel Balauta/Aryeht/Task 1 - Traduce tot site-ul/Doar Google Web/Andreea/Meditatii/Sedinta 20 august 2022/fonts/Kanit-Regular.ttf", uni=True)
  89.                         pdf.add_font("Kanit", style="B", fname="e:/Carte/BB/17 - Site Leadership/alte/Ionel Balauta/Aryeht/Task 1 - Traduce tot site-ul/Doar Google Web/Andreea/Meditatii/Sedinta 20 august 2022/fonts/Kanit-Bold.ttf", uni=True)
  90.                         pdf.add_font("Kanit", style="I", fname="e:/Carte/BB/17 - Site Leadership/alte/Ionel Balauta/Aryeht/Task 1 - Traduce tot site-ul/Doar Google Web/Andreea/Meditatii/Sedinta 20 august 2022/fonts/Kanit-Italic.ttf", uni=True)
  91.                         pdf.add_font("Kanit", style="BI", fname="e:/Carte/BB/17 - Site Leadership/alte/Ionel Balauta/Aryeht/Task 1 - Traduce tot site-ul/Doar Google Web/Andreea/Meditatii/Sedinta 20 august 2022/fonts/Kanit-BoldItalic.ttf", uni=True)
  92.  
  93.  
  94.                         pdf.set_font("Kanit", size=24)
  95.  
  96.                         # extras denumire articol
  97.                         den_articol = re.search('<h1 class="den_articol" itemprop="name">(.*?)</h1>', file_content) # TITLU ARTICOL
  98.                         if (den_articol == None):
  99.                             print("Nu am gasit --- denumire articol --- in fisierul --- {} ---.".format(file_path))
  100.                         else:
  101.                             den_articol = den_articol.group(1)
  102.                             for simbol in dict_simboluri.keys():
  103.                                 den_articol = den_articol.replace(simbol, dict_simboluri[simbol])
  104.  
  105.                         pdf.set_text_color(204, 0, 0) # rosu
  106.                         pdf.set_font('Kanit', size=14, style="B")
  107.                         pdf.multi_cell(w=190, txt=den_articol)
  108.                         pdf.ln()
  109.                         pdf.set_font('Kanit', size=12)
  110.  
  111.                         # extras data
  112.                         date = re.search('<td class="text_dreapta">(.*?), in <a', file_content) # DATA ARTICOLULUI
  113.                         if (date == None):
  114.                             print("Nu am gasit --- date --- in fisierul --- {} ---.".format(file_path))
  115.                         else:
  116.                             date = date.group(1)
  117.  
  118.                         pdf.set_text_color(0, 102, 204) # albastru
  119.                         pdf.set_font('Kanit', size=8, style="B")
  120.                         pdf.cell(txt=date)
  121.                         pdf.ln()
  122.                         pdf.ln()
  123.                         pdf.ln()
  124.                         pdf.ln()
  125.                         pdf.set_text_color(0, 0, 0) # negru (default)
  126.                         pdf.set_font('Kanit', size=12)
  127.                         # extras text
  128.                         # articol = re.search('<!-- ARTICOL START -->([\s\S]*?)<!-- ARTICOL FINAL -->', file_content)
  129.                         articol = re.search(r'<!-- ARTICOL START -->([\s\S]*?)<!-- ARTICOL FINAL -->', file_content)
  130.  
  131.                         if (articol == None):
  132.                             print("Nu am gasit --- ARTICOL START/FINAL --- in fisierul --- {} ---.".format(file_path))
  133.                         else:
  134.                             articol = articol.group(1)
  135.                             articol = articol.replace("&quot;", "\"")
  136.                             articol = articol.replace("&rsquo;", "'")
  137.  
  138.                             # paragraphs
  139.                             par_regex = re.compile('<p class="text_obisnuit.*?">.*?</p>')
  140.                             pars = re.findall(par_regex, articol)
  141.                             pars_text = list()
  142.  
  143.                             if (len(pars) == 0):
  144.                                 print("Nu am gasit -- paragrafe text_obisnuit -- in fisierul --- {} ---.".format(file_path))
  145.                             else:
  146.                                 for i in range(0, len(pars)):
  147.                                     pars_text = []  # reinițializează lista la începutul fiecărei iterații
  148.                                     if ('<p class="text_obisnuit">' in pars[i]):
  149.                                         # identificam clasa text_obisnuit si preluam textul
  150.                                         content = re.findall('<p class="text_obisnuit">(.*?)</p>', pars[i])
  151.                                         if (len(content) == 0):
  152.                                             print("Nu am gasit text in paragraful {}, fisierul {}.".format(pars[i], file_path))
  153.                                         else:
  154.                                             # punem textul intr-o celula multi_cell
  155.                                             for simbol in dict_simboluri.keys():
  156.                                                 content[0] = content[0].replace(simbol, dict_simboluri[simbol])
  157.                                             content[0] = re.sub('<img[^>]*>', '', content[0])  # linia nou adăugată
  158.                                             pars_text.append(content[0])
  159.                                             pdf.write_html(text=f'<p class="text_obisnuit">{content[0]}</p>')
  160.  
  161.                                             # adaugam linie goala intre paragrafe
  162.                                             pdf.ln();
  163.  
  164.  
  165.                                     elif ('<p class="text_obisnuit2">' in pars[i]):
  166.  
  167.                                         # identificam clasa text_obisnuit2 si preluam textul
  168.                                         content = re.findall('<p class="text_obisnuit2">(.*?)</p>', pars[i])
  169.                                         if (len(content) == 0):
  170.                                             print("Nu am gasit text in paragraful {}, fisierul {}.".format(pars[i], file_path))
  171.                                         else:
  172.  
  173.                                             # setam fontul cu bold
  174.                                             pdf.set_font('Kanit', size=12, style="B")
  175.  
  176.  
  177.                                             # punem textul intr-o celula multi_cell
  178.                                             for simbol in dict_simboluri.keys():
  179.                                                 content[0] = content[0].replace(simbol, dict_simboluri[simbol])
  180.                                             pars_text.append(content[0])
  181.                                             # pdf.multi_cell(w=190, txt = content[0])
  182.                                             pdf.write_html(text=f'<p class="text_obisnuit2"><b>{content[0]}</b></p>')
  183.  
  184.                                             # adaugam linie goala intre paragrafe
  185.                                             pdf.ln();
  186.  
  187.                                             # resetam fontul
  188.                                             pdf.set_font('Kanit', size=12)
  189.                                     else:
  190.                                         continue
  191.                             # adaugare link
  192.                             pdf.ln()
  193.                             pdf.ln()
  194.                             pdf.set_font('Kanit', size=12, style="B")
  195.                             pdf.cell(txt="Source:")
  196.                             pdf.set_font('Kanit', size=12)
  197.                             pdf.set_text_color(0, 102, 204) # albastru
  198.                             # pdf.cell(w=40, txt="https://neculaifantanaru.com/{}".format(file_name), link="https://neculaifantanaru.com/{}".format(file_name))
  199.                             pdf.cell(w=40, txt="https://neculaifantanaru.com/en/{}".format(file_name), link="https://neculaifantanaru.com/en/{}".format(file_name))  # ENGLEZA
  200.  
  201.                             den_fisier = file_path.split('.')[0] + '.pdf'
  202.                             pdf.output(den_fisier)
  203.                             # break;
  204.  
  205.                     # la sfârșitul procesării fiecărui fișier HTML:
  206.                     modified_files.append(file_name)
  207.                     file_count += 1
  208.                     print(f"Fișierul {file_count}: {file_name} a fost modificat.")
  209.  
  210.                 except Exception as e:
  211.                     print(f"Eroare la procesarea fișierului {file_name}: {e}")
  212.                     # Poți continua bucla sau utiliza 'break' sau 'continue' în funcție de necesități.
  213.                     continue
  214.  
  215.  
  216.  
  217.     # la sfârșitul funcției, puteți afișa toate fișierele modificate:
  218.     print(f"\nAu fost modificate {file_count} fișiere:")
  219.     for i, file_name in enumerate(modified_files, 1):
  220.         print(f"{i}. {file_name}")
  221.  
  222. # functie care face merge la mai multe fisiere pdf
  223. def merge_pdf_files(directory_path):
  224.     merger = PdfMerger()
  225.     for root, dirs, files in os.walk(directory_path):
  226.         for file_name in files:
  227.             if file_name.endswith(".pdf"):
  228.                 print("PDF: ", file_name)
  229.                 file_path = root + os.sep + file_name
  230.                 merger.append(file_path)
  231.     merger.write(root + os.sep + "articles.pdf")
  232.     merger.close()
  233.  
  234.  
  235.     # adaugare link
  236.     pdf.ln()
  237.     pdf.ln()
  238.     pdf.set_font('Kanit', size=12, style="B")
  239.     pdf.cell(txt="Source:")
  240.     pdf.set_font('Kanit', size=12)
  241.     pdf.set_text_color(0, 102, 204) # albastru
  242.     pdf.cell(w=40, txt="https://neculaifantanaru.com/{}".format(file_name), link="https://neculaifantanaru.com/{}".format(file_name))
  243.  
  244.     den_fisier = file_path.split('.')[0] + '.pdf'
  245.     pdf.output(den_fisier)
  246.     # break;
  247.  
  248.     # la sfârșitul procesării fiecărui fișier HTML:
  249.     modified_files.append(file_name)
  250.     file_count += 1
  251.     print(f"Fișierul {file_count}: {file_name} a fost modificat.")
  252.  
  253.     # la sfârșitul funcției, puteți afișa toate fișierele modificate:
  254.     print(f"\nAu fost modificate {file_count} fișiere:")
  255.     for i, file_name in enumerate(modified_files, 1):
  256.         print(f"{i}. {file_name}")
  257.  
  258. # functie care face merge la mai multe fisiere pdf
  259. def merge_pdf_files(directory_path):
  260.     merger = PdfMerger()
  261.     for root, dirs, files in os.walk(directory_path):
  262.         for file_name in files:
  263.             if file_name.endswith(".pdf"):
  264.                 print("PDF: ", file_name)
  265.                 file_path = root + os.sep + file_name
  266.                 merger.append(file_path)
  267.         merger.write(root + os.sep + "articles.pdf")
  268.         merger.close()
  269.         break;
  270. # apoi apelați funcția:
  271. save_to_pdf("c:\\Folder9\\")
  272. merge_pdf_files("c:\\Folder9\\")
  273.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement