pdf.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # -*- coding: utf-8 -*-
  2. '''
  3. PDF Generator
  4. -------
  5. The pdf plugin generates PDF files from RST sources.
  6. '''
  7. from __future__ import unicode_literals, print_function
  8. from pelican import signals
  9. from pelican.generators import Generator
  10. from rst2pdf.createpdf import RstToPdf
  11. import os
  12. import logging
  13. logger = logging.getLogger(__name__)
  14. class PdfGenerator(Generator):
  15. """Generate PDFs on the output dir, for all articles and pages coming from
  16. rst"""
  17. def __init__(self, *args, **kwargs):
  18. super(PdfGenerator, self).__init__(*args, **kwargs)
  19. if 'PDF_STYLE_PATH' in self.settings:
  20. pdf_style_path = [self.settings['PDF_STYLE_PATH']]
  21. else:
  22. pdf_style_path = []
  23. if 'PDF_STYLE' in self.settings:
  24. pdf_style = [self.settings['PDF_STYLE']]
  25. else:
  26. pdf_style = []
  27. self.pdfcreator = RstToPdf(breakside=0,
  28. stylesheets=pdf_style,
  29. style_path=pdf_style_path)
  30. def _create_pdf(self, obj, output_path):
  31. if obj.source_path.endswith('.rst'):
  32. filename = obj.slug + ".pdf"
  33. output_pdf = os.path.join(output_path, filename)
  34. # print('Generating pdf for', obj.source_path, 'in', output_pdf)
  35. with open(obj.source_path) as f:
  36. self.pdfcreator.createPdf(text=f.read(), output=output_pdf)
  37. logger.info(' [ok] writing %s' % output_pdf)
  38. def generate_context(self):
  39. pass
  40. def generate_output(self, writer=None):
  41. # we don't use the writer passed as argument here
  42. # since we write our own files
  43. logger.info(' Generating PDF files...')
  44. pdf_path = os.path.join(self.output_path, 'pdf')
  45. if not os.path.exists(pdf_path):
  46. try:
  47. os.mkdir(pdf_path)
  48. except OSError:
  49. logger.error("Couldn't create the pdf output folder in " +
  50. pdf_path)
  51. for article in self.context['articles']:
  52. self._create_pdf(article, pdf_path)
  53. for page in self.context['pages']:
  54. self._create_pdf(page, pdf_path)
  55. def get_generators(generators):
  56. return PdfGenerator
  57. def register():
  58. signals.get_generators.connect(get_generators)