comparison mupdf-source/docs/examples/pdf-extract-rich-media.js @ 3:2c135c81b16c

MERGE: upstream PyMuPDF 1.26.4 with MuPDF 1.26.7
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:44:09 +0200
parents b50eed0cc0ef
children
comparison
equal deleted inserted replaced
0:6015a75abc2d 3:2c135c81b16c
1 // List and extract embedded rich media in a PDF document.
2
3 if (scriptArgs.length != 1 && scriptArgs.length != 3) {
4 print("usage: mutool run pdf-extract-rich-media.js input.pdf [index filename]");
5 print(" List embedded rich media, or extract an embedded rich media file from a PDF document.")
6 quit();
7 }
8
9 var doc = Document.openDocument(scriptArgs[0]);
10
11 function mapNameTree(N, fn) {
12 function mapNameTreeNames(NN) {
13 var i, n = NN.length;
14 for (i = 0; i < n; i += 2)
15 fn(NN[i], NN[i+1]);
16 }
17 function mapNameTreeKids(NK) {
18 var i, n = NK.length;
19 for (i = 0; i < n; ++i)
20 mapNameTree(NK[i], fn)
21 }
22 if ("Names" in N)
23 mapNameTreeNames(N.Names);
24 if ("Kids" in N)
25 mapNameTreeKids(N.Kids);
26 }
27
28 function fileNameFromFS(fs) {
29 if ("UF" in fs) return fs.UF.asString();
30 if ("F" in fs) return fs.F.asString();
31 if ("Unix" in fs) return fs.Unix.asString();
32 if ("DOS" in fs) return fs.DOS.asString();
33 if ("Mac" in fs) return fs.Mac.asString();
34 return "Untitled";
35 }
36
37 function mapRichMediaAssets(fn) {
38 var pageCount = doc.countPages();
39 var page, annots, a;
40 for (page = 0; page < pageCount; ++page) {
41 annots = doc.findPage(page).Annots;
42 if (annots && annots.length > 0) {
43 for (a = 0; a < annots.length; ++a) {
44 if (annots[a].Subtype == "RichMedia")
45 mapNameTree(annots[a].RichMediaContent.Assets, fn);
46 }
47 }
48 }
49 }
50
51 if (scriptArgs.length == 1) {
52 var idx = 1;
53 mapRichMediaAssets(function (name, fs) {
54 print(idx, name.asString());
55 print("\tFilename:", fileNameFromFS(fs));
56 if ("Desc" in fs)
57 print("\tDescription:", fs.Desc.asString());
58 ++idx;
59 });
60 }
61
62 if (scriptArgs.length == 3) {
63 var idx = 1;
64 mapRichMediaAssets(function (name, fs) {
65 if (idx == scriptArgs[1]) {
66 print("Saving embedded file", idx, "as:", scriptArgs[2]);
67 fs.EF.F.readStream().save(scriptArgs[2]);
68 }
69 ++idx;
70 });
71 }