oloturia2special.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #!/usr/bin/env python3
  2. import json
  3. import os.path
  4. import html2text
  5. import locale
  6. import PyPDF2
  7. import html
  8. locale.setlocale(locale.LC_TIME, 'it_IT.UTF-8')
  9. def copertina(text):
  10. from PyPDF2 import PdfFileWriter, PdfFileReader
  11. import io
  12. from reportlab.pdfgen import canvas
  13. from reportlab.lib.pagesizes import A5
  14. from reportlab.pdfbase import pdfmetrics
  15. from reportlab.pdfbase.ttfonts import TTFont
  16. from reportlab.pdfbase.pdfmetrics import stringWidth
  17. FONT = 'Roboto'
  18. SIZE = 36
  19. packet = io.BytesIO()
  20. # create a new PDF with Reportlab
  21. pdfmetrics.registerFont(TTFont("Roboto", "template/roboto-regular-webfont.ttf"))
  22. can = canvas.Canvas(packet, pagesize=A5)
  23. can.setFont(FONT, SIZE)
  24. PAGE_WIDTH = A5[0]
  25. text_width = stringWidth(text,FONT, SIZE)
  26. can.drawString((PAGE_WIDTH - text_width) / 2, 100, text)
  27. can.save()
  28. #move to the beginning of the StringIO buffer
  29. packet.seek(0)
  30. new_pdf = PdfFileReader(packet)
  31. # read your existing PDF
  32. existing_pdf = PdfFileReader(open("copertina.pdf", "rb"))
  33. output = PdfFileWriter()
  34. # add the "watermark" (which is the new pdf) on the existing page
  35. page = existing_pdf.getPage(0)
  36. page.mergePage(new_pdf.getPage(0))
  37. output.addPage(page)
  38. return(page)
  39. def indice(text):
  40. # PDF GENERATION LIBRARIES
  41. # import the report lab PDF generation tools
  42. from reportlab.lib.pagesizes import letter
  43. from reportlab.lib.styles import ParagraphStyle
  44. from reportlab.lib.units import inch
  45. from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
  46. from reportlab.pdfbase import pdfmetrics
  47. from reportlab.pdfbase.ttfonts import TTFont
  48. from reportlab.lib.pagesizes import A5
  49. import io
  50. from PyPDF2 import PdfFileWriter, PdfFileReader
  51. parts = []
  52. pdfmetrics.registerFont(TTFont("Roboto", "template/roboto-regular-webfont.ttf"))
  53. style = ParagraphStyle(
  54. name='Normal',
  55. fontName='Roboto',
  56. fontSize=12,
  57. leading = 14,
  58. leftIndent=32,
  59. firstLineIndent=-32,
  60. spaceBefore=5
  61. )
  62. for ro in text.splitlines():
  63. ro = ro.replace(' ',' ')
  64. ro = ro.replace('\t','    ')
  65. parts.append(Paragraph(ro, style = style))
  66. packet = io.BytesIO()
  67. doc = SimpleDocTemplate(packet,
  68. pagesize=A5,
  69. rightMargin=20,
  70. leftMargin=20,
  71. topMargin=40,
  72. bottomMargin=30)
  73. doc.build(parts)
  74. pdfReader = PdfFileReader(packet)
  75. pdfWriter = PdfFileWriter()
  76. for page in pdfReader.pages:
  77. pdfWriter.addPage(page)
  78. pdfWriter.addBlankPage()
  79. return([pdfWriter.getPage(0),pdfWriter.getPage(1)])
  80. def main():
  81. specialbooks = [
  82. ["Migliori per anno", "454 558 592 514 446 477 163 297 681 178 201 391 323 140 199 207 200 128 249 552 289 537 436 520 102 231 069 139 059 293 160 172 375 341 244 002 094 318 157 004 515 665 642 700 325 358 363 493 668"],
  83. ["Peggiori per anno", "171 014 034 205 277 596 043 584 476 671 132 697 174 485 589 301 137 237 159 185 027 437 284 496 466 644 380 299 676 652 166 229 488 336 210 421 632 609 576 475 360 527"],
  84. ]
  85. with open('oloturiadump.json') as json_file:
  86. all_vgos = json.load(json_file)
  87. os.makedirs('media', exist_ok=True)
  88. vgo_dict={}
  89. for vgo in all_vgos:
  90. vgo_num = html2text.html2text(vgo['content']).split(' ')[0]
  91. # print(vgo['content'].split("<br />")[-1])
  92. # print(vgo['content'].split("<p>")[-1])
  93. # vgo_name = os.linesep.join([s for s in html2text.html2text(vgo['content']).splitlines() if s]).splitlines()[-1]
  94. # if len(vgo_name) < 10:
  95. # vgo_name = [s for s in html2text.html2text(vgo['content']).split("\n\n") if s][-1].replace("\n"," ")
  96. vgo_name = vgo['content'].split("<p>")[-1].replace("</p>","")
  97. vgo_name = vgo_name.split("<br />")[-1]
  98. vgo_name = vgo_name.split("</a>")[-1]
  99. vgo_name = html.unescape(vgo_name).strip()
  100. # print(vgo_num + " " + vgo_name)
  101. vgo_dict[vgo_num] = vgo_name
  102. print("Genero i libretti")
  103. os.makedirs('books', exist_ok=True)
  104. for book in specialbooks:
  105. book_title = book[0]
  106. vgo_list = book[1]
  107. book_name = book_title.strip().replace(" ","_").lower()
  108. book_name = os.path.join('books', 'vgo_' + book_name + '.pdf')
  109. # if not os.path.isfile(book_name):
  110. pdfWriter = PyPDF2.PdfFileWriter()
  111. print(book_name)
  112. # aggiungere copertina
  113. pdfWriter.addPage(copertina(book_title))
  114. pdfWriter.addBlankPage()
  115. indtext = ""
  116. for vgo_num in vgo_list.split():
  117. pdf_name = os.path.join('pdf', vgo_num + '.pdf')
  118. try:
  119. #print(vgo_num + " - " + vgo_dict[vgo_num])
  120. indtext = indtext + vgo_num + "\t" + vgo_dict[vgo_num] + "\n"
  121. pdfFileObj = open(pdf_name, 'rb')
  122. pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
  123. pageObj = pdfReader.getPage(0)
  124. pdfWriter.addPage(pageObj)
  125. except:
  126. pass
  127. for i in range(0, ((8 - (len(vgo_list.split()) + 5)) % 8)):
  128. pdfWriter.addBlankPage()
  129. # aggiungere indice
  130. for indpag in indice(indtext):
  131. pdfWriter.addPage(indpag)
  132. #Aggiungere pagina finale
  133. #pdfWriter.addBlankPage()
  134. pdfFileObj = open("quarta.pdf", 'rb')
  135. pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
  136. pageObj = pdfReader.getPage(0)
  137. pdfWriter.addPage(pageObj)
  138. with open(book_name, 'wb') as pdfOutput:
  139. pdfWriter.write(pdfOutput)
  140. if __name__ == "__main__":
  141. main()