From eb363682478a0c4b0539222d1e27a3dd252d8b62 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Mon, 12 Nov 2018 16:52:09 +0100 Subject: Add example script to list and extract embedded files from PDF documents. --- docs/examples/pdf-portfolio.js | 62 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 docs/examples/pdf-portfolio.js (limited to 'docs/examples/pdf-portfolio.js') diff --git a/docs/examples/pdf-portfolio.js b/docs/examples/pdf-portfolio.js new file mode 100644 index 00000000..962f4bc2 --- /dev/null +++ b/docs/examples/pdf-portfolio.js @@ -0,0 +1,62 @@ +// List and extract embedded files in a PDF document. + +if (scriptArgs.length != 1 && scriptArgs.length != 3) { + print("usage: mutool run pdf-portfolio.js input.pdf [index filename]"); + print(" List embedded files, or extract an embedded file from a PDF document.") + quit(); +} + +var doc = new PDFDocument(scriptArgs[0]); +var Root = doc.getTrailer().Root +if (!("EmbeddedFiles" in Root.Names)) { + print("Document has no embedded files!"); + quit(); +} + +function mapNameTree(N, fn) { + function mapNameTreeNames(NN) { + var i, n = NN.length; + for (i = 0; i < n; i += 2) + fn(NN[i], NN[i+1]); + } + function mapNameTreeKids(NK) { + var i, n = NK.length; + for (i = 0; i < n; ++i) + mapNameTree(NK[i], fn) + } + if ("Names" in N) + mapNameTreeNames(N.Names); + if ("Kids" in N) + mapNameTreeKids(N.Kids); +} + +function fileNameFromFS(fs) { + if ("UF" in fs) return fs.UF.asString(); + if ("F" in fs) return fs.F.asString(); + if ("Unix" in fs) return fs.Unix.asString(); + if ("DOS" in fs) return fs.DOS.asString(); + if ("Mac" in fs) return fs.Mac.asString(); + return "Untitled"; +} + +if (scriptArgs.length == 1) { + var idx = 1; + mapNameTree(Root.Names.EmbeddedFiles, function (name,fs) { + print(idx, name.asString()); + print("\tFilename:", fileNameFromFS(fs)); + if ("Desc" in fs) + print("\tDescription:", fs.Desc.asString()); + ++idx; + }); +} + +if (scriptArgs.length == 3) { + var idx = 1; + mapNameTree(Root.Names.EmbeddedFiles, function (name,fs) { + if (idx == scriptArgs[1]) { + print("Saving embedded file", idx, "as:", scriptArgs[2]); + fs.EF.F.readStream().save(scriptArgs[2]); + } + ++idx; + }); +} -- cgit v1.2.3