<?xml version="1.0" encoding="utf-8"?>
			
			<rss version="2.0">
			<channel>
			<title>GenuineJD - XMP</title>
			<link>http://www.genuinejd.com/blog/index.cfm</link>
			<description>coldfusion, flex, flash, air...and other random tech stuff</description>
			<language>en-us</language>
			<pubDate>Sun, 05 Sep 2010 08:29:05 -0500</pubDate>
			<lastBuildDate>Fri, 20 Feb 2009 12:29:00 -0500</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>jack@genuinejd.com</managingEditor>
			<webMaster>jack@genuinejd.com</webMaster>
			
			
			
			
			
			<item>
				<title>Reading Embedded XMP Packets using ColdFusion</title>
				<link>http://www.genuinejd.com/blog/index.cfm/2009/2/20/Reading-Embedded-XMP-Packets-using-ColdFusion</link>
				<description>
				
				&lt;p class=&quot;MsoNormal&quot;&gt;In working more and more on our Digital Asset Management initiatives, I&apos;ve become more involved in working with &lt;a href=&quot;http://www.adobe.com/xmp&quot; target=&quot;_blank&quot;&gt;XMP&lt;/a&gt;.&amp;nbsp; Mostly as an experiment, I wanted to see if I could read and write this embedded metadata from and to a file.&amp;nbsp; The &lt;a href=&quot;http://www.adobe.com/devnet/xmp/sdk/eula.html&quot; target=&quot;_blank&quot;&gt;Adobe XMP Toolkit&lt;/a&gt; indicates how this can be done based on the structure of specific types of files.&amp;nbsp; It also indicates that packet scanning techniques can be used when file structure is unknown, however, is not encouraged.&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;I recognize it might not be the BEST way to read the XMP packet, however, all is fair in love and ColdFusion experimentation :)&amp;nbsp; It&apos;s important to note that this code looks only for the FIRST instance of the string &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: gray;&quot;&gt;&amp;lt;x:xmpmeta&lt;/span&gt; and if there are multiple instances of XMP packets, subsequent instances are ignored.&amp;nbsp; Adobe also indicates that if there are multiple packets, there is no way to know which packet is the correct one.&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;Needless to say, using the code below, I was able to read and parse XMP packets from all the Adobe sample files included in their toolkit.&amp;nbsp; It may not be the end-all solution, and may not work for writing back to the file, but it&apos;s a start!&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;background: #DBDBDB&quot;&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfparam&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;name=&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;&quot;URL.source&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;default=&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;&quot;xmp-asset.jpg&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cffile&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;action=&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;&quot;readbinary&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;file=&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;&quot;#ExpandPath(URL.source)#&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;variable=&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: gray;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: gray;&quot;&gt;&amp;lt;!--- encode the binary data to hex ---&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfset&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; hex_data = &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: #000066;&quot;&gt;BinaryEncode&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;(data,&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;&quot;hex&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: gray;&quot;&gt;&amp;lt;!--- string indicating beginning of packet &apos;&amp;lt;x:xmpmeta&apos; ---&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfset&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; xmp_string_begin = &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;&quot;3C783A786D706D657461&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: gray;&quot;&gt;&amp;lt;!--- string indicating end of packet &apos;&amp;lt;/x:xmpmeta&amp;gt;&apos; ---&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfset&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; xmp_string_end = &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;&quot;3C2F783A786D706D6574613E&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: gray;&quot;&gt;&amp;lt;!--- find the starting index in the hex string ---&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfset&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; idx_start = &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: #000066;&quot;&gt;FindNoCase&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;(xmp_string_begin,hex_data) &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: gray;&quot;&gt;&amp;lt;!--- find the ending index in the hex string ---&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfset&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; idx_end = &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: #000066;&quot;&gt;FindNoCase&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;(xmp_string_end,hex_data,idx_start) + &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: #000066;&quot;&gt;Len&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;(xmp_string_end) &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: gray;&quot;&gt;&amp;lt;!--- using the start and end indices, extract the xmp packet ---&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfset&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; xmp_hex = &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: #000066;&quot;&gt;Mid&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;(hex_data,idx_start,&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: #000066;&quot;&gt;Evaluate&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;(idx_end-idx_start)) &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: gray;&quot;&gt;&amp;lt;!--- convert the hex to readable characters ---&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfset&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; xmp_string = &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: #000066;&quot;&gt;ToString&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: #000066;&quot;&gt;BinaryDecode&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;(xmp_hex,&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;&quot;hex&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: gray;&quot;&gt;&amp;lt;!--- parse the xml string to and xml structure ---&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfset&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; xmp_xml = &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: #000066;&quot;&gt;XmlParse&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;(xmp_string) &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfcontent&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;type=&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;&quot;text/xml&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;cfoutput&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;&quot;&gt;#xmp_string#&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: maroon;&quot;&gt;&amp;lt;/cfoutput&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Be sure to check out the &lt;a href=&quot;http://www.adobe.com/devnet/xmp/&quot; target=&quot;_blank&quot;&gt;Adobe XMP Developer Center&lt;/a&gt; for more information.&lt;/p&gt;
				
				</description>
						
				
				<category>XMP</category>				
				
				<category>Adobe</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Fri, 20 Feb 2009 12:29:00 -0500</pubDate>
				<guid>http://www.genuinejd.com/blog/index.cfm/2009/2/20/Reading-Embedded-XMP-Packets-using-ColdFusion</guid>
				
			</item>
			
		 	
			</channel></rss>