summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/lpdf-xmp.lua
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-03-31 20:15:47 +0200
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-03-31 20:15:47 +0200
commitad6c001890494bd0432aaf76940b38a997042c03 (patch)
tree0e95d32d8e3fcafda7ed1f0c33e5739303560036 /tex/context/base/mkiv/lpdf-xmp.lua
parentecea0b75f52a98aae0e6bcfb649927fb84ffb9c0 (diff)
downloadcontext-ad6c001890494bd0432aaf76940b38a997042c03.tar.gz
2016-03-31 19:50:00
Diffstat (limited to 'tex/context/base/mkiv/lpdf-xmp.lua')
-rw-r--r--tex/context/base/mkiv/lpdf-xmp.lua145
1 files changed, 102 insertions, 43 deletions
diff --git a/tex/context/base/mkiv/lpdf-xmp.lua b/tex/context/base/mkiv/lpdf-xmp.lua
index f372b3461..b8170319c 100644
--- a/tex/context/base/mkiv/lpdf-xmp.lua
+++ b/tex/context/base/mkiv/lpdf-xmp.lua
@@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['lpdf-xmp'] = {
comment = "with help from Peter Rolf",
}
-local tostring = tostring
+local tostring, type = tostring, type
local format, random, char, gsub, concat = string.format, math.random, string.char, string.gsub, table.concat
local xmlfillin = xml.fillin
@@ -37,47 +37,105 @@ local xpacket = [[
local mapping = {
-- user defined keys (pdfx:)
- ["ConTeXt.Jobname"] = "rdf:Description/pdfx:ConTeXt.Jobname",
- ["ConTeXt.Time"] = "rdf:Description/pdfx:ConTeXt.Time",
- ["ConTeXt.Url"] = "rdf:Description/pdfx:ConTeXt.Url",
- ["ConTeXt.Version"] = "rdf:Description/pdfx:ConTeXt.Version",
- ["ID"] = "rdf:Description/pdfx:ID",
- ["PTEX.Fullbanner"] = "rdf:Description/pdfx:PTEX.Fullbanner",
+ ["ConTeXt.Jobname"] = { "context", "rdf:Description/pdfx:ConTeXt.Jobname" },
+ ["ConTeXt.Time"] = { "date", "rdf:Description/pdfx:ConTeXt.Time" },
+ ["ConTeXt.Url"] = { "context", "rdf:Description/pdfx:ConTeXt.Url" },
+ ["ConTeXt.Version"] = { "context", "rdf:Description/pdfx:ConTeXt.Version" },
+ ["ID"] = { "date", "rdf:Description/pdfx:ID" }, -- has date
+ ["PTEX.Fullbanner"] = { "metadata","rdf:Description/pdfx:PTEX.Fullbanner" },
-- Adobe PDF schema
- ["Keywords"] = "rdf:Description/pdf:Keywords",
- ["Producer"] = "rdf:Description/pdf:Producer",
- -- ["Trapped"] = "rdf:Description/pdf:Trapped", -- '/False' in /Info, but 'False' in XMP
+ ["Keywords"] = { "metadata","rdf:Description/pdf:Keywords" },
+ ["Producer"] = { "metadata","rdf:Description/pdf:Producer" },
+ -- ["Trapped"] = { "pdf", "rdf:Description/pdf:Trapped" }, -- '/False' in /Info, but 'False' in XMP
-- Dublin Core schema
- ["Author"] = "rdf:Description/dc:creator/rdf:Seq/rdf:li",
- ["Format"] = "rdf:Description/dc:format", -- optional, but nice to have
- ["Subject"] = "rdf:Description/dc:description/rdf:Alt/rdf:li",
- ["Title"] = "rdf:Description/dc:title/rdf:Alt/rdf:li",
+ ["Author"] = { "metadata","rdf:Description/dc:creator/rdf:Seq/rdf:li" },
+ ["Format"] = { "metadata","rdf:Description/dc:format" }, -- optional, but nice to have
+ ["Subject"] = { "metadata","rdf:Description/dc:description/rdf:Alt/rdf:li" },
+ ["Title"] = { "metadata","rdf:Description/dc:title/rdf:Alt/rdf:li" },
-- XMP Basic schema
- ["CreateDate"] = "rdf:Description/xmp:CreateDate",
- ["Creator"] = "rdf:Description/xmp:CreatorTool",
- ["MetadataDate"] = "rdf:Description/xmp:MetadataDate",
- ["ModifyDate"] = "rdf:Description/xmp:ModifyDate",
+ ["CreateDate"] = { "date", "rdf:Description/xmp:CreateDate" },
+ ["CreationDate"] = { "date", "rdf:Description/xmp:CreationDate" }, -- dummy
+ ["Creator"] = { "metadata","rdf:Description/xmp:CreatorTool" },
+ ["MetadataDate"] = { "date", "rdf:Description/xmp:MetadataDate" },
+ ["ModDate"] = { "date", "rdf:Description/xmp:ModDate" }, -- dummy
+ ["ModifyDate"] = { "date", "rdf:Description/xmp:ModifyDate" },
-- XMP Media Management schema
- ["DocumentID"] = "rdf:Description/xmpMM:DocumentID",
- ["InstanceID"] = "rdf:Description/xmpMM:InstanceID",
- ["RenditionClass"] = "rdf:Description/xmpMM:RenditionClass", -- PDF/X-4
- ["VersionID"] = "rdf:Description/xmpMM:VersionID", -- PDF/X-4
+ ["DocumentID"] = { "date", "rdf:Description/xmpMM:DocumentID" }, -- uuid
+ ["InstanceID"] = { "date", "rdf:Description/xmpMM:InstanceID" }, -- uuid
+ ["RenditionClass"] = { "pdf", "rdf:Description/xmpMM:RenditionClass" }, -- PDF/X-4
+ ["VersionID"] = { "pdf", "rdf:Description/xmpMM:VersionID" }, -- PDF/X-4
-- additional entries
-- PDF/X
- ["GTS_PDFXVersion"] = "rdf:Description/pdfxid:GTS_PDFXVersion",
+ ["GTS_PDFXVersion"] = { "pdf", "rdf:Description/pdfxid:GTS_PDFXVersion" },
-- optional entries
-- all what is visible in the 'document properties --> additional metadata' window
-- XMP Rights Management schema (optional)
- ["Marked"] = "rdf:Description/xmpRights:Marked",
- -- ["Owner"] = "rdf:Description/xmpRights:Owner/rdf:Bag/rdf:li", -- maybe useful (not visible)
- -- ["UsageTerms"] = "rdf:Description/xmpRights:UsageTerms", -- maybe useful (not visible)
- ["WebStatement"] = "rdf:Description/xmpRights:WebStatement",
+ ["Marked"] = { "pdf", "rdf:Description/xmpRights:Marked" },
+ -- ["Owner"] = { "metadata", "rdf:Description/xmpRights:Owner/rdf:Bag/rdf:li" }, -- maybe useful (not visible)
+ -- ["UsageTerms"] = { "metadata", "rdf:Description/xmpRights:UsageTerms" }, -- maybe useful (not visible)
+ ["WebStatement"] = { "metadata", "rdf:Description/xmpRights:WebStatement" },
-- Photoshop PDF schema (optional)
- ["AuthorsPosition"] = "rdf:Description/photoshop:AuthorsPosition",
- ["Copyright"] = "rdf:Description/photoshop:Copyright",
- ["CaptionWriter"] = "rdf:Description/photoshop:CaptionWriter",
+ ["AuthorsPosition"] = { "metadata", "rdf:Description/photoshop:AuthorsPosition" },
+ ["Copyright"] = { "metadata", "rdf:Description/photoshop:Copyright" },
+ ["CaptionWriter"] = { "metadata", "rdf:Description/photoshop:CaptionWriter" },
}
+pdf.setsuppressoptionalinfo(
+ 0 --
+ + 1 -- pdfnofullbanner
+ + 2 -- pdfnofilename
+ + 4 -- pdfnopagenumber
+ + 8 -- pdfnoinfodict
+ + 16 -- pdfnocreator
+ + 32 -- pdfnocreationdate
+ + 64 -- pdfnomoddate
+ + 128 -- pdfnoproducer
+ + 256 -- pdfnotrapped
+ -- + 512 -- pdfnoid
+)
+
+local included = table.setmetatableindex( {
+ context = true,
+ id = true,
+ metadata = true,
+ date = true,
+ id = true,
+ pdf = true,
+}, function(t,k)
+ return true
+end)
+
+directives.register("backend.nodates", function(v)
+ included.date = not v
+ if v then
+ report_info("no date/time information will be added to the PDF file")
+ end
+end)
+
+directives.register("backend.trailerid", function(v)
+ if v then
+ if toboolean(v) or v == "" then
+ v = "This file is processed by ConTeXt and LuaTeX."
+ else
+ v = tostring(v)
+ end
+ local h = md5.HEX(v)
+ report_info("using hashed trailer id %a (%a)",v,h)
+ pdf.settrailerid(format("[<%s> <%s>]",h,h))
+ end
+end)
+
+local function permitdetail(what)
+ local m = mapping[what]
+ if m then
+ return included[m[1]] and m[2]
+ else
+ return included[what]
+ end
+end
+
+lpdf.permitdetail = permitdetail
+
-- maybe some day we will load the xmp file at runtime
local xmp, xmpfile, xmpname = nil, nil, "lpdf-pdx.xml"
@@ -117,8 +175,8 @@ local function valid_xmp()
end
function lpdf.addxmpinfo(tag,value,check)
- local pattern = mapping[tag]
- if pattern then
+ local pattern = permitdetail(tag)
+ if type(pattern) == "string" then
xmlfillin(xmp or valid_xmp(),pattern,value,check)
end
end
@@ -129,14 +187,21 @@ local pdfaddtoinfo = lpdf.addtoinfo
local pdfaddxmpinfo = lpdf.addxmpinfo
function lpdf.addtoinfo(tag,pdfvalue,strvalue)
- pdfaddtoinfo(tag,pdfvalue)
- local value = strvalue or gsub(tostring(pdfvalue),"^%((.*)%)$","%1") -- hack
- if trace_info then
- report_info("set %a to %a",tag,value)
+ local pattern = permitdetail(tag)
+ if pattern then
+ pdfaddtoinfo(tag,pdfvalue)
+ end
+ if type(pattern) == "string" then
+ local value = strvalue or gsub(tostring(pdfvalue),"^%((.*)%)$","%1") -- hack
+ if trace_info then
+ report_info("set %a to %a",tag,value)
+ end
+ xmlfillin(xmp or valid_xmp(),pattern,value,check)
end
- pdfaddxmpinfo(tag,value)
end
+local pdfaddtoinfo = lpdf.addtoinfo -- used later
+
-- for the do-it-yourselvers
function lpdf.insertxmpinfo(pattern,whatever,prepend)
@@ -151,12 +216,6 @@ end
local t = { } for i=1,24 do t[i] = random() end
-if not pdf.getcompresslevel then
- pdf.getcompresslevel = function()
- return tex.pdfcompresslevel or tex.getcount("pdfcompresslevel")
- end
-end
-
local function flushxmpinfo()
commands.pushrandomseed()
commands.setrandomseed(os.time())