def testHtmlSmartBreaks(self): """Test rendering to multiframes with smart breaks.""" layout_html = QgsLayoutItemHtml(self.layout) html_frame = QgsLayoutFrame(self.layout, layout_html) html_frame.attemptSetSceneRect(QRectF(10, 10, 100, 52)) layout_html.addFrame(html_frame) layout_html.setResizeMode(QgsLayoutMultiFrame.RepeatUntilFinished) layout_html.setUseSmartBreaks(True) layout_html.setUrl(self.htmlUrl()) layout_html.frame(0).setFrameEnabled(True) print("Checking page 1") myPage = 0 checker1 = QgsLayoutChecker('composerhtml_smartbreaks1', self.layout) checker1.setControlPathPrefix("composer_html") myTestResult, myMessage = checker1.testLayout(myPage, 200) assert myTestResult, myMessage print("Checking page 2") myPage = 1 checker2 = QgsLayoutChecker('composerhtml_smartbreaks2', self.layout) checker2.setControlPathPrefix("composer_html") myTestResult, myMessage = checker2.testLayout(myPage, 200) assert myTestResult, myMessage self.layout.removeMultiFrame(layout_html) layout_html = None assert myTestResult, myMessage
def testTableMultiFrame(self): """Test we can render to multiframes.""" layout_html = QgsLayoutItemHtml(self.layout) html_frame = QgsLayoutFrame(self.layout, layout_html) html_frame.attemptSetSceneRect(QRectF(10, 10, 100, 50)) layout_html.addFrame(html_frame) layout_html.setResizeMode( QgsLayoutMultiFrame.RepeatUntilFinished) layout_html.setUseSmartBreaks(False) layout_html.setUrl(self.htmlUrl()) layout_html.frame(0).setFrameEnabled(True) print("Checking page 1") myPage = 0 checker1 = QgsLayoutChecker('composerhtml_multiframe1', self.layout) checker1.setControlPathPrefix("composer_html") myTestResult, myMessage = checker1.testLayout(myPage) assert myTestResult, myMessage print("Checking page 2") myPage = 1 checker2 = QgsLayoutChecker('composerhtml_multiframe2', self.layout) checker2.setControlPathPrefix("composer_html") myTestResult, myMessage = checker2.testLayout(myPage) assert myTestResult, myMessage self.layout.removeMultiFrame(layout_html) layout_html = None assert myTestResult, myMessage
def testTable(self): """Test we can render a html table in a single frame.""" layout_html = QgsLayoutItemHtml(self.layout) html_frame = QgsLayoutFrame(self.layout, layout_html) html_frame.attemptSetSceneRect(QRectF(0, 0, 100, 200)) html_frame.setFrameEnabled(True) layout_html.addFrame(html_frame) layout_html.setUrl(self.htmlUrl()) checker = QgsLayoutChecker('composerhtml_table', self.layout) checker.setControlPathPrefix("composer_html") myTestResult, myMessage = checker.testLayout() qDebug(myMessage) self.layout.removeMultiFrame(layout_html) assert myTestResult, myMessage
def qgis_composer_html_renderer(impact_report, component): """HTML to PDF renderer using QGIS Composer. Render using qgis composer for a given impact_report data and component context for html input. :param impact_report: ImpactReport contains data about the report that is going to be generated. :type impact_report: safe.report.impact_report.ImpactReport :param component: Contains the component metadata and context for rendering the output. :type component: safe.report.report_metadata.QgisComposerComponentsMetadata :return: Whatever type of output the component should be. .. versionadded:: 4.0 """ context = component.context # QGIS3: not used # qgis_composition_context = impact_report.qgis_composition_context # create new layout with A4 portrait page layout = QgsPrintLayout(QgsProject.instance()) page = QgsLayoutItemPage(layout) page.setPageSize('A4', orientation=QgsLayoutItemPage.Portrait) layout.pageCollection().addPage(page) if not context.html_frame_elements: # if no html frame elements at all, do not generate empty report. component.output = '' return component.output # Add HTML Frame for html_el in context.html_frame_elements: mode = html_el.get('mode') html_element = QgsLayoutItemHtml(layout) margin_left = html_el.get('margin_left', 10) margin_top = html_el.get('margin_top', 10) width = html_el.get('width', component.page_width - 2 * margin_left) height = html_el.get('height', component.page_height - 2 * margin_top) html_frame = QgsLayoutFrame(layout, html_element) html_frame.attemptSetSceneRect( QRectF(margin_left, margin_top, width, height)) html_element.addFrame(html_frame) if html_element: if mode == 'text': text = html_el.get('text') text = text if text else '' html_element.setContentMode(QgsLayoutItemHtml.ManualHtml) html_element.setResizeMode( QgsLayoutItemHtml.RepeatUntilFinished) html_element.setHtml(text) html_element.loadHtml() elif mode == 'url': url = html_el.get('url') html_element.setContentMode(QgsLayoutItemHtml.Url) html_element.setResizeMode( QgsLayoutItemHtml.RepeatUntilFinished) qurl = QUrl.fromLocalFile(url) html_element.setUrl(qurl) # Attempt on removing blank page. Notes: We assume that the blank page # will always appears in the last x page(s), not in the middle. pc = layout.pageCollection() index = pc.pageCount() while pc.pageIsEmpty(index): pc.deletePage(index) index -= 1 # process to output # in case output folder not specified if impact_report.output_folder is None: impact_report.output_folder = mkdtemp(dir=temp_dir()) component_output_path = impact_report.component_absolute_output_path( component.key) component_output = None output_format = component.output_format doc_format = QgisComposerComponentsMetadata.OutputFormat.DOC_OUTPUT template_format = QgisComposerComponentsMetadata.OutputFormat.QPT if isinstance(output_format, list): component_output = [] for i in range(len(output_format)): each_format = output_format[i] each_path = component_output_path[i] if each_format in doc_format: result_path = create_qgis_pdf_output( impact_report, each_path, layout, each_format, component) component_output.append(result_path) elif each_format == template_format: result_path = create_qgis_template_output( each_path, layout) component_output.append(result_path) elif isinstance(output_format, dict): component_output = {} for key, each_format in list(output_format.items()): each_path = component_output_path[key] if each_format in doc_format: result_path = create_qgis_pdf_output( impact_report, each_path, layout, each_format, component) component_output[key] = result_path elif each_format == template_format: result_path = create_qgis_template_output( each_path, layout) component_output[key] = result_path elif (output_format in QgisComposerComponentsMetadata.OutputFormat.SUPPORTED_OUTPUT): component_output = None if output_format in doc_format: result_path = create_qgis_pdf_output( impact_report, component_output_path, layout, output_format, component) component_output = result_path elif output_format == template_format: result_path = create_qgis_template_output( component_output_path, layout) component_output = result_path component.output = component_output return component.output