Nick_34

convert html files to one PDF (merge files)

Aug 27th, 2022 (edited)
562
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.87 KB | None | 0 0
  1. ----------------------
  2. EXPLANATION:
  3.  
  4. ROMANIAN: https://neculaifantanaru.com/python-convert-multiple-html-pages-into-one-pdf-file-cu-libraria-fpdf-si-fpdf2.html
  5. or
  6. ENGLISH: https://neculaifantanaru.com/python-convert-multiple-html-pages-into-one-pdf-file-with-libraria-fpdf-and-fpdf2.html
  7. ----------------------
  8.  
  9.  
  10. from fpdf import fpdf, html
  11. import os
  12. import re
  13.  
  14. from PyPDF2 import PdfFileMerger
  15.  
  16. def read_text_from_file(file_path):
  17.     """
  18.    Aceasta functie returneaza continutul unui fisier.
  19.    file_path: calea catre fisierul din care vrei sa citesti
  20.    """
  21.     with open(file_path, encoding='utf8', errors='ignore') as f:
  22.         text = f.read()
  23.         f.close()
  24.         return text
  25.     file_content = re.sub('<span class="text_obisnuit2">(.*)</span>', '<b>\g<1></b>', file_content)
  26.  
  27. def write_to_file(text, file_path):
  28.     """
  29.    Aceasta functie scrie un text intr-un fisier.
  30.    text: textul pe care vrei sa il scrii
  31.    file_path: calea catre fisierul in care vrei sa scrii
  32.    """
  33.     with open(file_path, 'wb') as f:
  34.         f.write(text.encode('utf8', 'ignore'))
  35.         f.close()
  36.  
  37. dict_simboluri = dict()
  38. dict_simboluri['&#259;'] = 'ă'
  39. dict_simboluri['&#226;'] = 'â'
  40. dict_simboluri['&atilde;'] = 'ã'
  41. dict_simboluri['&acirc;'] = 'â'
  42. dict_simboluri['&#x103;'] = 'ă'
  43. dict_simboluri['&#xE2;'] = 'a'
  44.  
  45. dict_simboluri['  '] = ' '
  46.  
  47. dict_simboluri['&icirc;'] = 'î'
  48. dict_simboluri['&#206;'] = 'Î'
  49. dict_simboluri['&#238;'] = 'î'
  50. dict_simboluri['&#xEE;'] = 'î'
  51. dict_simboluri['&#xCE;'] = 'Î'
  52. dict_simboluri['&#206;'] = 'Î'
  53. dict_simboluri['&#xEE;'] = 'î'
  54. dict_simboluri['&#xCE;'] = 'i'
  55. dict_simboluri['&Icirc;'] = 'Î'
  56.  
  57. dict_simboluri['&nbsp;'] = ' '
  58.  
  59. dict_simboluri['&#537;'] = 'ș'
  60. dict_simboluri['&#536;'] = 'Ș'
  61. dict_simboluri['&#350;'] = 'Ş'
  62. dict_simboluri['&#x219;'] = 'ș'
  63. dict_simboluri['&#351;'] = 'ș'
  64.  
  65. dict_simboluri['&amp;'] = ''
  66.  
  67. dict_simboluri['&#539;'] = 'ț'
  68. dict_simboluri['&#355;'] = 'ț'
  69. dict_simboluri['&#354;'] = 'Ţ'
  70. dict_simboluri['&#x21B;'] = 'ț'
  71.  
  72.  
  73.  
  74. def save_to_pdf(directory_path):
  75.     for root, dirs, files in os.walk(directory_path):
  76.         for file_name in files:
  77.             if file_name.endswith(".html"):
  78.                 file_path = root + os.sep + file_name
  79.                 file_content = read_text_from_file(file_path)
  80.  
  81.                 # creare fisier PDF
  82.                 class PDF(fpdf.FPDF, html.HTMLMixin):
  83.                     pass
  84.  
  85.                 pdf = PDF()
  86.                 pdf.add_page()
  87.                 pdf.add_font("Kanit", fname="fonts/Kanit-Regular.ttf")
  88.                 pdf.add_font("Kanit", style="B", fname="fonts/Kanit-Bold.ttf")
  89.                 pdf.add_font("Kanit", style="I", fname="fonts/Kanit-Italic.ttf")
  90.                 pdf.add_font("Kanit", style="BI", fname="fonts/Kanit-BoldItalic.ttf")
  91.                 pdf.set_font("Kanit", size=24)
  92.  
  93.                 # extras denumire articol
  94.                 den_articol = re.search('<td><h1 class="den_articol" itemprop="name">(.*?)</h1></td>', file_content)
  95.                 if (den_articol == None):
  96.                     print("Nu am gasit --- denumire articol --- in fisierul --- {} ---.".format(file_path))
  97.                 else:
  98.                     den_articol = den_articol.group(1)
  99.                     for simbol in dict_simboluri.keys():
  100.                         den_articol = den_articol.replace(simbol, dict_simboluri[simbol])
  101.  
  102.                 pdf.set_text_color(204, 0, 0) # rosu
  103.                 pdf.set_font('Kanit', size=14, style="B")
  104.                 pdf.multi_cell(w=190, txt=den_articol)
  105.                 pdf.ln()
  106.                 pdf.set_font('Kanit', size=12)
  107.  
  108.                 # extras data
  109.                 date = re.search('<td class="text_dreapta">(.*?), in <a', file_content)
  110.                 if (date == None):
  111.                     print("Nu am gasit --- date --- in fisierul --- {} ---.".format(file_path))
  112.                 else:
  113.                     date = date.group(1)
  114.  
  115.                 pdf.set_text_color(0, 102, 204) # albastru
  116.                 pdf.set_font('Kanit', size=8, style="B")
  117.                 pdf.cell(txt=date)
  118.                 pdf.ln()
  119.                 pdf.ln()
  120.                 pdf.ln()
  121.                 pdf.ln()
  122.                 pdf.set_text_color(0, 0, 0) # negru (default)
  123.                 pdf.set_font('Kanit', size=12)
  124.  
  125.  
  126.                 # extras text
  127.                 articol = re.search('<!-- ARTICOL START -->([\s\S]*?)<!-- ARTICOL FINAL -->', file_content)
  128.                 if (articol == None):
  129.                     print("Nu am gasit --- ARTICOL START/FINAL --- in fisierul --- {} ---.".format(file_path))
  130.                 else:
  131.                     articol = articol.group(1)
  132.                     articol = articol.replace("&quot;", "\"")
  133.                     articol = articol.replace("&rsquo;", "'")
  134.  
  135.                     # paragraphs
  136.                     par_regex = re.compile('<p class="text_obisnuit.*?">.*?</p>')
  137.                     pars = re.findall(par_regex, articol)
  138.                     pars_text = list()
  139.  
  140.                     if (len(pars) == 0):
  141.                         print("Nu am gasit -- paragrafe text_obisnuit -- in fisierul --- {} ---.".format(file_path))
  142.                     else:
  143.                         for i in range(0, len(pars)):
  144.                             if ('<p class="text_obisnuit">' in pars[i]):
  145.  
  146.                                 # identificam clasa text_obisnuit si preluam textul
  147.                                 content = re.findall('<p class="text_obisnuit">(.*?)</p>', pars[i])
  148.                                 if (len(content) == 0):
  149.                                     print("Nu am gasit text in paragraful {}, fisierul {}.".format(pars[i], file_path))
  150.                                 else:
  151.  
  152.                                     # punem textul intr-o celula multi_cell
  153.                                     for simbol in dict_simboluri.keys():
  154.                                         content[0] = content[0].replace(simbol, dict_simboluri[simbol])
  155.                                     pars_text.append(content[0])
  156.                                     # pdf.multi_cell(w=190, txt = content[0])
  157.                                     pdf.write_html(text=f'<p class="text_obisnuit">{content[0]}</p>')
  158.  
  159.                                     # adaugam linie goala intre paragrafe
  160.                                     pdf.ln();
  161.                             elif ('<p class="text_obisnuit2">' in pars[i]):
  162.  
  163.                                 # identificam clasa text_obisnuit2 si preluam textul
  164.                                 content = re.findall('<p class="text_obisnuit2">(.*?)</p>', pars[i])
  165.                                 if (len(content) == 0):
  166.                                     print("Nu am gasit text in paragraful {}, fisierul {}.".format(pars[i], file_path))
  167.                                 else:
  168.  
  169.                                     # setam fontul cu bold
  170.                                     pdf.set_font('Kanit', size=12, style="B")
  171.  
  172.  
  173.                                     # punem textul intr-o celula multi_cell
  174.                                     for simbol in dict_simboluri.keys():
  175.                                         content[0] = content[0].replace(simbol, dict_simboluri[simbol])
  176.                                     pars_text.append(content[0])
  177.                                     # pdf.multi_cell(w=190, txt = content[0])
  178.                                     pdf.write_html(text=f'<p class="text_obisnuit2"><b>{content[0]}</b></p>')
  179.  
  180.                                     # adaugam linie goala intre paragrafe
  181.                                     pdf.ln();
  182.  
  183.                                     # resetam fontul
  184.                                     pdf.set_font('Kanit', size=12)
  185.                             else:
  186.                                 continue
  187.  
  188.                     # adaugare link
  189.                     pdf.ln()
  190.                     pdf.ln()
  191.                     pdf.set_font('Kanit', size=12, style="B")
  192.                     pdf.cell(txt="Source:")
  193.                     pdf.set_font('Kanit', size=12)
  194.                     pdf.set_text_color(0, 102, 204) # albastru
  195.                     pdf.cell(w=40, txt="https://neculaifantanaru.com/{}".format(file_name), link="https://neculaifantanaru.com/{}".format(file_name))
  196.  
  197.                     den_fisier = file_path.split('.')[0] + '.pdf'
  198.                     pdf.output(den_fisier)
  199.                     # break;
  200.  
  201. # functie care face merge la mai multe fisiere pdf
  202. def merge_pdf_files(directory_path):
  203.     merger = PdfFileMerger()
  204.     for root, dirs, files in os.walk(directory_path):
  205.         for file_name in files:
  206.             if file_name.endswith(".pdf"):
  207.                 print("PDF: ", file_name)
  208.                 file_path = root + os.sep + file_name
  209.                 merger.append(file_path)
  210.         merger.write(root + os.sep + "articles.pdf")
  211.         merger.close()
  212.         break;
  213.  
  214. save_to_pdf("c:\\Folder5\\")
  215. merge_pdf_files("c:\\Folder5\\")
Advertisement
Add Comment
Please, Sign In to add comment