# modules/xmp_metadata.js

    /** ====================================================================
     * @license
     * 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.
     * ====================================================================
     */

    import { jsPDF } from "../jspdf.js";

    /**
     * @name xmp_metadata
     * @module
     */
    (function(jsPDFAPI) {
      "use strict";

      var postPutResources = function() {
        var xmpmeta_beginning = '<x:xmpmeta xmlns:x="adobe:ns:meta/">';
        var rdf_beginning =
          '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:jspdf="' +
          this.internal.__metadata__.namespaceuri +
          '"><jspdf:metadata>';
        var rdf_ending = "</jspdf:metadata></rdf:Description></rdf:RDF>";
        var xmpmeta_ending = "</x:xmpmeta>";
        var utf8_xmpmeta_beginning = unescape(
          encodeURIComponent(xmpmeta_beginning)
        );
        var utf8_rdf_beginning = unescape(encodeURIComponent(rdf_beginning));
        var utf8_metadata = unescape(
          encodeURIComponent(this.internal.__metadata__.metadata)
        );
        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;

        this.internal.__metadata__.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");
      };

      var putCatalog = function() {
        if (this.internal.__metadata__.metadata_object_number) {
          this.internal.write(
            "/Metadata " +
              this.internal.__metadata__.metadata_object_number +
              " 0 R"
          );
        }
      };

      /**
       * Adds XMP formatted metadata to PDF
       *
       * @name addMetadata
       * @function
       * @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.
       * @returns {jsPDF} jsPDF-instance
       */
      jsPDFAPI.addMetadata = function(metadata, namespaceuri) {
        if (typeof this.internal.__metadata__ === "undefined") {
          this.internal.__metadata__ = {
            metadata: metadata,
            namespaceuri: namespaceuri || "http://jspdf.default.namespaceuri/"
          };
          this.internal.events.subscribe("putCatalog", putCatalog);

          this.internal.events.subscribe("postPutResources", postPutResources);
        }
        return this;
      };
    })(jsPDF.API);