summaryrefslogtreecommitdiff
path: root/ishtar_common/utils.py
diff options
context:
space:
mode:
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
commitc3102b11e4d20a008e6be81ddd5d1b8d4309be22 (patch)
tree516d4c8fd2a97bef665b37b7d71149988d2947d7 /ishtar_common/utils.py
parent1278dde057a343d6c09e829e43b66e8a95840910 (diff)
downloadIshtar-c3102b11e4d20a008e6be81ddd5d1b8d4309be22.tar.bz2
Ishtar-c3102b11e4d20a008e6be81ddd5d1b8d4309be22.zip
Generate preview image for PDF
Diffstat (limited to 'ishtar_common/utils.py')
-rw-r--r--ishtar_common/utils.py45
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)