{"id":23,"date":"2015-01-22T18:06:33","date_gmt":"2015-01-22T18:06:33","guid":{"rendered":"http:\/\/habett.fr\/wordpress\/?p=23"},"modified":"2015-01-25T16:20:00","modified_gmt":"2015-01-25T16:20:00","slug":"adobe-0-exiftool-1-habett-ii","status":"publish","type":"post","link":"https:\/\/habett.fr\/blog\/2015\/01\/adobe-0-exiftool-1-habett-ii\/","title":{"rendered":"Adobe 0 &#8211; ExifTool 1 &#8211; Habett II"},"content":{"rendered":"<p>Pas mal de prises de t\u00eate au final pour injecter des m\u00e9ta-donn\u00e9es dans des PDFs.<\/p>\n<p>Surtout sur le champ du milieu.<\/p>\n<p>Sujet.<\/p>\n<p>Apr\u00e8s avoir h\u00e9sit\u00e9 sur la m\u00e9thodologie je me suis rendu \u00e0 l&rsquo;\u00e9vidence que le meilleur outil pour faire cela programmatiquement (par script) est bel et bien ExifTool. Le grand ExifTool, ce puissant et capricieux outil multi-platteforme. Mais \u00e0 vrai dire, est-ce son caprice ou bien celui qui s&rsquo;introduit malignement dans mon esprit \u00e0 trop me demander pourquoi les turpides d&rsquo;affichage de ces m\u00eame m\u00e9ta-donn\u00e9es dans Adobe Reader et Acrobat sont si perturbantes. Ou bien les m\u00e9andres de l&rsquo;histoire sont li\u00e9es \u00e0 l&rsquo;age de cette technologie et \u00e0 l&rsquo;\u00e9volution des techniques disponibles.<br \/>\nReste qu&rsquo;Adobe nous fout un bon gros bordel en place. Je pourrais cracher mon venin sur ces bureaucrates et l&rsquo;informatique et les maudire longtemps encore, et parfois m\u00eame aller jusqu&rsquo;\u00e0 douter de la qualit\u00e9 du travail d&rsquo;ExifTool mais non, voici donc ma solution en ligne de commande.<\/p>\n<p>Je commence par faire le vide dans les m\u00e9tadonn\u00e9es car l&#8217;empilement des diff\u00e9rentes couches devient vite probl\u00e9matique. Je fais donc simplement:<br \/>\n<b>exiftool -overwrite_original -all= monfichier.pdf<\/b><\/p>\n<p>Ensuite j&rsquo;injecte un fichier XMP que j&rsquo;aurai rempli avec mes m\u00e9tadonn\u00e9es selon la distribution suivante (je remplis le XML en DOM Javascript ou un LibXML Perl).<\/p>\n<blockquote><p>&lt;?xpacket begin=&rsquo;?&rsquo; id=&rsquo;W5M0MpCehiHzreSzNTczkc9d&rsquo;?&gt;<br \/>\n&lt;x:xmpmeta xmlns:x=\u00a0\u00bbadobe:ns:meta\/\u00a0\u00bb&gt;<br \/>\n&lt;rdf:RDF xmlns:rdf=\u00a0\u00bbhttp:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#\u00a0\u00bb&gt;<br \/>\n&lt;rdf:Description rdf:about=\u00a0\u00bb\u00a0\u00bb xmlns:dc=\u00a0\u00bbhttp:\/\/purl.org\/dc\/elements\/1.1\/\u00a0\u00bb&gt;<br \/>\n&lt;dc:creator&gt;<br \/>\n&lt;rdf:Seq&gt;<br \/>\n&lt;rdf:li&gt;None&lt;\/rdf:li&gt;<br \/>\n&lt;\/rdf:Seq&gt;<br \/>\n&lt;\/dc:creator&gt;<br \/>\n&lt;dc:description&gt;<br \/>\n&lt;rdf:Alt&gt;<br \/>\n&lt;rdf:li xml:lang=\u00a0\u00bbx-default\u00a0\u00bb&gt;r\u00e9f\u00e9rences&lt;\/rdf:li&gt;<br \/>\n&lt;\/rdf:Alt&gt;<br \/>\n&lt;\/dc:description&gt;<br \/>\n&lt;dc:format&gt;application\/pdf&lt;\/dc:format&gt;<br \/>\n&lt;dc:subject&gt;<br \/>\n&lt;rdf:Bag&gt;&lt;rdf:li&gt;baratin&lt;\/rdf:li&gt;&lt;\/rdf:Bag&gt;<br \/>\n&lt;\/dc:subject&gt;<br \/>\n&lt;dc:title&gt;<br \/>\n&lt;rdf:Alt&gt;<br \/>\n&lt;rdf:li xml:lang=\u00a0\u00bbx-default\u00a0\u00bb&gt;circonscription \u00e9lectorale des Etats-Unis d&rsquo;Am\u00e9rique&lt;\/rdf:li&gt;<br \/>\n&lt;\/rdf:Alt&gt;<br \/>\n&lt;\/dc:title&gt;<br \/>\n&lt;\/rdf:Description&gt;<br \/>\n&lt;rdf:Description rdf:about=\u00a0\u00bb\u00a0\u00bb xmlns:pdf=\u00a0\u00bbhttp:\/\/ns.adobe.com\/pdf\/1.3\/\u00a0\u00bb&gt;<br \/>\n&lt;pdf:Author&gt;None&lt;\/pdf:Author&gt;<br \/>\n&lt;pdf:Keywords&gt;baratin&lt;\/pdf:Keywords&gt;<br \/>\n&lt;pdf:PDFVersion&gt;1.4&lt;\/pdf:PDFVersion&gt;<br \/>\n&lt;\/rdf:Description&gt;<br \/>\n&lt;rdf:Description rdf:about=\u00a0\u00bb\u00a0\u00bb xmlns:xmp=\u00a0\u00bbhttp:\/\/ns.adobe.com\/xap\/1.0\/\u00a0\u00bb&gt;<br \/>\n&lt;xmp:CreateDate&gt;Wed Jan 21 2015 16:43:41 GMT+0100&lt;\/xmp:CreateDate&gt;<br \/>\n&lt;xmp:MetadataDate&gt;Wed Jan 21 2015 16:43:41 GMT+0100&lt;\/xmp:MetadataDate&gt;<br \/>\n&lt;xmp:ModifyDate&gt;Wed Jan 21 2015 16:43:41 GMT+0100&lt;\/xmp:ModifyDate&gt;<br \/>\n&lt;\/rdf:Description&gt;<br \/>\n&lt;rdf:Description rdf:about=\u00a0\u00bb\u00a0\u00bb xmlns:xmpRights=\u00a0\u00bbhttp:\/\/ns.adobe.com\/xap\/1.0\/rights\/\u00a0\u00bb&gt;<br \/>\n&lt;xmpRights:WebStatement&gt;http:\/\/www.legicrack.org&lt;\/xmpRights:WebStatement&gt;<br \/>\n&lt;\/rdf:Description&gt;<br \/>\n&lt;\/rdf:RDF&gt;<br \/>\n&lt;\/x:xmpmeta&gt;<br \/>\n&lt;?xpacket end=&rsquo;w&rsquo;?&gt;<\/p><\/blockquote>\n<p>Plusieurs notes \u00e0 ce propos. Bien respecter les format de date et UUID, bien diviser la valeur du champ Mots-Cl\u00e9s selon les virgules et les points-vigules afin d&rsquo;en r\u00e9p\u00e9ter le contenu depuis &lt;pdf:Keywords&gt; pour sa totalit\u00e9 litt\u00e9rale vers &lt;dc:subject&gt;\/&lt;rdf:Bag&gt; et autant de &lt;rdf:li&gt; que la division vous donnera. Cela semble n\u00e9cessaire m\u00eame si le paradoxe viendra plus loin.<\/p>\n<p>Pour injecter cela, on utilisera la commande suivante:<\/p>\n<p><b>exiftool -overwrite_orginal -tags_from_file monxmp.xmp monpdf.pdf<\/b><\/p>\n<p>Reste le champ Subject ou Description ou Sujet, comme vous voulez, \u00e0 force je l&rsquo;appelle le champ du milieu. Comme vous le voyez dans le XML pr\u00e9c\u00e9dent il y a diff\u00e9rents namespace dans les m\u00e9tadonn\u00e9es donc il faut pas se rater.<\/p>\n<p>Ma solution est la suivante, avec l&rsquo;option -L en plus si vous \u00eates sous Windows et que vous voulez mettre une valeur avec accents:<\/p>\n<p><b>exiftool -overwrite_orginal -pdf:subject=\u00a0\u00bbMon champ du milieu\u00a0\u00bb -xmp:subject=\u00a0\u00bb\u00a0\u00bb monpdf.pdf<\/b><\/p>\n<p>Ils ont le m\u00eame nodename mais dans des espaces de noms diff\u00e9rents et pourtant il faut les injecter avec des valeurs radicalement diff\u00e9rentes.<\/p>\n<p>Apr\u00e8s ces trois \u00e9tapes, j&rsquo;arrive \u00e0 mes fins, et mon r\u00e9sultat dans les produits Adobe est conforme, avec juste le petit itch qui est que la valeur des mots-cl\u00e9s est encadr\u00e9e de quotes, ce qui peut arriver m\u00eame quand on saisit \u00e0 la main, \u00e0 moins qu&rsquo;un lecteur ou moi ne finisse par trouver une solution programmatique.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pas mal de prises de t\u00eate au final pour injecter des m\u00e9ta-donn\u00e9es dans des PDFs. Surtout sur le champ du milieu. Sujet. Apr\u00e8s avoir h\u00e9sit\u00e9 sur la m\u00e9thodologie je me suis rendu \u00e0 l&rsquo;\u00e9vidence que le meilleur outil pour faire cela programmatiquement (par script) est bel et bien ExifTool. Le grand ExifTool, ce puissant et &hellip; <a href=\"https:\/\/habett.fr\/blog\/2015\/01\/adobe-0-exiftool-1-habett-ii\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Adobe 0 &#8211; ExifTool 1 &#8211; Habett II<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[10,8,7,6,9,5,4],"class_list":["post-23","post","type-post","status-publish","format-standard","hentry","category-pdf","tag-adobe","tag-injection","tag-metadata","tag-pdf","tag-shoot","tag-xml","tag-xmp"],"_links":{"self":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/23","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/comments?post=23"}],"version-history":[{"count":4,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions"}],"predecessor-version":[{"id":30,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions\/30"}],"wp:attachment":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/media?parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/categories?post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/tags?post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}