diff --git a/pymisp/tools/reportlab_generator.py b/pymisp/tools/reportlab_generator.py new file mode 100644 index 0000000..1e78352 --- /dev/null +++ b/pymisp/tools/reportlab_generator.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Standard imports +from io import BytesIO +import base64 +import logging + +logger = logging.getLogger('pymisp') + +# Potentially not installed imports +try: + from reportlab.platypus import SimpleDocTemplate + from reportlab.platypus import Paragraph + from reportlab.platypus import PageBreak + + from reportlab.lib.styles import getSampleStyleSheet + + from reportlab.lib.units import mm, inch + + from reportlab.pdfgen import canvas + + HAS_REPORTLAB = True +except ImportError: + HAS_REPORTLAB = False + print("ReportLab cannot be imported. Please verify that ReportLab is installed on the system.") + +''' +"INTERNAL" METHODS. Not meant to be used outside of this class. +''' + +def collect_parts(misp_event): + # List of elements/content we want to add + flowables = [] + # Get the list of available styles + sample_style_sheet = getSampleStyleSheet() + + # Create stuff + paragraph_1 = Paragraph("A title", sample_style_sheet['Heading1']) + paragraph_2 = Paragraph("Some normal body text",sample_style_sheet['BodyText']) + paragraph_3 = Paragraph("Dingbat paragraph", sample_style_sheet['BodyText']) # Apply custom style + Paragraph("A bold word.
An italic word.", sample_style_sheet['BodyText']) # HTML markup is working too + + # Add all parts to final PDF + flowables.append(paragraph_1) + flowables.append(paragraph_2) + flowables.append(PageBreak()) + flowables.append(paragraph_2) + flowables.append(paragraph_3) + + return flowables + +def add_page_number(canvas, doc): + canvas.saveState() + canvas.setFont('Times-Roman', 10) + page_number_text = "%d" % (doc.page) + canvas.drawCentredString( + 0.75 * inch, + 0.75 * inch, + page_number_text + ) + canvas.restoreState() + +def export_flowables_to_pdf(document, pdf_buffer, flowables): + # my_doc.build(flowables) # Basic building of the final document + + document.build( + flowables, + onFirstPage=add_page_number, # Pagination for first page + onLaterPages=add_page_number, # Pagination for all other page + ) + + +''' +"EXTERNAL" exposed METHODS. Meant to be used outside of this class. +''' + +PAGESIZE = (140 * mm, 216 * mm) # width, height +BASE_MARGIN = 5 * mm + +def convert_event_in_pdf_buffer(misp_event, debug_file=False): + + # Create the document + pdf_buffer = BytesIO() + # curr_document = SimpleDocTemplate('myfile.pdf') + curr_document = SimpleDocTemplate(pdf_buffer, + pagesize=PAGESIZE, + topMargin=BASE_MARGIN, + leftMargin=BASE_MARGIN, + rightMargin=BASE_MARGIN, + bottomMargin=BASE_MARGIN) + + # Apply standard template + # TODO + + # Set the layout + # TODO + + # Collect already accessible event's parts to be shown + flowables = collect_parts(misp_event) + + # Export + export_flowables_to_pdf(curr_document, pdf_buffer, flowables) + pdf_value = pdf_buffer.getvalue() + + #TODO : Not sure what to give back ? Buffer ? Buffer.value() ? Base64(buffer.value()) ? ... + #pdf_buffer.close() + #return pdf_value + + return pdf_buffer + + +def get_values_from_buffer(pdf_buffer): + return pdf_buffer.value() + +def get_base64_from_buffer(pdf_buffer): + return base64.b64encode(pdf_buffer.value()) + + +if __name__ == "__main__": + pdf_buffer = convert_event_in_pdf_buffer(None) + + pdf_buffer.seek(0) + + with open('test.pdf', 'wb') as f: + f.write(pdf_buffer.read()) + + # get_values_from_buffer(pdf_buffer) + # get_base64_from_buffer(pdf_buffer) + + + + + + + + + + + + + +''' In the future ? +try: + from pymispgalaxies import Clusters + has_pymispgalaxies = True +except ImportError: + has_pymispgalaxies = False + +try: + from pytaxonomies import Taxonomies + has_pymispgalaxies = True +except ImportError: + has_pymispgalaxies = False +''' +''' +class ReportLabObject(): + + def __init__(self, parameters, strict=True, standalone=True, **kwargs): + super(ReportLabObject, self).__init__('reportlab', strict=strict, standalone=standalone, **kwargs) + self._parameters = parameters + self.generate_attributes() + + def generate_attributes(self): + first = self._sanitize_timestamp(self._parameters.pop('first-seen', None)) + self._parameters['first-seen'] = first + last = self._sanitize_timestamp(self._parameters.pop('last-seen', None)) + self._parameters['last-seen'] = last + return super(ReportLabObject, self).generate_attributes() +''' diff --git a/tests/test_reportlab.py b/tests/test_reportlab.py new file mode 100644 index 0000000..e69de29