From 383e138a4462648259a6ad3867646bd45e1d98d1 Mon Sep 17 00:00:00 2001 From: Matthew Wardrop Date: Thu, 6 Jul 2017 23:23:38 -0700 Subject: [PATCH 1/3] Add initial code to handle PDF export. --- knowledge_repo/app/routes/posts.py | 11 ++++--- .../app/templates/markdown-base.html | 3 +- knowledge_repo/converters/pdf.py | 30 +++++++++++++++++++ 3 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 knowledge_repo/converters/pdf.py diff --git a/knowledge_repo/app/routes/posts.py b/knowledge_repo/app/routes/posts.py index a4025108f..1b793de3a 100755 --- a/knowledge_repo/app/routes/posts.py +++ b/knowledge_repo/app/routes/posts.py @@ -188,13 +188,12 @@ def download(): post = current_repo.post(request.args.get('post')) # Note: `post` is expected to be a post path resource_type = request.args.get('type', 'source') - if resource_type in ('kp', 'zip'): - filename = os.path.basename(post.path) - if resource_type == 'zip': - filename = filename[:-3] + '.zip' + if resource_type in 'post': + format = request.args.get('format', 'zip') + filename = os.path.basename(post.path)[:-2] + format return Response( - post.to_string(format=resource_type), - mimetype="application/zip", + post.to_string(format=format), + mimetype="application/octet-stream", headers={u"Content-disposition": "attachment; filename={}".format(filename)}) elif resource_type == 'source': path = request.args.get('path', None) diff --git a/knowledge_repo/app/templates/markdown-base.html b/knowledge_repo/app/templates/markdown-base.html index f4eda88ab..afdf9e7b3 100644 --- a/knowledge_repo/app/templates/markdown-base.html +++ b/knowledge_repo/app/templates/markdown-base.html @@ -23,7 +23,8 @@ -ZIP Archive +PDF +ZIP Archive {% if downloads %} Source Files {% for file in downloads %} diff --git a/knowledge_repo/converters/pdf.py b/knowledge_repo/converters/pdf.py new file mode 100644 index 000000000..d969a09e3 --- /dev/null +++ b/knowledge_repo/converters/pdf.py @@ -0,0 +1,30 @@ +from ..converter import KnowledgePostConverter + +from .html import HTMLConverter + + +class PDFConverter(KnowledgePostConverter): + ''' + Use this as a template for new KnowledgePostConverters. + ''' + _registry_keys = ['pdf'] + + @property + def dependencies(self): + # Dependencies required for this converter on top of core knowledge-repo dependencies + return ['weasyprint'] + + def from_file(self, filename, **opts): + raise NotImplementedError + + def from_string(self, filename, **opts): + raise NotImplementedError + + def to_file(self, filename, **opts): + with open(filename, 'w') as f: + f.write(self.to_string()) + + def to_string(self, **opts): + from weasyprint import HTML + html = HTMLConverter(self.kp).to_string() + return HTML(string=html).write_pdf() From e0233b0bb0a5a92c641d06648ec9921318b9a028 Mon Sep 17 00:00:00 2001 From: Matthew Wardrop Date: Sun, 23 Jul 2017 14:24:04 -0700 Subject: [PATCH 2/3] Fix encoding error in Python 3. --- knowledge_repo/converters/pdf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/knowledge_repo/converters/pdf.py b/knowledge_repo/converters/pdf.py index d969a09e3..def7a51ab 100644 --- a/knowledge_repo/converters/pdf.py +++ b/knowledge_repo/converters/pdf.py @@ -21,7 +21,7 @@ def from_string(self, filename, **opts): raise NotImplementedError def to_file(self, filename, **opts): - with open(filename, 'w') as f: + with open(filename, 'wb') as f: f.write(self.to_string()) def to_string(self, **opts): From 0cee47c944e9094bbc6477af6f0da3cdcabe42f3 Mon Sep 17 00:00:00 2001 From: Bill Ulammandakh Date: Sun, 24 May 2020 20:26:07 -0700 Subject: [PATCH 3/3] Update posts.py updating if statement --- knowledge_repo/app/routes/posts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/knowledge_repo/app/routes/posts.py b/knowledge_repo/app/routes/posts.py index d40493ca6..3827c51a1 100755 --- a/knowledge_repo/app/routes/posts.py +++ b/knowledge_repo/app/routes/posts.py @@ -189,7 +189,7 @@ def download(): post = current_repo.post(request.args.get('post')) # Note: `post` is expected to be a post path resource_type = request.args.get('type', 'source') - if resource_type in 'post': + if resource_type == 'post': format = request.args.get('format', 'zip') filename = os.path.basename(post.path)[:-2] + format return Response(