diff src_classic/helper-portfolio.i @ 1:1d09e1dec1d9 upstream

ADD: PyMuPDF v1.26.4: the original sdist. It does not yet contain MuPDF. This normally will be downloaded when building PyMuPDF.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:37:51 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src_classic/helper-portfolio.i	Mon Sep 15 11:37:51 2025 +0200
@@ -0,0 +1,79 @@
+%{
+/*
+# ------------------------------------------------------------------------
+# Copyright 2020-2022, Harald Lieder, mailto:harald.lieder@outlook.com
+# License: GNU AFFERO GPL 3.0, https://www.gnu.org/licenses/agpl-3.0.html
+#
+# Part of "PyMuPDF", a Python binding for "MuPDF" (http://mupdf.com), a
+# lightweight PDF, XPS, and E-book viewer, renderer and toolkit which is
+# maintained and developed by Artifex Software, Inc. https://artifex.com.
+# ------------------------------------------------------------------------
+*/
+//-----------------------------------------------------------------------------
+// perform some cleaning if we have /EmbeddedFiles:
+// (1) remove any /Limits if /Names exists
+// (2) remove any empty /Collection
+// (3) set /PageMode/UseAttachments
+//-----------------------------------------------------------------------------
+void JM_embedded_clean(fz_context *ctx, pdf_document *pdf)
+{
+    pdf_obj *root = pdf_dict_get(ctx, pdf_trailer(ctx, pdf), PDF_NAME(Root));
+
+    // remove any empty /Collection entry
+    pdf_obj *coll = pdf_dict_get(ctx, root, PDF_NAME(Collection));
+    if (coll && pdf_dict_len(ctx, coll) == 0)
+        pdf_dict_del(ctx, root, PDF_NAME(Collection));
+
+    pdf_obj *efiles = pdf_dict_getl(ctx, root,
+                                    PDF_NAME(Names),
+                                    PDF_NAME(EmbeddedFiles),
+                                    PDF_NAME(Names),
+                                    NULL);
+    if (efiles) {
+        pdf_dict_put_name(ctx, root, PDF_NAME(PageMode), "UseAttachments");
+    }
+    return;
+}
+
+//-----------------------------------------------------------------------------
+// embed a new file in a PDF (not only /EmbeddedFiles entries)
+//-----------------------------------------------------------------------------
+pdf_obj *JM_embed_file(fz_context *ctx,
+                       pdf_document *pdf,
+                       fz_buffer *buf,
+                       char *filename,
+                       char *ufilename,
+                       char *desc,
+                       int compress)
+{
+    size_t len = 0;
+    pdf_obj *ef, *f, *params, *val = NULL;
+    fz_buffer *buff2 = NULL;
+    fz_var(buff2);
+    fz_try(ctx) {
+        val = pdf_new_dict(ctx, pdf, 6);
+        pdf_dict_put_dict(ctx, val, PDF_NAME(CI), 4);
+        ef = pdf_dict_put_dict(ctx, val, PDF_NAME(EF), 4);
+        pdf_dict_put_text_string(ctx, val, PDF_NAME(F), filename);
+        pdf_dict_put_text_string(ctx, val, PDF_NAME(UF), ufilename);
+        pdf_dict_put_text_string(ctx, val, PDF_NAME(Desc), desc);
+        pdf_dict_put(ctx, val, PDF_NAME(Type), PDF_NAME(Filespec));
+        buff2 = fz_new_buffer_from_copied_data(ctx, "  ", 1);
+        f = pdf_add_stream(ctx, pdf, buff2, NULL, 0);
+        pdf_dict_put_drop(ctx, ef, PDF_NAME(F), f);
+        JM_update_stream(ctx, pdf, f, buf, compress);
+        len = fz_buffer_storage(ctx, buf, NULL);
+        pdf_dict_put_int(ctx, f, PDF_NAME(DL), len);
+        pdf_dict_put_int(ctx, f, PDF_NAME(Length), len);
+        params = pdf_dict_put_dict(ctx, f, PDF_NAME(Params), 4);
+        pdf_dict_put_int(ctx, params, PDF_NAME(Size), len);
+    }
+    fz_always(ctx) {
+        fz_drop_buffer(ctx, buff2);
+    }
+    fz_catch(ctx) {
+        fz_rethrow(ctx);
+    }
+    return val;
+}
+%}