From 0cf8daf33f20682d46816150747c1e5b87db75b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Fredrik=20Ki=C3=A6r?= <31612826+anders-kiaer@users.noreply.github.com> Date: Thu, 16 May 2019 11:11:33 +0200 Subject: [PATCH] Add PDF container (#24) --- examples/basic_example.yaml | 5 ++++ examples/example.pdf | Bin 0 -> 10746 bytes webviz_config/containers/__init__.py | 4 ++- webviz_config/containers/_embed_pdf.py | 35 +++++++++++++++++++++++++ webviz_config/themes/_theme_class.py | 4 ++- 5 files changed, 46 insertions(+), 2 deletions(-) create mode 100755 examples/example.pdf create mode 100644 webviz_config/containers/_embed_pdf.py diff --git a/examples/basic_example.yaml b/examples/basic_example.yaml index 896b110b..dd8ad2db 100644 --- a/examples/basic_example.yaml +++ b/examples/basic_example.yaml @@ -25,6 +25,11 @@ pages: csv_file: ./example_data.csv filtering: True + - title: PDF example + content: + - container: EmbedPdf + pdf_file: ./example.pdf + - title: Syntax highlighting example content: - container: SyntaxHighlighter diff --git a/examples/example.pdf b/examples/example.pdf new file mode 100755 index 0000000000000000000000000000000000000000..84a9e4429cabe25665b7c4c96c8896f6f448e881 GIT binary patch literal 10746 zcmchdbyQqQx3_V(-~?+VxHhiA-GVzoIzaFSg1fr}3GNWwLV(~B+#$FGf)m{RYm%9H zXWqH%uKU+_4yzCK>)N|&OLZ?6&kGd^DQ0#SE|eE_`xUn+8~`?eoyl7iK|uhk0?5|f z$pXL$kyKFt0066$rL_|X40&1`JAouXrgml^6k%Z$M<+1I*apQlJxFaZTwN4xX-3Oz zj>VQ{)ZH3U0!u%V^9vS%doLO37lJ(0j!GV9axOGhlDoVs$lcfSF|v zHt{%3`sx zEA>e5JRw5~PlGRqX|aHCKpK_DautDSJj`yKSGGR;d)f~nK}&H8xA#k`jH!L0v?LU7 ziLc)YcJylB&c9kVnMel`; zeM^`UJMrg5F+-^l5*G=yC^PL5fJRjUkcq*jL*HNTg0u)}Ge?foqQNyx8zk{s%#@6t zn->$mG-qa?$g6kE#LlA(Pq1kIs0Y+i&#tJo!Axn8=qZQh6+~9w+ugHGQahcr^P_LC zKsGBY)~LCGF;Lmja{T>|7fb0hshv2{MNU^oyH_8y^WZ7D+zZ0x)>rw0=%Q*a#g

dGT%M&Vu{;n}pj0_T;h}60fE0<$|`ujOi;B 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 literal 0 HcmV?d00001 diff --git a/webviz_config/containers/__init__.py b/webviz_config/containers/__init__.py index c3d8af72..8c514ca7 100644 --- a/webviz_config/containers/__init__.py +++ b/webviz_config/containers/__init__.py @@ -13,6 +13,7 @@ from ._data_table import DataTable from ._syntax_highlighter import SyntaxHighlighter from ._table_plotter import TablePlotter +from ._embed_pdf import EmbedPdf __all__ = ['ExampleContainer', 'ExampleAssets', @@ -20,7 +21,8 @@ 'BannerImage', 'DataTable', 'SyntaxHighlighter', - 'TablePlotter'] + 'TablePlotter', + 'EmbedPdf'] for entry_point in pkg_resources.iter_entry_points('webviz_config_containers'): globals()[entry_point.name] = entry_point.load() diff --git a/webviz_config/containers/_embed_pdf.py b/webviz_config/containers/_embed_pdf.py new file mode 100644 index 00000000..537c7e75 --- /dev/null +++ b/webviz_config/containers/_embed_pdf.py @@ -0,0 +1,35 @@ +from pathlib import Path +import dash_html_components as html +from ..webviz_assets import webviz_assets + + +class EmbedPdf: + '''### Embed PDF file + +This container embeds a given PDF file into the page. + +* `pdf_file`: Path to the PDF file to include. Either absolute path or + relative to the configuration file. +* `height`: Height of the PDF object (in percent of viewport height). +* `width`: Width of the PDF object (in percent of available space). + +_Note_: Webviz does not scan your PDF for malicious code. +Make sure it comes from a trusted source. +''' + + def __init__(self, pdf_file: Path, height: int = 80, width: int = 100): + self.pdf_url = webviz_assets.add(pdf_file) + self.height = height + self.width = width + + @property + def layout(self): + + style = { + 'height': f'{self.height}vh', + 'width': f'{self.width}%' + } + + return html.Embed(src=self.pdf_url, + style=style, + type='application/pdf') diff --git a/webviz_config/themes/_theme_class.py b/webviz_config/themes/_theme_class.py index a5f2dbdf..28d937f2 100644 --- a/webviz_config/themes/_theme_class.py +++ b/webviz_config/themes/_theme_class.py @@ -10,7 +10,9 @@ 'base-uri': '\'self\'', 'form-action': '\'self\'', 'frame-ancestors': '\'none\'', - 'object-src': '\'none\'', + 'child-src': '\'none\'', + 'object-src': '\'self\'', + 'plugin-types': 'application/pdf' } '''