/** ==================================================================== * jsPDF XMP metadata plugin * Copyright (c) 2016 Jussi Utunen, u-jussi@suomi24.fi * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ==================================================================== */ /*global jsPDF */ /** * Adds XMP formatted metadata to PDF * * @param {String} metadata The actual metadata to be added. The metadata shall be stored as XMP simple value. Note that if the metadata string contains XML markup characters "<", ">" or "&", those characters should be written using XML entities. * @param {String} namespaceuri Sets the namespace URI for the metadata. Last character should be slash or hash. * @function * @returns {jsPDF} * @methodOf jsPDF# * @name addMetadata */ (function (jsPDFAPI) { 'use strict'; var xmpmetadata = ""; var xmpnamespaceuri = ""; var metadata_object_number = ""; jsPDFAPI.addMetadata = function (metadata,namespaceuri) { xmpnamespaceuri = namespaceuri || "http://jspdf.default.namespaceuri/"; //The namespace URI for an XMP name shall not be empty xmpmetadata = metadata; this.internal.events.subscribe( 'postPutResources', function () { if(!xmpmetadata) { metadata_object_number = ""; } else { var xmpmeta_beginning = ''; var rdf_beginning = ''; var rdf_ending = ''; var xmpmeta_ending = ''; var utf8_xmpmeta_beginning = unescape(encodeURIComponent(xmpmeta_beginning)); var utf8_rdf_beginning = unescape(encodeURIComponent(rdf_beginning)); var utf8_metadata = unescape(encodeURIComponent(xmpmetadata)); var utf8_rdf_ending = unescape(encodeURIComponent(rdf_ending)); var utf8_xmpmeta_ending = unescape(encodeURIComponent(xmpmeta_ending)); var total_len = utf8_rdf_beginning.length + utf8_metadata.length + utf8_rdf_ending.length + utf8_xmpmeta_beginning.length + utf8_xmpmeta_ending.length; metadata_object_number = this.internal.newObject(); this.internal.write('<< /Type /Metadata /Subtype /XML /Length ' + total_len + ' >>'); this.internal.write('stream'); this.internal.write(utf8_xmpmeta_beginning + utf8_rdf_beginning + utf8_metadata + utf8_rdf_ending + utf8_xmpmeta_ending); this.internal.write('endstream'); this.internal.write('endobj'); } } ); this.internal.events.subscribe( 'putCatalog', function () { if (metadata_object_number) { this.internal.write('/Metadata ' + metadata_object_number + ' 0 R'); } } ); return this; }; }(jsPDF.API));