diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-05-16 18:28:37 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-07-08 09:58:50 +0200 |
commit | 462d84cf5a8787b55fb31d6012b5b496e52190df (patch) | |
tree | 516d4c8fd2a97bef665b37b7d71149988d2947d7 /ishtar_common/utils.py | |
parent | 03df2dd4e3f21f8e134d0d6cd70b05401872a2ef (diff) | |
download | Ishtar-462d84cf5a8787b55fb31d6012b5b496e52190df.tar.bz2 Ishtar-462d84cf5a8787b55fb31d6012b5b496e52190df.zip |
Generate preview image for PDF
Diffstat (limited to 'ishtar_common/utils.py')
-rw-r--r-- | ishtar_common/utils.py | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py index 173338b4f..bfb5d0e32 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -2117,3 +2117,48 @@ class IshtarFileSystemStorage(FileSystemStorage): if not os.path.exists(os.readlink(path_name)): os.remove(path_name) return os.path.exists(path_name) + + +def generate_pdf_preview(item, save=True, tempdir=None, page_number=None): + if not settings.PDFTOPPM_BINARY: + return + preview_tmp_name = None + if not item.image and item.source and item.source_page_range: + tempdir = tempfile.mkdtemp("-ishtarppmtopdf") + try: + page_number = int( + item.source_page_range.split("-")[0].split(";")[0].split(",")[0]) + except ValueError: + page_number = 1 + returned = generate_pdf_preview(item.source, save=False, tempdir=tempdir, + page_number=page_number) + if not returned: + return + tempdir, preview_tmp_name = returned + elif (not page_number and item.image) \ + or not item.associated_file \ + or not item.associated_file.path \ + or not item.associated_file.path.lower().endswith(".pdf"): + return + if not page_number: + page_number = 1 + + if not tempdir: + tempdir = tempfile.mkdtemp("-ishtarppmtopdf") + if not preview_tmp_name: + preview_tmp_name = tempdir + os.path.sep + "preview" + args = (settings.PDFTOPPM_BINARY, "-singlefile", "-jpeg", "-f", str(page_number), + item.associated_file.path, preview_tmp_name) + + try: + popen = subprocess.Popen(args) + popen.wait(timeout=5) + except subprocess.SubprocessError: + return + if not save: + return tempdir, preview_tmp_name + + with open(preview_tmp_name + ".jpg", "rb") as preview: + django_file = File(preview) + getattr(item, "image").save("page.jpg", django_file, save=True) + shutil.rmtree(tempdir) |