Properties, Swatch Colors, and Thumbnails in XMP

Context

This is a second installment of the work that began with Looking For Metadata in All the Wrong Places. The short of it is that I scanned my computer for XMP metadata packets, stored those packets in a triple store and now I'm using the SPARQL query language to explore it. This project is part of the development of the Gastrodon library, which is designed to make SPARQL query from a Jupyter notebook as easy as pie.

Overview

In this essay, I take an inventory of the namespaces, classes, and properties that describe the files on my computer. Finding that properties that describe color swatches are the most numerically prevalent, I investigate the use of them, and along the way, look at the thumbnail embedded in a metadata packet.

As always, We start by importing libraries:

In [1]:
%load_ext autotime
import sys
sys.path.append("/Users/paul_000/Documents/Github/gastrodon")
from gastrodon import Endpoint,QName,ttl,URIRef
import pandas as pd
from base64 import b64decode
from rdflib import Graph,Namespace,RDF
from IPython.display import display_jpeg,display_html

prefixes=Graph()
prefixes.load('/xmp/prefixes.ttl',format='ttl')
endpoint=Endpoint("http://127.0.0.1:8890/sparql/",prefixes)

RDF Namespaces

First I'll show you a list of RDF namespaces used in the XMP metadata packets. XMP metadata packets are encoded in RDF/XML and use XML namespace syntax to define RDF namespaces, which map short names to URIs, just as do XML namespaces.

The import process consolidates the namespace declarations used in the packets, bringing in declarations from a number of vendors. Most of them are in Adobe namespace, as Adobe developed the XMP specification, but frequently those represent terminology such as EXIF which were adopted from other vendors.

Note that namespace declarations are local to a particular graph (or database), thus somebody working elsewhere could define different short names for a given namespace, or assign a different namespace to a given short name. RDF data is serialized together with namespace declarations (just like XML) so you can exchange data between RDF databases without worrying about this.

In [2]:
pd.options.display.max_rows = 100
endpoint.namespaces()
Out[2]:
prefix namespace
ExtensisFontSense http://www.extensis.com/meta/FontSense/
FA1 http://ns.InsiderSoftware.com/fontlist/1.0/
GettyImagesGIFT http://xmp.gettyimages.com/gift/1.0/
Iptc4xmpCore http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/
Iptc4xmpExt http://iptc.org/std/Iptc4xmpExt/2008-02-29/
MicrosoftPhoto http://ns.microsoft.com/photo/1.0
adhocwf http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/
asf http://ns.adobe.com/asf/1.0/
aux http://ns.adobe.com/exif/1.0/aux/
avm http://www.communicatingastronomy.org/avm/1.0/
bext http://ns.adobe.com/bwf/bext/1.0/
creatorAtom http://ns.adobe.com/creatorAtom/1.0/
crs http://ns.adobe.com/camera-raw-settings/1.0/
custom http://www.prnewswire.com/XMP/
dc http://purl.org/dc/elements/1.1/
desc http://ns.adobe.com/xfa/promoted-desc/
exif http://ns.adobe.com/exif/1.0/
fwc http://ns.fotoware.com/iptcxmp-custom/1.0/
fwl http://ns.fotoware.com/iptcxmp-legacy/1.0/
fwr http://ns.fotoware.com/iptcxmp-reserved/1.0/
fwu http://ns.fotoware.com/iptcxmp-user/1.0/
iX http://ns.adobe.com/iX/1.0/
idPriv http://ns.adobe.com/xmp/InDesign/private
illustrator http://ns.adobe.com/illustrator/1.0/
leaf http://www.creo.com/global/products/digital_ph...
lr http://ns.adobe.com/lightroom/1.0/
mbn http://ns.interwoven.com/mediabin/1.0/
mwg-rs http://www.metadataworkinggroup.com/schemas/re...
o2 http://rdf.ontology2.com/metadata/
pdf http://ns.adobe.com/pdf/1.3/
pdfaExtension http://www.aiim.org/pdfa/ns/extension/
pdfaProperty http://www.aiim.org/pdfa/ns/property#
pdfaSchema http://www.aiim.org/pdfa/ns/schema#
pdfaid http://www.aiim.org/pdfa/ns/id/
pdfx http://ns.adobe.com/pdfx/1.3/
pdfxid http://www.npes.org/pdfx/ns/id/
photomechanic http://ns.camerabits.com/photomechanic/1.0/
photoshop http://ns.adobe.com/photoshop/1.0/
plus http://ns.useplus.org/ldf/xmp/1.0/
png http://ns.adobe.com/png/1.0/
prefix0 file:///xmp/MSImagingV1
prism http://prismstandard.org/namespaces/basic/2.0/
rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#
rdfs http://www.w3.org/2000/01/rdf-schema#
riffinfo http://ns.adobe.com/riff/info/
stArea http://ns.adobe.com/xmp/sType/Area#
stCamera http://ns.adobe.com/photoshop/1.0/camera-profile
stDim http://ns.adobe.com/xap/1.0/sType/Dimensions#
stEvt http://ns.adobe.com/xap/1.0/sType/ResourceEvent#
stFnt http://ns.adobe.com/xap/1.0/sType/Font#
stMfs http://ns.adobe.com/xap/1.0/sType/ManifestItem#
stRef http://ns.adobe.com/xap/1.0/sType/ResourceRef#
tiff http://ns.adobe.com/tiff/1.0/
wav http://ns.adobe.com/xmp/wav/1.0/
xap http://ns.adobe.com/xap/1.0/
xapG http://ns.adobe.com/xap/1.0/g/
xapGImg http://ns.adobe.com/xap/1.0/g/img/
xapMM http://ns.adobe.com/xap/1.0/mm/
xapRights http://ns.adobe.com/xap/1.0/rights/
xapTPg http://ns.adobe.com/xap/1.0/t/pg/
xml http://www.w3.org/XML/1998/namespace
xmp http://ns.adobe.com/xap/1.0/
xmpDM http://ns.adobe.com/xmp/1.0/DynamicMedia/
xmpG http://ns.adobe.com/xap/1.0/g/
xmpGImg http://ns.adobe.com/xap/1.0/g/img/
xmpMM http://ns.adobe.com/xap/1.0/mm/
xmpNote http://ns.adobe.com/xmp/note/
xmpRights http://ns.adobe.com/xap/1.0/rights/
xmpTPg http://ns.adobe.com/xap/1.0/t/pg/
xsd http://www.w3.org/2001/XMLSchema#
time: 23.5 ms

Named Graphs

Technically, the database that I'm using, the open-source edition of OpenLink Virtuoso is a quad store instead of a triple store, because triples are organized into named graphs. Each named graph holds a set of triples; these can be used in numerous ways, but they are significant here because Virtuoso comes with about 5000 triples pre-loaded, and while I survey the types and properties used in the XMP data, I don't want to look at the ones that came with the database. All of the graphs except for the last one come with the database, and will be ignored.

In [3]:
endpoint.select("""
   SELECT DISTINCT ?g {
       GRAPH ?g { ?s ?p ?o .}
   }
""")
Out[3]:
g
0 http://www.openlinksw.com/schemas/virtrdf#
1 http://www.w3.org/ns/ldp#
2 http://localhost:8890/sparql
3 http://localhost:8890/DAV/
4 http://www.w3.org/2002/07/owl#
5 http://rdf.ontology2.com/xmp/xmpAll
time: 292 ms

RDF Classes

In General

A "Class" in RDF is in some ways like a class in a programming language like Java or Python. In other ways it is completely different.

In a language like Java or C++ a class definition is absolutely necessary if you want to define methods and properties; this is linked to how those languages are implemented, and it is situation much like how you need to define a table in SQL if you want to insert rows of data.

In other languages, such as Javascript and Python, it is possible to attach methods and properties to an existing instance without affecting other instances. However, even in languages like this, where programmers could do something completely different, programmers tend to write code in a "class first" style.

In RDF, we say that ?someInstance is a member of ?someClass if the fact

?someInstance rdf:type ?someClass .

is set. For better and for worse we can use the shorthand

?someInstance a ?someClass .

to mean the same thing. I say "for worse" because "a" is a contraction of "is a", and the verb "to be" (of which "is" is a form) is heavily overloaded in most languages. (Some advocate reform of this.) Frequently I find that people confuse "a" with rdf:type, rdfs:subClassOf and even owl:sameAs and that can lead to a whole lot of trouble.

In the case of XMP

The above explanation applies because, although RDF packets are rich with data expressed in RDF properties, they make little use of RDF classes. In fact, almost all of the classes used are classes defined in the basic RDF namespace <http://www.w3.org/1999/02/22-rdf-syntax-ns#> that denote collections which are unordered rdf:Bag, ordered rdf:Seq or that define alternate values rdf:Alt.

In [4]:
endpoint.select("""
   SELECT ?type (COUNT(*) AS ?count) {
       GRAPH <http://rdf.ontology2.com/xmp/xmpAll> { ?that a ?type .}
   } GROUP BY ?type ORDER BY DESC(?count)
""")
Out[4]:
type count
0 rdf:Bag 70955
1 rdf:Seq 61078
2 rdf:Alt 33046
3 plus:LicensorDetail 1
time: 22 ms

RDF Properties

Although looking at class assignments are not particularly productive for this data sets, looking at the properties used is highly productive.

Off the bat, it is visible that the 7 most common properties have to do with representing color swatches, so I'll spend the rest of this essay exploring them.

Another kind of property that appears frequently are properties of the form rdf:_1, rdf:_2 and so forth. These are used together with rdf:Bag, rdf:Seq and rdf:Alt to define Containers. Given a Container, the first element is linked with rdf:_1, the second with rdf:_2, etc.

Note: the results of this query stop at 10,000 rows because Virtuoso is configured to return a maximum of 10,000 results via the public SPARQL endpoint. This is easy to change for a private SPARQL endpoint, however, it is a feature which can protect a SPARQL endpoint from users who write excessively complex queries.

In [5]:
pd.options.display.max_rows = 50

endpoint.select("""
   SELECT ?predicate (COUNT(*) AS ?count) {
       GRAPH <http://rdf.ontology2.com/xmp/xmpAll> { ?subject ?predicate ?object.}
   } GROUP BY ?predicate ORDER BY DESC(?count)
""")
Out[5]:
predicate count
0 xapG:swatchName 279501
1 xapG:type 279501
2 xapG:mode 279501
3 xapG:black 249726
4 xapG:magenta 249726
5 xapG:yellow 249726
6 xapG:cyan 249726
7 stEvt:action 233430
8 rdf:type 165080
9 rdf:_1 163821
10 stEvt:when 144993
11 stEvt:instanceID 144142
12 stEvt:softwareAgent 141816
13 stEvt:changed 141216
14 stEvt:parameters 69279
15 o2:xmpEnd 56386
16 o2:file 54652
17 o2:xmpStart 54625
18 o2:packetNumber 54526
19 o2:fileLength 54439
20 o2:xmpSize 54337
21 o2:rwFlag 54303
22 xap:CreatorTool 51740
23 xapMM:InstanceID 50034
24 xapMM:DocumentID 49897
... ... ...
9975 rdf:_8872 10
9976 rdf:_8878 10
9977 rdf:_8880 10
9978 rdf:_8902 10
9979 rdf:_8905 10
9980 rdf:_8925 10
9981 rdf:_8932 10
9982 rdf:_8941 10
9983 rdf:_8943 10
9984 rdf:_8950 10
9985 rdf:_8968 10
9986 rdf:_8992 10
9987 rdf:_9006 10
9988 rdf:_9016 10
9989 rdf:_9019 10
9990 rdf:_9023 10
9991 rdf:_9024 10
9992 rdf:_9038 10
9993 rdf:_9048 10
9994 rdf:_9061 10
9995 rdf:_9064 10
9996 rdf:_9070 10
9997 rdf:_9076 10
9998 rdf:_9080 10
9999 rdf:_9085 10

10000 rows × 2 columns

time: 1.01 s

By excluding the rdf:_# properties, we evade the limit and get a look at some of the less commonly used properties.

In [6]:
endpoint.select("""
   SELECT ?predicate (COUNT(*) AS ?count) {
       GRAPH <http://rdf.ontology2.com/xmp/xmpAll> { ?subject ?predicate ?object.}
       FILTER (!STRSTARTS(STR(?predicate),"http://www.w3.org/1999/02/22-rdf-syntax-ns#_"))
   } GROUP BY ?predicate ORDER BY DESC(?count)
""")
Out[6]:
predicate count
0 xapG:swatchName 279501
1 xapG:type 279501
2 xapG:mode 279501
3 xapG:black 249726
4 xapG:cyan 249726
5 xapG:magenta 249726
6 xapG:yellow 249726
7 stEvt:action 233430
8 rdf:type 165080
9 stEvt:when 144993
10 stEvt:instanceID 144142
11 stEvt:softwareAgent 141816
12 stEvt:changed 141216
13 stEvt:parameters 69279
14 o2:xmpEnd 56386
15 o2:file 54652
16 o2:xmpStart 54625
17 o2:packetNumber 54526
18 o2:fileLength 54439
19 o2:xmpSize 54337
20 o2:rwFlag 54303
21 xap:CreatorTool 51740
22 xapMM:InstanceID 50034
23 xapMM:DocumentID 49897
24 stRef:documentID 45477
... ... ...
928 pdfx:BFM_Month 1
929 Iptc4xmpCore:Scene 1
930 custom:Contact 1
931 custom:MSDNewsWebTitle 1
932 crs:AutoContrast 1
933 crs:RetouchInfo 1
934 exif:CFAPattern 1
935 exif:InteroperabilityIndex 1
936 exif:Padding 1
937 pdfx:NXTAG2 1
938 xapTPg:Colorants 1
939 mwg-rs:AppliedToDimensions 1
940 stArea:x 1
941 stArea:y 1
942 photomechanic:ColorClass 1
943 plus:ImageSupplierImageID 1
944 mwg-rs:Extensions 1
945 GettyImagesGIFT:CameraMakeModel 1
946 GettyImagesGIFT:RoutingDestinations 1
947 crs:Dehaze 1
948 crs:PerspectiveX 1
949 crs:UprightPreview 1
950 crs:UprightVersion 1
951 pdfx:Licensedↂ0020to 1
952 photoshop:Version 1

953 rows × 2 columns

time: 24.7 s

Looking at a Single Color Swatch

I'd like to look for example swatches, but I can't do that by writing

?swatch a xapG:Swatch

because swatches are not members of a class, however, we can find swatches by finding subjects that have an appropriate property.

In [7]:
endpoint.select("""
   SELECT ?subject {
       ?subject xapG:swatchName ?predicate
   } LIMIT 5
""")
Out[7]:
subject
0 nodeID://b477546
1 nodeID://b477547
2 nodeID://b477548
3 nodeID://b477562
4 nodeID://b477563
time: 14 ms

I can now put <nodeID://b10447> on the left hand side (LHS) of a triple to see what properties a swatch has:

In [8]:
endpoint.select("""
   SELECT ?predicate ?object {
       <nodeID://b10447> ?predicate ?object
   }
""")
Out[8]:
predicate object
0 xapG:blue 255
1 xapG:green 255
2 xapG:mode RGB
3 xapG:red 255
4 xapG:swatchName White
5 xapG:type PROCESS
time: 15 ms

Putting <nodeID://b10447> on the right hand side (RHS) of the triple and working to the left I can find what has this swatch as a property

In [9]:
endpoint.select("""
   SELECT ?subject ?predicate {
       ?subject ?predicate <nodeID://b10447> .
   }
""")
Out[9]:
subject predicate
0 nodeID://b10446 rdf:_1
time: 13 ms

The property is a member of a list, so I go to the left again:

In [10]:
endpoint.select("""
   SELECT ?subject ?predicate {
       ?subject ?predicate <nodeID://b10446> .
   }
""")
Out[10]:
subject predicate
0 nodeID://b10445 xapG:Colorants
time: 11 ms

and again...

In [11]:
endpoint.select("""
   SELECT ?subject ?predicate {
       ?subject ?predicate <nodeID://b10445> .
   }
""")
Out[11]:
subject predicate
0 nodeID://b10444 rdf:_1
time: 13 ms

Another list!

In [12]:
base=endpoint.select("""
   SELECT ?subject ?predicate {
       ?subject ?predicate <nodeID://b10444> .
   }
""")
base
Out[12]:
subject predicate
0 file:///C:/data/fatca/computing-solutions.pdf/... xapTPg:SwatchGroups
time: 12.5 ms

This gets to a non-blank node, meaning this is the root of the XMP packet. From the root, the path is

root -> xapTg:SwatchGroups -> rdf:_1 -> xapG:Colorants -> rdf_1 -> xapG:blue, xapG:green , etc.

At this point I use the peel operator to extract the complete XMP packet, which starts at the roots and crawls through blank nodes (ex. nodeId://b10444) to capture containers, nested properties, and such. This is a little RDF graph extracted from the big RDF graph stored in Virtuoso, and I print it out in the popular Turtle format, which most people find more readable than RDF/XML:

In [13]:
g=endpoint.peel(URIRef(base.at[0,'subject']))
time: 284 ms
In [14]:
ttl(g)
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix exif: <http://ns.adobe.com/exif/1.0/> .
@prefix illustrator: <http://ns.adobe.com/illustrator/1.0/> .
@prefix o2: <http://rdf.ontology2.com/metadata/> .
@prefix pdf: <http://ns.adobe.com/pdf/1.3/> .
@prefix photoshop: <http://ns.adobe.com/photoshop/1.0/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix stDim: <http://ns.adobe.com/xap/1.0/sType/Dimensions#> .
@prefix stEvt: <http://ns.adobe.com/xap/1.0/sType/ResourceEvent#> .
@prefix stFnt: <http://ns.adobe.com/xap/1.0/sType/Font#> .
@prefix stRef: <http://ns.adobe.com/xap/1.0/sType/ResourceRef#> .
@prefix tiff: <http://ns.adobe.com/tiff/1.0/> .
@prefix xap: <http://ns.adobe.com/xap/1.0/> .
@prefix xapG: <http://ns.adobe.com/xap/1.0/g/> .
@prefix xapMM: <http://ns.adobe.com/xap/1.0/mm/> .
@prefix xapTPg: <http://ns.adobe.com/xap/1.0/t/pg/> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xmp: <http://ns.adobe.com/xap/1.0/> .
@prefix xmpG: <http://ns.adobe.com/xap/1.0/g/> .
@prefix xmpMM: <http://ns.adobe.com/xap/1.0/mm/> .
@prefix xmpTPg: <http://ns.adobe.com/xap/1.0/t/pg/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .


<file:///C:/data/fatca/computing-solutions.pdf/0002w> exif:ColorSpace "65535" ;
    exif:NativeDigest "36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;488469DE26B259726A8DEC8014FEE6E9" ;
    exif:PixelXDimension "1638" ;
    exif:PixelYDimension "377" ;
    illustrator:Type "Document" ;
    pdf:Producer "Adobe PDF library 9.00" ;
    photoshop:ColorMode "1" ;
    tiff:NativeDigest "256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;4AF05B9DA751388E9A028E33BCE4C22E" ;
    tiff:Orientation "1" ;
    tiff:ResolutionUnit "2" ;
    tiff:XResolution "2160000/10000" ;
    tiff:YResolution "2160000/10000" ;
    xap:CreateDate "2011-10-12T12:01:59-07:00" ;
    xap:CreatorTool "Adobe Illustrator CS4" ;
    xap:MetadataDate "2011-10-12T14:14:44-07:00" ;
    xap:ModifyDate "2011-10-12T14:14:44-07:00" ;
    xapMM:DerivedFrom [ stRef:documentID "xmp.did:01801174072068119548DDC6497A9A9D" ;
            stRef:instanceID "uuid:2b5c115e-25c8-a748-8a29-40a64ac44da7" ;
            stRef:originalDocumentID "uuid:569dff8f-5bee-4d93-9d80-445dd7f98b15" ;
            stRef:renditionClass "proof:pdf" ] ;
    xapMM:DocumentID "xmp.did:F77F1174072068118977E22CDCB2E1AA" ;
    xapMM:History [ a rdf:Seq ;
            rdf:_1 [ stEvt:action "converted" ;
                    stEvt:parameters "from application/postscript to application/vnd.adobe.illustrator" ] ;
            rdf:_10 [ stEvt:action "derived" ;
                    stEvt:parameters "converted from application/vnd.adobe.photoshop to image/jpeg" ] ;
            rdf:_11 [ stEvt:action "saved" ;
                    stEvt:changed "/" ;
                    stEvt:instanceID "xmp.iid:F97F1174072068118977E22CDCB2E1AA" ;
                    stEvt:softwareAgent "Adobe Photoshop CS4 Macintosh" ;
                    stEvt:when "2011-10-12T12:05:42-07:00" ] ;
            rdf:_12 [ stEvt:action "saved" ;
                    stEvt:changed "/" ;
                    stEvt:instanceID "xmp.iid:FA7F1174072068118977E22CDCB2E1AA" ;
                    stEvt:softwareAgent "Adobe Photoshop CS4 Macintosh" ;
                    stEvt:when "2011-10-12T14:14:44-07:00" ] ;
            rdf:_2 [ stEvt:action "saved" ;
                    stEvt:changed "/" ;
                    stEvt:instanceID "xmp.iid:81F044F2846DDE11AAA483F5D4B88149" ;
                    stEvt:softwareAgent "Adobe Illustrator CS4" ;
                    stEvt:when "2009-07-10T12:07:43-07:00" ] ;
            rdf:_3 [ stEvt:action "saved" ;
                    stEvt:changed "/" ;
                    stEvt:instanceID "xmp.iid:A47B60CDCA62DF1182CB8965B222A5A6" ;
                    stEvt:softwareAgent "Adobe Illustrator CS4" ;
                    stEvt:when "2010-05-18T15:15:01-07:00" ] ;
            rdf:_4 [ stEvt:action "saved" ;
                    stEvt:changed "/" ;
                    stEvt:instanceID "xmp.iid:A57B60CDCA62DF1182CB8965B222A5A6" ;
                    stEvt:softwareAgent "Adobe Illustrator CS4" ;
                    stEvt:when "2010-05-18T15:15:35-07:00" ] ;
            rdf:_5 [ stEvt:action "saved" ;
                    stEvt:changed "/" ;
                    stEvt:instanceID "xmp.iid:635D702AB3C2DF11BBCDD67C8818C6DA" ;
                    stEvt:softwareAgent "Adobe Illustrator CS4" ;
                    stEvt:when "2010-09-17T16:27:41-07:00" ] ;
            rdf:_6 [ stEvt:action "saved" ;
                    stEvt:changed "/" ;
                    stEvt:instanceID "xmp.iid:763EF66490EFE011A25ADF7D28DDF38B" ;
                    stEvt:softwareAgent "Adobe Illustrator CS5" ;
                    stEvt:when "2011-10-05T13:27:06-07:00" ] ;
            rdf:_7 [ stEvt:action "converted" ;
                    stEvt:parameters "from application/postscript to application/vnd.adobe.illustrator" ] ;
            rdf:_8 [ stEvt:action "saved" ;
                    stEvt:changed "/" ;
                    stEvt:instanceID "xmp.iid:01801174072068119548DDC6497A9A9D" ;
                    stEvt:softwareAgent "Adobe Illustrator CS4" ;
                    stEvt:when "2011-10-12T12:01:45-07:00" ] ;
            rdf:_9 [ stEvt:action "converted" ;
                    stEvt:parameters "from application/pdf to application/vnd.adobe.photoshop" ] ] ;
    xapMM:InstanceID "xmp.iid:FA7F1174072068118977E22CDCB2E1AA" ;
    xapMM:OriginalDocumentID "uuid:569dff8f-5bee-4d93-9d80-445dd7f98b15" ;
    xapMM:RenditionClass "proof:pdf" ;
    xapTPg:Fonts [ a rdf:Bag ;
            rdf:_1 [ stFnt:composite "False" ;
                    stFnt:fontFace "Regular" ;
                    stFnt:fontFamily "Cisco" ;
                    stFnt:fontFileName "CiscoReg; Cisco-Regular.bmap" ;
                    stFnt:fontName "Cisco-Regular" ;
                    stFnt:fontType "Type 1" ;
                    stFnt:versionString "001.000" ] ;
            rdf:_2 [ stFnt:composite "False" ;
                    stFnt:fontFace "Light" ;
                    stFnt:fontFamily "Cisco" ;
                    stFnt:fontFileName "CiscoLig; Cisco-Light.bmap" ;
                    stFnt:fontName "Cisco-Light" ;
                    stFnt:fontType "Type 1" ;
                    stFnt:versionString "001.000" ] ] ;
    xapTPg:HasVisibleOverprint "False" ;
    xapTPg:HasVisibleTransparency "False" ;
    xapTPg:MaxPageSize [ stDim:h "11.000000" ;
            stDim:unit "Inches" ;
            stDim:w "8.500000" ] ;
    xapTPg:NPages "1" ;
    xapTPg:PlateNames [ a rdf:Seq ;
            rdf:_1 "Cyan" ;
            rdf:_2 "Magenta" ;
            rdf:_3 "Yellow" ;
            rdf:_4 "Black" ] ;
    xapTPg:SwatchGroups [ a rdf:Seq ;
            rdf:_1 [ xapG:Colorants [ a rdf:Seq ;
                            rdf:_1 [ xapG:blue "255" ;
                                    xapG:green "255" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "255" ;
                                    xapG:swatchName "White" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_10 [ xapG:blue "58" ;
                                    xapG:green "87" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "102" ;
                                    xapG:swatchName "Mocha" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_11 [ xapG:blue "36" ;
                                    xapG:green "33" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "130" ;
                                    xapG:swatchName "Mars Red" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_12 [ xapG:blue "49" ;
                                    xapG:green "43" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "165" ;
                                    xapG:swatchName "Ruby" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_13 [ xapG:blue "41" ;
                                    xapG:green "34" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "204" ;
                                    xapG:swatchName "Red" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_14 [ xapG:blue "44" ;
                                    xapG:green "101" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "213" ;
                                    xapG:swatchName "Pumpkin" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_15 [ xapG:blue "47" ;
                                    xapG:green "146" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "224" ;
                                    xapG:swatchName "Squash" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_16 [ xapG:blue "49" ;
                                    xapG:green "192" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "239" ;
                                    xapG:swatchName "Sunshine" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_17 [ xapG:blue "45" ;
                                    xapG:green "242" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "255" ;
                                    xapG:swatchName "Pure Yellow" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_18 [ xapG:blue "66" ;
                                    xapG:green "218" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "206" ;
                                    xapG:swatchName "Peridot" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_19 [ xapG:blue "77" ;
                                    xapG:green "197" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "159" ;
                                    xapG:swatchName "Little Sprout Green" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_2 [ xapG:blue "37" ;
                                    xapG:green "37" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "39" ;
                                    xapG:swatchName "Black" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_20 [ xapG:blue "61" ;
                                    xapG:green "156" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "124" ;
                                    xapG:swatchName "Jade" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_21 [ xapG:blue "67" ;
                                    xapG:green "143" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "87" ;
                                    xapG:swatchName "Mint Julep" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_22 [ xapG:blue "64" ;
                                    xapG:green "110" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "43" ;
                                    xapG:swatchName "Emerald" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_23 [ xapG:blue "112" ;
                                    xapG:green "112" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "33" ;
                                    xapG:swatchName "Sea Green" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_24 [ xapG:blue "173" ;
                                    xapG:green "140" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "28" ;
                                    xapG:swatchName "Caribbean Blue" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_25 [ xapG:blue "236" ;
                                    xapG:green "172" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "0" ;
                                    xapG:swatchName "Pure Cyan" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_26 [ xapG:blue "209" ;
                                    xapG:green "142" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "0" ;
                                    xapG:swatchName "Hawaiian Blue" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_27 [ xapG:blue "184" ;
                                    xapG:green "113" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "30" ;
                                    xapG:swatchName "Twillight Blue" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_28 [ xapG:blue "162" ;
                                    xapG:green "85" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "43" ;
                                    xapG:swatchName "Starry Night Blue" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_29 [ xapG:blue "142" ;
                                    xapG:green "52" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "51" ;
                                    xapG:swatchName "Deep Sea Blue" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_3 [ xapG:blue "102" ;
                                    xapG:green "100" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "99" ;
                                    xapG:swatchName "Charcoal" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_30 [ xapG:blue "162" ;
                                    xapG:green "88" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "90" ;
                                    xapG:swatchName "Fresh Lavender" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_31 [ xapG:blue "141" ;
                                    xapG:green "48" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "90" ;
                                    xapG:swatchName "Purple" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_32 [ xapG:blue "139" ;
                                    xapG:green "43" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "125" ;
                                    xapG:swatchName "Amethyst" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_33 [ xapG:blue "137" ;
                                    xapG:green "32" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "161" ;
                                    xapG:swatchName "Rasberry" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_34 [ xapG:blue "136" ;
                                    xapG:green "0" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "202" ;
                                    xapG:swatchName "Pure Magenta" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_35 [ xapG:blue "40" ;
                                    xapG:green "34" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "203" ;
                                    xapG:swatchName "Global Red" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_36 [ xapG:blue "46" ;
                                    xapG:green "146" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "223" ;
                                    xapG:swatchName "Global Squash" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_37 [ xapG:blue "45" ;
                                    xapG:green "241" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "255" ;
                                    xapG:swatchName "Global Pure Yellow" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_38 [ xapG:blue "83" ;
                                    xapG:green "175" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "100" ;
                                    xapG:swatchName "Global Green" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_39 [ xapG:blue "236" ;
                                    xapG:green "172" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "0" ;
                                    xapG:swatchName "Global Pure Cyan" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_4 [ xapG:blue "131" ;
                                    xapG:green "129" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "128" ;
                                    xapG:swatchName "Graphite" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_40 [ xapG:blue "142" ;
                                    xapG:green "51" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "50" ;
                                    xapG:swatchName "Global Deep Sea Blue" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_41 [ xapG:black "20.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "PANTONE 187 C" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "SPOT" ;
                                    xapG:yellow "79.000000" ] ;
                            rdf:_5 [ xapG:blue "160" ;
                                    xapG:green "158" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "156" ;
                                    xapG:swatchName "Ash" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_6 [ xapG:blue "191" ;
                                    xapG:green "188" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "187" ;
                                    xapG:swatchName "Smoke" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_7 [ xapG:blue "168" ;
                                    xapG:green "194" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "218" ;
                                    xapG:swatchName "Latte" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_8 [ xapG:blue "120" ;
                                    xapG:green "163" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "200" ;
                                    xapG:swatchName "Capuccino" ;
                                    xapG:type "PROCESS" ] ;
                            rdf:_9 [ xapG:blue "75" ;
                                    xapG:green "114" ;
                                    xapG:mode "RGB" ;
                                    xapG:red "140" ;
                                    xapG:swatchName "Mochaccino" ;
                                    xapG:type "PROCESS" ] ] ;
                    xapG:groupName "Default Swatch Group" ;
                    xapG:groupType "0" ] ] ;
    dc:format "image/jpeg" ;
    dc:title [ a rdf:Alt ;
            rdf:_1 "AddressTM_Block_1110R_RGB" ] ;
    o2:file "C:/data/fatca/computing-solutions.pdf" ;
    o2:fileLength 804396 ;
    o2:packetNumber 2 ;
    o2:rwFlag "w" ;
    o2:xmpEnd 606725 ;
    o2:xmpSize 12987 ;
    o2:xmpStart 593738 .


time: 154 ms

This packet has 431 facts:

In [15]:
len(g)
Out[15]:
431
time: 3 ms

There are many interesting things to see in the above packet, such as history and a font list, but I will stay on track with the color swatches. The color swatches in the above packet at organized in a single group, which we can visualize (_ignoring, for the moment, the single "SPOT" color which is CYMK instead of RGB; I'll show an example of CYMK swatches later.)

First I'll show the first five swatches...

In [16]:
s1=endpoint.select("""
   SELECT ?swatchName ?red ?green ?blue {
       <nodeID://b10446> ?any ?swatch .
       ?swatch xapG:swatchName ?swatchName .
       ?swatch xapG:type "PROCESS" .
       OPTIONAL { ?swatch xapG:red ?red }
       OPTIONAL { ?swatch xapG:blue ?blue }
       OPTIONAL { ?swatch xapG:green ?green }
   }
""")
s1.head()
Out[16]:
swatchName red green blue
0 White 255 255 255
1 Mocha 102 87 58
2 Mars Red 130 33 36
3 Ruby 165 43 49
4 Red 204 34 41
time: 30 ms

Then convert numbers to color codes for cascading style sheets:

In [17]:
def colorcode(frame):
    frame["code"]=list(map(lambda x: "rgb(%d,%d,%d)" % x,zip(
        round(frame["red"]),
        round(frame["green"]),
        round(frame["blue"]))))
    return frame
    
colorcode(s1).head()
Out[17]:
swatchName red green blue code
0 White 255 255 255 rgb(255,255,255)
1 Mocha 102 87 58 rgb(102,87,58)
2 Mars Red 130 33 36 rgb(130,33,36)
3 Ruby 165 43 49 rgb(165,43,49)
4 Red 204 34 41 rgb(204,34,41)
time: 15 ms

At which point it is straightforward to write a custom formatter that displays the color:

In [18]:
pd.options.display.max_colwidth=0
colorblock=lambda code: "<div style='height:20px; width:100px; background: %s; border: 1px solid black'></div>" % (code,)
display_html(s1.to_html(formatters=[None,None,None,None,colorblock],escape=False),raw=True)
swatchName red green blue code
0 White 255 255 255
1 Mocha 102 87 58
2 Mars Red 130 33 36
3 Ruby 165 43 49
4 Red 204 34 41
5 Pumpkin 213 101 44
6 Squash 224 146 47
7 Sunshine 239 192 49
8 Pure Yellow 255 242 45
9 Peridot 206 218 66
10 Little Sprout Green 159 197 77
11 Black 39 37 37
12 Jade 124 156 61
13 Mint Julep 87 143 67
14 Emerald 43 110 64
15 Sea Green 33 112 112
16 Caribbean Blue 28 140 173
17 Pure Cyan 0 172 236
18 Hawaiian Blue 0 142 209
19 Twillight Blue 30 113 184
20 Starry Night Blue 43 85 162
21 Deep Sea Blue 51 52 142
22 Charcoal 99 100 102
23 Fresh Lavender 90 88 162
24 Purple 90 48 141
25 Amethyst 125 43 139
26 Rasberry 161 32 137
27 Pure Magenta 202 0 136
28 Global Red 203 34 40
29 Global Squash 223 146 46
30 Global Pure Yellow 255 241 45
31 Global Green 100 175 83
32 Global Pure Cyan 0 172 236
33 Graphite 128 129 131
34 Global Deep Sea Blue 50 51 142
35 Ash 156 158 160
36 Smoke 187 188 191
37 Latte 218 194 168
38 Capuccino 200 163 120
39 Mochaccino 140 114 75
time: 16 ms

Statistics of Color Swatches

A good way to research how properties are used is to group on and count the values. As described in Part 2 of the XMP Specification there are four color spaces which can be used to specify swatches:

Note CMYK is a specification of dyes used to print colors on paper, GRAY is grayscale, RGB is the common additive color specification used on computer screens, and LAB separates the luminance (brightness) from hue and saturation.

In [19]:
endpoint.select("""
   SELECT ?object (COUNT(*) AS ?count) {
    ?subject xapG:mode ?object.
   } GROUP BY ?object ORDER BY DESC(?count)
""")
Out[19]:
object count
0 CMYK 249726
1 GRAY 24442
2 RGB 4834
3 LAB 499
time: 36 ms

Color swatches can be Process colors (created by combining a number of dyes or light colors) or Spot colors (a specific color created with a particular dye.) Process colors are much more popular today because they don't require any thinking on the part of the artist or printer, but in the past Spot colors were commonly used to save money by having fewer printing plates. (I think of Scientific American illustrations from 1970s) Spot colors are also effective because they can produce artistic and distinctive effects as opposed to Spot color.

In terms of data, note that a handful of swatches are defined with a non-standard version of the word "PROCESS"; this is a frequent occurence in most large data sets, although RDF contributes to the problem by having been slow to develop a standard for validation. (17 years from the beginning of RDF, SHACL is still only a proposed reccomendation.)

In [20]:
endpoint.select("""
   SELECT ?object (COUNT(*) AS ?count) {
    ?subject xapG:type ?object.
   } GROUP BY ?object ORDER BY DESC(?count)
""")
Out[20]:
object count
0 PROCESS 278748
1 SPOT 750
2 Process 3
time: 27.5 ms

Here are some common color names:

In [21]:
endpoint.select("""
   SELECT ?object (COUNT(*) AS ?count) {
    ?subject xapG:swatchName ?object.
   } GROUP BY ?object ORDER BY DESC(?count)
""")
Out[21]:
object count
0 White 5702
1 Black 5677
2 C=15 M=100 Y=90 K=10 3940
3 C=90 M=30 Y=95 K=30 3923
4 C=20 M=0 Y=100 K=0 3921
5 C=75 M=0 Y=75 K=0 3921
6 C=80 M=10 Y=45 K=0 3919
7 C=50 M=100 Y=0 K=0 3916
8 C=0 M=50 Y=100 K=0 3916
9 C=50 M=0 Y=100 K=0 3915
10 C=70 M=15 Y=0 K=0 3915
11 C=85 M=50 Y=0 K=0 3915
12 C=75 M=0 Y=100 K=0 3915
13 C=25 M=25 Y=40 K=0 3915
14 C=5 M=0 Y=90 K=0 3914
15 C=10 M=100 Y=50 K=0 3914
16 C=0 M=95 Y=20 K=0 3914
17 C=50 M=50 Y=60 K=25 3914
18 C=30 M=50 Y=75 K=10 3914
19 C=40 M=70 Y=100 K=50 3914
20 C=0 M=90 Y=85 K=0 3914
21 C=100 M=100 Y=25 K=25 3914
22 C=40 M=45 Y=50 K=5 3914
23 C=55 M=60 Y=65 K=40 3914
24 C=0 M=80 Y=95 K=0 3914
... ... ...
2623 MDA Green light boxes 2 copy 1
2624 Tan Box light 1
2625 Summary Blue Dk 1
2626 Summary Blue Dk copy 1
2627 MDA Green light 1
2628 Dark blue 1
2629 C=55 M=49 Y=0 K=0 1
2630 C=54 M=79 Y=38 K=18 1
2631 Global Blue 1
2632 C=14 M=78 Y=62 K=3 1
2633 Dark yellow 1
2634 Light yellow 1
2635 Medium brown 1
2636 Baby Pink 1
2637 MDABarBlue 1
2638 C=69 M=35 Y=74 K=18 1
2639 Slate 1
2640 Global Yellow 1
2641 C=0 M=0 Y=0 K=20 1 1
2642 PANTONE 529 C 1
2643 C=80 M=36 Y=45 K=8 1
2644 Bars Color 1
2645 Dark brown 1
2646 new blue 1
2647 Global Periwinkle 1

2648 rows × 2 columns

time: 157 ms

These are dominated by uninteresting names derived from the color numbers; filtering most of these out, I find that colors like the middle-of-the-road blue PANTONE 300 C are popular

In [22]:
endpoint.select("""
   SELECT ?object (COUNT(*) AS ?count) {
    ?subject xapG:swatchName ?object.
    FILTER(!CONTAINS(?object,"="))
   } GROUP BY ?object ORDER BY DESC(?count)
""")
Out[22]:
object count
0 White 5702
1 Black 5677
2 CMYK Magenta 3892
3 CMYK Cyan 3861
4 CMYK Blue 3860
5 CMYK Green 3860
6 CMYK Yellow 3860
7 CMYK Red 3835
8 DotLight 1954
9 DotDark 1954
10 MDABarBlueMed 1725
11 MDABarBlueLight 1721
12 Bar-DarkBlueSide 2 1703
13 PANTONE 300 C 1128
14 PANTONE 355 C 1076
15 PANTONE 376 C 1065
16 PANTONE 428 C 930
17 PANTONE 432 C 837
18 PANTONE 319 C 832
19 PANTONE 342 C 828
20 PANTONE 541 C 799
21 PANTONE 320 C 773
22 PANTONE 298 C 745
23 PANTONE 424 C 671
24 PANTONE 144 C 623
... ... ...
1631 006666 0,102,102 1
1632 0000FF 0,0,255 1
1633 000033 0,0,51 1
1634 FFCC33 255,204,51 1
1635 FFCC66 255,204,102 1
1636 3300CC 51,0,204 1
1637 0066FF 0,102,255 1
1638 0033FF 0,51,255 1
1639 CC3300 204,51,0 1
1640 666600 102,102,0 1
1641 999900 153,153,0 1
1642 CCCC00 204,204,0 1
1643 660000 102,0,0 1
1644 CC0000 204,0,0 1
1645 99FF00 153,255,0 1
1646 FFFF33 255,255,51 1
1647 993333 153,51,51 1
1648 FF3333 255,51,51 1
1649 CC3366 204,51,102 1
1650 FFCC00 255,204,0 1
1651 FFFF66 255,255,102 1
1652 663300 102,51,0 1
1653 996666 153,102,102 1
1654 66FF33 102,255,51 1
1655 339900 51,153,0 1

1656 rows × 2 columns

time: 248 ms

Files with a large number of swatch groups

In the example above there was just one group of swatches, but what about cases where there are a large number of color swatches? The query below finds the documents which have the largest number of swatch groups. Simply, the query below implements a count of how many members are in the xapTg:SwatchGroups list. The list looks like

:Groups a rdf:Seq ;
   rdf:_1 "First Member" .
   rdf:_2 "Second Member" .
   rdf:_3 "Third Member" .
   ...

Assuming a collection is well formed, the length of the list is the number of rdf:_# properties that list has, which we can calculate like so, so long as the list has only rdf:_# and rdf:type properties:

In [23]:
many_groups=endpoint.select("""
   SELECT ?packet (COUNT(*) AS ?count) {
    ?packet xapTPg:SwatchGroups ?group .
    ?group ?grouppred ?member .
    FILTER (?grouppred!=rdf:type)
   } GROUP BY ?packet ORDER BY DESC(?count) LIMIT 10
""")
many_groups
Out[23]:
packet count
0 file:///C:/Program%2520Files/Adobe/Adobe%2520Illustrator%2520CC%25202017/Scripting/Sample%2520Scripts/Visual%2520Basic/Sierpinski/Sample.ai/0001w 5
1 file:///C:/My%2520Web%2520Sites/Black%2520Rock/www.blackrock.com/investing/literature/whitepaper/to-versus-through-whitepaper.pdf/0004r 4
2 file:///C:/Users/paul_000/Desktop/Old%2520Desktop/Video/Lessons/Lesson%252004/Illustrator%2520Image.ai/0001w 4
3 file:///C:/Users/paul_000/cftc/cftc/www.cftc.gov/idc/groups/public/%40aboutcftc/documents/file/2010spfi.pdf/0328r 3
4 file:///C:/Users/paul_000/cftc/cftc/www.cftc.gov/idc/groups/public/%40aboutcftc/documents/file/2011afr.pdf/0033r 3
5 file:///C:/Users/paul_000/cftc/cftc/www.cftc.gov/idc/groups/public/%40aboutcftc/documents/file/2011afr.pdf/0067r 3
6 file:///C:/Users/paul_000/cftc/cftc/www.cftc.gov/idc/groups/public/%40aboutcftc/documents/file/2011afr.pdf/0081r 3
7 file:///C:/Users/paul_000/cftc/cftc/www.cftc.gov/idc/groups/public/%40aboutcftc/documents/file/2011afr.pdf/0177r 3
8 file:///C:/Users/paul_000/cftc/cftc/www.cftc.gov/idc/groups/public/%40aboutcftc/documents/file/2011afr.pdf/0229r 3
9 file:///C:/Users/paul_000/cftc/cftc/www.cftc.gov/idc/groups/public/%40aboutcftc/documents/file/2011afr.pdf/0235r 3
time: 31 ms

We can pull out the name of the packet...

In [24]:
many_groups.at[0,'packet']
Out[24]:
'file:///C:/Program%2520Files/Adobe/Adobe%2520Illustrator%2520CC%25202017/Scripting/Sample%2520Scripts/Visual%2520Basic/Sierpinski/Sample.ai/0001w'
time: 3.5 ms

At the risk of making you scroll down a lot, I'll show you the whole graph contained in this packet. One reason why this packet is so long is that it contains an embedded thumbnail image, so I will show you that image as a reward for scrolling:

In [25]:
g=endpoint.peel(URIRef(many_groups.at[0,'packet']))
ttl(g)
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix illustrator: <http://ns.adobe.com/illustrator/1.0/> .
@prefix o2: <http://rdf.ontology2.com/metadata/> .
@prefix pdf: <http://ns.adobe.com/pdf/1.3/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix stDim: <http://ns.adobe.com/xap/1.0/sType/Dimensions#> .
@prefix stRef: <http://ns.adobe.com/xap/1.0/sType/ResourceRef#> .
@prefix xap: <http://ns.adobe.com/xap/1.0/> .
@prefix xapG: <http://ns.adobe.com/xap/1.0/g/> .
@prefix xapGImg: <http://ns.adobe.com/xap/1.0/g/img/> .
@prefix xapMM: <http://ns.adobe.com/xap/1.0/mm/> .
@prefix xapTPg: <http://ns.adobe.com/xap/1.0/t/pg/> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xmp: <http://ns.adobe.com/xap/1.0/> .
@prefix xmpG: <http://ns.adobe.com/xap/1.0/g/> .
@prefix xmpGImg: <http://ns.adobe.com/xap/1.0/g/img/> .
@prefix xmpMM: <http://ns.adobe.com/xap/1.0/mm/> .
@prefix xmpTPg: <http://ns.adobe.com/xap/1.0/t/pg/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .


<file:///C:/Program%2520Files/Adobe/Adobe%2520Illustrator%2520CC%25202017/Scripting/Sample%2520Scripts/Visual%2520Basic/Sierpinski/Sample.ai/0001w> illustrator:StartupProfile "Basic CMYK" ;
    illustrator:Type "Document" ;
    pdf:Producer "Adobe PDF library 8.00" ;
    xap:CreateDate "2007-01-03T15:18:53+01:00" ;
    xap:CreatorTool "Adobe Illustrator CS3" ;
    xap:MetadataDate "2007-01-03T15:18:53Z" ;
    xap:ModifyDate "2007-01-03T15:18:53Z" ;
    xap:Thumbnails [ a rdf:Alt ;
            rdf:_1 [ xmpGImg:format "JPEG" ;
                    xmpGImg:height "256" ;
                    xmpGImg:image """/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7b5E8ieR7nyP5euLjy9p
k1xNplnJNNJZ27O7tboWZmKEkkmpJxVN/IVnaWem6haWcEdtaw6pfJDbwqI40X122VFAAHyxVCXH
l3y/rH5gaodX0y01EwaTpno/W4I5+HO51Dlx9RW414itMVa/w15d0fztokmk6VZ6dJNbX6yvaW8U
BdR6JAYxqtRXxxVmOKuxV2KsG8oeSvJt9oa3d7oOnXV3Nc3jTXE1pBJI7fW5d2dkLE/PFUx8k6dp
+m3/AJps9OtYbO0j1aP07a3jWKNeWl2LNxRAFFSSTiqlrWh6Jq/nqzi1bT7bUYotLuHiju4Y51Vj
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""" ;
                    xmpGImg:width "256" ] ] ;
    xapMM:DerivedFrom [ stRef:documentID "uuid:190E6B744463DB11BF10CEB5781F844F" ;
            stRef:instanceID "uuid:cef3a7f4-4d36-4d0e-a887-c40b41d08fe9" ] ;
    xapMM:DocumentID "uuid:82E0A4B33D9BDB1193A9ECEE3C984797" ;
    xapMM:InstanceID "uuid:d56a94cc-1e76-4a6a-9566-29f962b3452f" ;
    xapTPg:HasVisibleOverprint "False" ;
    xapTPg:HasVisibleTransparency "False" ;
    xapTPg:MaxPageSize [ stDim:h "792.000000" ;
            stDim:unit "Points" ;
            stDim:w "612.000000" ] ;
    xapTPg:NPages "1" ;
    xapTPg:PlateNames [ a rdf:Seq ;
            rdf:_1 "Black" ] ;
    xapTPg:SwatchGroups [ a rdf:Seq ;
            rdf:_1 [ xapG:Colorants [ a rdf:Seq ;
                            rdf:_1 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "White" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_10 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "75.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Pumpkin" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_11 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "50.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Squash" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_12 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "25.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Sunshine" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_13 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Pure Yellow" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_14 [ xapG:black "0.000000" ;
                                    xapG:cyan "25.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Peridot" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_15 [ xapG:black "0.000000" ;
                                    xapG:cyan "50.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Little Sprout Green" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_16 [ xapG:black "25.000000" ;
                                    xapG:cyan "50.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Jade" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_17 [ xapG:black "25.000000" ;
                                    xapG:cyan "75.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Mint Julep" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_18 [ xapG:black "25.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "25.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Emerald" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_19 [ xapG:black "25.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "25.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Sea Green" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "50.000000" ] ;
                            rdf:_2 [ xapG:black "100.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Black" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_20 [ xapG:black "0.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "25.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Caribbean Blue" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "25.000000" ] ;
                            rdf:_21 [ xapG:black "0.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Pure Cyan" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_22 [ xapG:black "0.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "25.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Hawaiian Blue" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_23 [ xapG:black "0.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "50.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Twillight Blue" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_24 [ xapG:black "0.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "75.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Starry Night Blue" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_25 [ xapG:black "0.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Deep Sea Blue" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_26 [ xapG:black "0.000000" ;
                                    xapG:cyan "75.000000" ;
                                    xapG:magenta "75.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Fresh Lavender" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_27 [ xapG:black "0.000000" ;
                                    xapG:cyan "75.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Purple" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_28 [ xapG:black "0.000000" ;
                                    xapG:cyan "50.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Amethyst" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_29 [ xapG:black "0.000000" ;
                                    xapG:cyan "25.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Rasberry" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_3 [ xapG:black "0.000000" ;
                                    xapG:cyan "10.000002" ;
                                    xapG:magenta "23.000002" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Latte" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "32.999998" ] ;
                            rdf:_30 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Pure Magenta" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_31 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Global Red" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_32 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "50.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Global Squash" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_33 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Global Pure Yellow" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_34 [ xapG:black "0.000000" ;
                                    xapG:cyan "80.000001" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Global Green" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_35 [ xapG:black "0.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Global Pure Cyan" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_36 [ xapG:black "0.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Global Deep Sea Blue" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_37 [ xapG:black "0.000000" ;
                                    xapG:cyan "4.705900" ;
                                    xapG:magenta "49.803901" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Global Orange" ;
                                    xapG:tint "100.000000" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "90.196097" ] ;
                            rdf:_4 [ xapG:black "0.000000" ;
                                    xapG:cyan "15.999997" ;
                                    xapG:magenta "37.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Capuccino" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "57.999998" ] ;
                            rdf:_5 [ xapG:black "19.999999" ;
                                    xapG:cyan "31.999999" ;
                                    xapG:magenta "48.000002" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Mochaccino" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "75.999999" ] ;
                            rdf:_6 [ xapG:black "38.000000" ;
                                    xapG:cyan "42.999995" ;
                                    xapG:magenta "51.999998" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Mocha" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "80.000001" ] ;
                            rdf:_7 [ xapG:black "25.000000" ;
                                    xapG:cyan "25.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Mars Red" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_8 [ xapG:black "0.000000" ;
                                    xapG:cyan "25.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Ruby" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_9 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "Red" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ] ;
                    xapG:groupName "Default Swatch Group" ;
                    xapG:groupType "0" ] ;
            rdf:_2 [ xapG:Colorants [ a rdf:Seq ;
                            rdf:_1 [ xapG:black "0.000000" ;
                                    xapG:cyan "47.000003" ;
                                    xapG:magenta "69.999999" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=47 M=70 Y=83 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "82.999998" ] ;
                            rdf:_2 [ xapG:black "0.000000" ;
                                    xapG:cyan "7.999998" ;
                                    xapG:magenta "15.999997" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=8 M=16 Y=62 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "62.000000" ] ;
                            rdf:_3 [ xapG:black "55.000001" ;
                                    xapG:cyan "13.000000" ;
                                    xapG:magenta "38.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=13 M=38 Y=71 K=55" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "70.714301" ] ;
                            rdf:_4 [ xapG:black "24.000001" ;
                                    xapG:cyan "50.000000" ;
                                    xapG:magenta "39.999998" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=50 M=40 Y=80 K=24" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "80.000001" ] ;
                            rdf:_5 [ xapG:black "25.999999" ;
                                    xapG:cyan "6.000000" ;
                                    xapG:magenta "69.999999" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=6 M=70 Y=76 K=26" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "75.999999" ] ;
                            rdf:_6 [ xapG:black "35.000002" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "32.999998" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=33 Y=100 K=35" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ] ;
                    xapG:groupName "Earthtone" ;
                    xapG:groupType "1" ] ;
            rdf:_3 [ xapG:Colorants [ a rdf:Seq ;
                            rdf:_1 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "13.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=13 Y=0 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_2 [ xapG:black "0.000000" ;
                                    xapG:cyan "23.692298" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=24 M=0 Y=8 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "8.461499" ] ;
                            rdf:_3 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=31 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "31.000000" ] ;
                            rdf:_4 [ xapG:black "0.000000" ;
                                    xapG:cyan "12.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=12 M=0 Y=30 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "30.000001" ] ;
                            rdf:_5 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "7.999998" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=8 Y=18 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "18.000001" ] ] ;
                    xapG:groupName "Soft" ;
                    xapG:groupType "1" ] ;
            rdf:_4 [ xapG:Colorants [ a rdf:Seq ;
                            rdf:_1 [ xapG:black "0.000000" ;
                                    xapG:cyan "100.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=100 M=0 Y=20 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "19.999999" ] ;
                            rdf:_2 [ xapG:black "0.000000" ;
                                    xapG:cyan "35.000002" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=35 M=0 Y=100 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "100.000000" ] ;
                            rdf:_3 [ xapG:black "0.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "100.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=100 Y=40 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "39.999998" ] ;
                            rdf:_4 [ xapG:black "0.000000" ;
                                    xapG:cyan "35.000002" ;
                                    xapG:magenta "84.999996" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=35 M=85 Y=0 K=0" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ] ;
                    xapG:groupName "Bright" ;
                    xapG:groupType "1" ] ;
            rdf:_5 [ xapG:Colorants [ a rdf:Seq ;
                            rdf:_1 [ xapG:black "100.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=100" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_10 [ xapG:black "10.000002" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=10" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_11 [ xapG:black "5.000001" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=5" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_2 [ xapG:black "90.000004" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=90" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_3 [ xapG:black "80.000001" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=80" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_4 [ xapG:black "69.999999" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=70" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_5 [ xapG:black "60.000002" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=60" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_6 [ xapG:black "50.000000" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=50" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_7 [ xapG:black "39.999998" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=40" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_8 [ xapG:black "30.000001" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=30" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ;
                            rdf:_9 [ xapG:black "19.999999" ;
                                    xapG:cyan "0.000000" ;
                                    xapG:magenta "0.000000" ;
                                    xapG:mode "CMYK" ;
                                    xapG:swatchName "C=0 M=0 Y=0 K=20" ;
                                    xapG:type "PROCESS" ;
                                    xapG:yellow "0.000000" ] ] ;
                    xapG:groupName "Grayscale" ;
                    xapG:groupType "1" ] ] ;
    dc:format "application/pdf" ;
    dc:title [ a rdf:Alt ;
            rdf:_1 "Sample" ] ;
    o2:file "C:/Program%20Files/Adobe/Adobe%20Illustrator%20CC%202017/Scripting/Sample%20Scripts/Visual%20Basic/Sierpinski/Sample.ai" ;
    o2:fileLength 111598 ;
    o2:packetNumber 1 ;
    o2:rwFlag "w" ;
    o2:xmpEnd 62862 ;
    o2:xmpSize 62654 ;
    o2:xmpStart 208 .


time: 504 ms

Thumbnails!

For all of that, the least I can do is show you the thumbnail. To do that, I am going to use the rdflib Graph object that is stored in the g variable (which just contains facts from the packet) as opposed to writing a SPARQL query against the big graph in Virtuoso which holds all of the packets.

The first step I to take is import some functions and then create rdflib Namespace objects for libraries, because once I have the namespace objects, it is very easy to write the names either as

xap.Thumbnails

or

xap['Thumbnails']

In [26]:
def getNS(graph,name):
    return Namespace(list(filter(lambda x:x[0]==name,graph.namespaces()))[0][1])
xap=getNS(g,"xap")
xapG=getNS(g,"xapG")
xapGImg=getNS(g,"xapGImg")
time: 3 ms

There is an RDF Namespace in the object which would let you write RDF.Seq or RDF.Bag but you cannot use it to write RDF._1 or RDF._2 because RDF is a ClosedNamespace which only resolves names from a short list. This protects you from using an invalid namespace/name combination, but for that reason I wrote a function that looks up the list member predicate for a given number.

While I am at it, I'll add one to the index so that member(0) is the first element of the list, just as it would be in an ordinary Python list.

In [27]:
def member(index):
    return URIRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#_"+str(index+1))
time: 6.99 ms

The rdflib Graph uses Python slicing in an unusual way:

g[?s:?p:?o]

allows slicing over the triples that have a particular combination of subject, predicate and object. With that, the declared namespaces, and the member() functions I can get the base64-encoded thumbnail, decode it and display it.

In [28]:
thumblist=list(g[:xap.Thumbnails:])[0][1]
thumb=list(g[thumblist:member(0):])[0]
thumbData=b64decode(list(g[thumb:xapGImg.image:])[0].toPython())
display_jpeg(thumbData,raw=True)
time: 17 ms

Nice Fractal! Note that this is a monochrome image so that the color swatches don't tell us anything about the image itself. The XMP specification, however, was meant to satisfy Adobe's needs for it's suite of media handling tools, and swatch groups are useful for artists to keep track of what colors are being used on a project that involves a number of different tools.

Color Swatches from the Fractal Document

That said, I'll draw the color swatches attached to this document. The first step is to find which predicates are in use for this set of color swatches:

In [29]:
swatch_predicates=endpoint.select("""
   SELECT DISTINCT ?predicate {
    ?packet xapTPg:SwatchGroups ?groups .
    ?groups ?grouppred ?group .
    ?group xapG:Colorants ?colorants .
    ?colorants ?colorpred ?swatch .
    ?swatch ?predicate ?value
   } 
""",bindings={"packet": URIRef(many_groups.at[0,'packet'])})
swatch_predicates
Out[29]:
predicate
0 xapG:black
1 xapG:cyan
2 xapG:magenta
3 xapG:mode
4 xapG:swatchName
5 xapG:tint
6 xapG:type
7 xapG:yellow
time: 17 ms

I next write a query which returns one row per color. A key thing to note in this query is the use of the OPTIONAL clause, which will match whether or not the pattern inside it matches. It is important in this case because, most of the time, the xapG:tint property is not set -- if I didn't use an optional pattern here, only the first seven rows would be returned.

In [30]:
pd.options.display.max_rows = 100
swatch_colors=endpoint.select("""
   SELECT ?groupName ?swatchName ?cyan ?magenta ?yellow ?black ?tint {
    ?packet xapTPg:SwatchGroups ?groups .
    ?groups ?grouppred ?group .
    ?group xapG:Colorants ?colorants .
    ?colorants ?colorpred ?swatch .
    ?group xapG:groupName ?groupName
    FILTER (?colorpred!=rdf:type)
    OPTIONAL { ?swatch xapG:black ?black}
    OPTIONAL { ?swatch xapG:cyan ?cyan }
    OPTIONAL { ?swatch xapG:mode ?mode }
    OPTIONAL { ?swatch xapG:magenta ?magenta}
    OPTIONAL { ?swatch xapG:swatchName ?swatchName}
    OPTIONAL { ?swatch xapG:tint ?tint}
    OPTIONAL { ?swatch xapG:type ?type}
    OPTIONAL { ?swatch xapG:yellow ?yellow}
   } 
""",bindings={"packet": URIRef(many_groups.at[0,'packet'])})
swatch_colors
Out[30]:
groupName swatchName cyan magenta yellow black tint
0 Default Swatch Group Global Red 0.000000 100.000000 100.000000 0.000000 100.000000
1 Default Swatch Group Global Squash 0.000000 50.000000 100.000000 0.000000 100.000000
2 Default Swatch Group Global Pure Yellow 0.000000 0.000000 100.000000 0.000000 100.000000
3 Default Swatch Group Global Green 80.000001 0.000000 100.000000 0.000000 100.000000
4 Default Swatch Group Global Pure Cyan 100.000000 0.000000 0.000000 0.000000 100.000000
5 Default Swatch Group Global Deep Sea Blue 100.000000 100.000000 0.000000 0.000000 100.000000
6 Default Swatch Group Global Orange 4.705900 49.803901 90.196097 0.000000 100.000000
7 Default Swatch Group White 0.000000 0.000000 0.000000 0.000000 None
8 Default Swatch Group Pumpkin 0.000000 75.000000 100.000000 0.000000 None
9 Default Swatch Group Squash 0.000000 50.000000 100.000000 0.000000 None
10 Default Swatch Group Sunshine 0.000000 25.000000 100.000000 0.000000 None
11 Default Swatch Group Pure Yellow 0.000000 0.000000 100.000000 0.000000 None
12 Default Swatch Group Peridot 25.000000 0.000000 100.000000 0.000000 None
13 Default Swatch Group Little Sprout Green 50.000000 0.000000 100.000000 0.000000 None
14 Default Swatch Group Jade 50.000000 0.000000 100.000000 25.000000 None
15 Default Swatch Group Mint Julep 75.000000 0.000000 100.000000 25.000000 None
16 Default Swatch Group Emerald 100.000000 25.000000 100.000000 25.000000 None
17 Default Swatch Group Sea Green 100.000000 25.000000 50.000000 25.000000 None
18 Default Swatch Group Black 0.000000 0.000000 0.000000 100.000000 None
19 Default Swatch Group Caribbean Blue 100.000000 25.000000 25.000000 0.000000 None
20 Default Swatch Group Pure Cyan 100.000000 0.000000 0.000000 0.000000 None
21 Default Swatch Group Hawaiian Blue 100.000000 25.000000 0.000000 0.000000 None
22 Default Swatch Group Twillight Blue 100.000000 50.000000 0.000000 0.000000 None
23 Default Swatch Group Starry Night Blue 100.000000 75.000000 0.000000 0.000000 None
24 Default Swatch Group Deep Sea Blue 100.000000 100.000000 0.000000 0.000000 None
25 Default Swatch Group Fresh Lavender 75.000000 75.000000 0.000000 0.000000 None
26 Default Swatch Group Purple 75.000000 100.000000 0.000000 0.000000 None
27 Default Swatch Group Amethyst 50.000000 100.000000 0.000000 0.000000 None
28 Default Swatch Group Rasberry 25.000000 100.000000 0.000000 0.000000 None
29 Default Swatch Group Latte 10.000002 23.000002 32.999998 0.000000 None
30 Default Swatch Group Pure Magenta 0.000000 100.000000 0.000000 0.000000 None
31 Default Swatch Group Capuccino 15.999997 37.000000 57.999998 0.000000 None
32 Default Swatch Group Mochaccino 31.999999 48.000002 75.999999 19.999999 None
33 Default Swatch Group Mocha 42.999995 51.999998 80.000001 38.000000 None
34 Default Swatch Group Mars Red 25.000000 100.000000 100.000000 25.000000 None
35 Default Swatch Group Ruby 25.000000 100.000000 100.000000 0.000000 None
36 Default Swatch Group Red 0.000000 100.000000 100.000000 0.000000 None
37 Earthtone C=47 M=70 Y=83 K=0 47.000003 69.999999 82.999998 0.000000 None
38 Earthtone C=8 M=16 Y=62 K=0 7.999998 15.999997 62.000000 0.000000 None
39 Earthtone C=13 M=38 Y=71 K=55 13.000000 38.000000 70.714301 55.000001 None
40 Earthtone C=50 M=40 Y=80 K=24 50.000000 39.999998 80.000001 24.000001 None
41 Earthtone C=6 M=70 Y=76 K=26 6.000000 69.999999 75.999999 25.999999 None
42 Earthtone C=0 M=33 Y=100 K=35 0.000000 32.999998 100.000000 35.000002 None
43 Soft C=0 M=13 Y=0 K=0 0.000000 13.000000 0.000000 0.000000 None
44 Soft C=24 M=0 Y=8 K=0 23.692298 0.000000 8.461499 0.000000 None
45 Soft C=0 M=0 Y=31 K=0 0.000000 0.000000 31.000000 0.000000 None
46 Soft C=12 M=0 Y=30 K=0 12.000000 0.000000 30.000001 0.000000 None
47 Soft C=0 M=8 Y=18 K=0 0.000000 7.999998 18.000001 0.000000 None
48 Bright C=100 M=0 Y=20 K=0 100.000000 0.000000 19.999999 0.000000 None
49 Bright C=35 M=0 Y=100 K=0 35.000002 0.000000 100.000000 0.000000 None
50 Bright C=0 M=100 Y=40 K=0 0.000000 100.000000 39.999998 0.000000 None
51 Bright C=35 M=85 Y=0 K=0 35.000002 84.999996 0.000000 0.000000 None
52 Grayscale C=0 M=0 Y=0 K=100 0.000000 0.000000 0.000000 100.000000 None
53 Grayscale C=0 M=0 Y=0 K=10 0.000000 0.000000 0.000000 10.000002 None
54 Grayscale C=0 M=0 Y=0 K=5 0.000000 0.000000 0.000000 5.000001 None
55 Grayscale C=0 M=0 Y=0 K=90 0.000000 0.000000 0.000000 90.000004 None
56 Grayscale C=0 M=0 Y=0 K=80 0.000000 0.000000 0.000000 80.000001 None
57 Grayscale C=0 M=0 Y=0 K=70 0.000000 0.000000 0.000000 69.999999 None
58 Grayscale C=0 M=0 Y=0 K=60 0.000000 0.000000 0.000000 60.000002 None
59 Grayscale C=0 M=0 Y=0 K=50 0.000000 0.000000 0.000000 50.000000 None
60 Grayscale C=0 M=0 Y=0 K=40 0.000000 0.000000 0.000000 39.999998 None
61 Grayscale C=0 M=0 Y=0 K=30 0.000000 0.000000 0.000000 30.000001 None
62 Grayscale C=0 M=0 Y=0 K=20 0.000000 0.000000 0.000000 19.999999 None
time: 51 ms

Unlike the examples from "computing-solutions.pdf", where the swatches were described mainly in the RGB color space, swatches from the fractal document are entirely in the CYMK color space.

Here are the definitions of the xapG namespace types, excerpted from Part 2 of the XMP specification:

Table 3 — Colorant fields

Name

Type

Description

xapG:A xapG:B

Integer

A or B value when the mode is LAB. Range -128 to 127.

xapG:L

Real

L value when the mode is LAB. Range 0-100.

xapG:black xapG:cyan xapG:magenta xapG:yellow

Real

Colour value when the mode is CMYK. Range 0-100.

xapG:blue xapG:green xapG:red

Integer

Colour value when the mode is RGB. Range 0-255.

xapG:mode

closed Choice

The colour space in which the colour is defined. One of: CMYK, RGB, LAB. Library colours are represented in the colour space for which they are defined.

xapG:swatchName

Text

Name of the swatch.

xapG:type

closed Choice

The type of colour , one of PROCESS or SPOT.

It turns out that xapG:tint does not appear in the specification. Looking at the Illustrator docs, I find

You can also create tints in the Swatches panel. A tint is a global process color or spot color with a modified intensity. Tints of the same color are linked together, so that if you edit the color of a tint swatch, all associated tint swatches (and the objects painted with those swatches) change color, though the tint values remain unchanged. Tints are identified by a percentage (when the Swatches panel is in list view)

At least in the CYMK space, a 100% Tint means "print the 100% of the ink specified in this swatch"; setting that tint to, say, 20% means "print only 20% of the ink specified in this swatch;" the effect of this on the usual white background would be similar to blending the color 80% with white on the computer screen.

To display colors on a web site, current web specifications require that colors be specified in RGB format. Thus, to display CMYK colors, I have to convert colors to RGB color space. The following simple formulas (from here) aproximately convert CYMK colors to RGB:

In [31]:
swatch_colors["red"]=2.55/100*(100-swatch_colors["cyan"])*(100-swatch_colors["black"])
swatch_colors["green"]=2.55/100*(100-swatch_colors["magenta"])*(100-swatch_colors["black"])
swatch_colors["blue"]=2.55/100*(100-swatch_colors["yellow"])*(100-swatch_colors["black"])
time: 5 ms

Conversion between CYMK and RGB colors is a bit iffy because the two color systems are not completely comparable. Red, Green and Blue colors on a screen roughly correspond to three kinds of stimulus applied to three kinds of cone in the eye. The exact stimulus from a printed page, however, depends on the color of the light shining on the page.

The formula above lacks a contribution for tint.

Tint could be emulated by multiplying all of the color channels below by swatch_colors["tint"]/100.0 after assuming a default value of 100.0. I don't bother to do this, since the tint makes no difference in this case.

I delete columns that I no longer need, then show a few rows before visualizing color swatches with the functions defined previously:

In [32]:
for color in ["cyan","magenta","yellow","black","tint"]:
    del swatch_colors[color]
swatch_colors.head()
Out[32]:
groupName swatchName red green blue
0 Default Swatch Group Global Red 255.000000 0.0 0.0
1 Default Swatch Group Global Squash 255.000000 127.5 0.0
2 Default Swatch Group Global Pure Yellow 255.000000 255.0 0.0
3 Default Swatch Group Global Green 50.999997 255.0 0.0
4 Default Swatch Group Global Pure Cyan 0.000000 255.0 255.0
time: 19 ms
In [33]:
colorcode(swatch_colors)
swatch_colors.head()
Out[33]:
groupName swatchName red green blue code
0 Default Swatch Group Global Red 255.000000 0.0 0.0 rgb(255,0,0)
1 Default Swatch Group Global Squash 255.000000 127.5 0.0 rgb(255,127,0)
2 Default Swatch Group Global Pure Yellow 255.000000 255.0 0.0 rgb(255,255,0)
3 Default Swatch Group Global Green 50.999997 255.0 0.0 rgb(51,255,0)
4 Default Swatch Group Global Pure Cyan 0.000000 255.0 255.0 rgb(0,255,255)
time: 21 ms
In [34]:
for color in ["red","green","blue"]:
    del swatch_colors[color]
time: 11 ms
In [35]:
pd.options.display.max_colwidth=0

showgroup=lambda group: group.replace(' Swatch Group','')
display_html(swatch_colors.to_html(formatters=[showgroup,None,colorblock],escape=False),raw=True)
groupName swatchName code
0 Default Global Red
1 Default Global Squash
2 Default Global Pure Yellow
3 Default Global Green
4 Default Global Pure Cyan
5 Default Global Deep Sea Blue
6 Default Global Orange
7 Default White
8 Default Pumpkin
9 Default Squash
10 Default Sunshine
11 Default Pure Yellow
12 Default Peridot
13 Default Little Sprout Green
14 Default Jade
15 Default Mint Julep
16 Default Emerald
17 Default Sea Green
18 Default Black
19 Default Caribbean Blue
20 Default Pure Cyan
21 Default Hawaiian Blue
22 Default Twillight Blue
23 Default Starry Night Blue
24 Default Deep Sea Blue
25 Default Fresh Lavender
26 Default Purple
27 Default Amethyst
28 Default Rasberry
29 Default Latte
30 Default Pure Magenta
31 Default Capuccino
32 Default Mochaccino
33 Default Mocha
34 Default Mars Red
35 Default Ruby
36 Default Red
37 Earthtone C=47 M=70 Y=83 K=0
38 Earthtone C=8 M=16 Y=62 K=0
39 Earthtone C=13 M=38 Y=71 K=55
40 Earthtone C=50 M=40 Y=80 K=24
41 Earthtone C=6 M=70 Y=76 K=26
42 Earthtone C=0 M=33 Y=100 K=35
43 Soft C=0 M=13 Y=0 K=0
44 Soft C=24 M=0 Y=8 K=0
45 Soft C=0 M=0 Y=31 K=0
46 Soft C=12 M=0 Y=30 K=0
47 Soft C=0 M=8 Y=18 K=0
48 Bright C=100 M=0 Y=20 K=0
49 Bright C=35 M=0 Y=100 K=0
50 Bright C=0 M=100 Y=40 K=0
51 Bright C=35 M=85 Y=0 K=0
52 Grayscale C=0 M=0 Y=0 K=100
53 Grayscale C=0 M=0 Y=0 K=10
54 Grayscale C=0 M=0 Y=0 K=5
55 Grayscale C=0 M=0 Y=0 K=90
56 Grayscale C=0 M=0 Y=0 K=80
57 Grayscale C=0 M=0 Y=0 K=70
58 Grayscale C=0 M=0 Y=0 K=60
59 Grayscale C=0 M=0 Y=0 K=50
60 Grayscale C=0 M=0 Y=0 K=40
61 Grayscale C=0 M=0 Y=0 K=30
62 Grayscale C=0 M=0 Y=0 K=20
time: 17 ms

How many swatches does a document commonly have?

Counting Collection sizes in SPARQL

Standard SPARQL, unlike some query languages, doesn't have a specific function to count the members of a list. Fortunately, it is straightfoward to write a query that returns rows for all members, then counts (and possibly groups) over the rows. In a future essay, I will use inference to simplify this kind of query, but for now, the following query returns, on individual rows, the number of swatches found in individual documents because this is what is required by matplotlib and other tools for investigating statistics.

Note that this query only returns results for documents which have swatches; it does not contain a '0' for any of the documents that do not have swatches. I'll take a look at the (majority) of swatchless documents in a moment. Also, this query is adding together all of the swatches in all of the swatch groups associated with a document and producingt just one number.

In [36]:
swatch_counts=endpoint.select("""
   SELECT (COUNT(*) AS ?count) {
    ?packet xapTPg:SwatchGroups ?groups .
    ?groups ?grouppred ?group .
    ?group xapG:Colorants ?colorants .
    ?colorants ?colorpred ?swatch .
    FILTER (?grouppred!=rdf:type) .
    FILTER (?colorpred!=rdf:type)
   } GROUP BY ?packet
""")
swatch_counts.head()
Out[36]:
count
0 73
1 37
2 73
3 38
4 38
time: 240 ms
In [37]:
import matplotlib.pyplot as plt
time: 169 ms
In [38]:
%matplotlib inline
time: 8 ms

The Pandas dataframe itself can return basic descriptive statistics, such as mean and median:

In [39]:
swatch_counts.describe()
Out[39]:
count
count 6360.000000
mean 43.916352
std 26.214796
min 1.000000
25% 14.000000
50% 57.000000
75% 65.000000
max 256.000000
time: 18 ms

The following histogram reveals peaks at particular counts, suggesting that the many of the documents carry "standard" groups of swatches that probably have been supplied by editing tools. (Looking at the list of common colors above also suggests this.)

In [40]:
swatch_counts.plot.hist(bins=100,range=(0,100))
Out[40]:
<matplotlib.axes._subplots.AxesSubplot at 0x1eb94c10400>
time: 512 ms

Which tools write swatch lists?

the xap:CreatorTool predicate exists to describe the tool which created an XMP packet. If we look at the tools used to save documents that have color swatches, these appear to be entirely adobe tools, almost always Adobe Illustrator.

In [41]:
tools_with_swatches=endpoint.select("""
   SELECT ?creatorTool (COUNT(*) AS ?count) {
    ?packet xapTPg:SwatchGroups ?groups ;
            xap:CreatorTool ?creatorTool .
   } GROUP BY ?creatorTool ORDER BY ?creatorTool
""")
tools_with_swatches
Out[41]:
creatorTool count
0 Adobe Illustrator CC (Macintosh) 126
1 Adobe Illustrator CC 2014 (Macintosh) 483
2 Adobe Illustrator CC 2014 (Windows) 29
3 Adobe Illustrator CC 2015 (Macintosh) 295
4 Adobe Illustrator CC (Windows) 158
5 Adobe Illustrator CC 2017 (Windows) 2
6 Adobe Illustrator CS4 1146
7 Adobe Illustrator CS5 1196
8 Adobe Illustrator CS5.1 697
9 Adobe Illustrator CS6 (Macintosh) 866
10 Adobe Illustrator CS6 (Windows) 2105
11 Adobe Illustrator CS3 2291
12 Adobe InDesign CC 2014 (Macintosh) 5
13 Adobe InDesign CS5 (7.0.4) 2
14 Adobe Photoshop CC 2014 (Macintosh) 3
15 Adobe Photoshop CC 2014 (Windows) 1
16 Adobe Photoshop CS3 Macintosh 89
17 Adobe Photoshop CS3 Windows 34
18 Adobe Photoshop CS4 Macintosh 5
19 Illustrator 49
time: 19 ms

Which tools don't write swatch lists?

The MINUS clause in SPARQL is good for finding data records that lack a property. Looking at the tools that have created documents without swatches, it is a much more diverse list in terms of both Adobe and non-Adobe tools.

In [42]:
tools_without_swatches=endpoint.select("""
   SELECT ?creatorTool (COUNT(*) AS ?count) {
        ?packet xap:CreatorTool ?creatorTool .
        MINUS {?packet xapTPg:SwatchGroups ?groups .}
   } GROUP BY ?creatorTool ORDER BY ?creatorTool
""")
tools_without_swatches
Out[42]:
creatorTool count
0 76
1 Adobe Photoshop CS2 Macintosh 6
2 "PFU ScanSnap Manager 3.1.12" 2
3 032912.ptx 1
4 3 1
5 4.2.1 3
6 ACOMP.exe WinVer 1c15 Aug 31 2005 1
7 ACOMP.exe WinVer 2.0 Nov 24 2008 8
8 ACOMP.exe WinVer 2.1 Mar 15 2010 16
9 AH CSS Formatter V6.0 MR2 for Linux64 : 6.0.2.5372 (2012/05/16 18:26JST) 25
10 AH CSS Formatter V6.1 R1 for Linux64 : 6.1.5.11330 (2013/05/23 13:33JST) 6
11 AH CSS Formatter V6.2 MR4 for Linux64 : 6.2.6.18551 (2014/09/24 15:00JST) 3
12 AH Formatter V5.1 MR1 (5,1,2009,1209) for Windows 2
13 AccuSoft ImageGear Library 15.4.0 2
14 Acrobat 3.0 Scan Plug-in 25
15 Acrobat 5.0 Image Conversion Plug-in for Windows 3
16 Acrobat 5.0 Scan Plug-in for Windows 5
17 Acrobat PDFMaker 10.1 for Word 238
18 Acrobat PDFMaker 10.1 for PowerPoint 27
19 Acrobat PDFMaker 10.0 for Excel 38
20 Acrobat PDFMaker 10.1 for Excel 71
21 Acrobat PDFMaker 10.0 for PowerPoint 2
22 Acrobat PDFMaker 10.0 for Word 2
23 Acrobat PDFMaker 11 for PowerPoint 32
24 Acrobat PDFMaker 11 for Excel 267
25 Acrobat PDFMaker 11 for Word 218
26 Acrobat PDFMaker 15 for Word 44
27 Acrobat PDFMaker 15 for PowerPoint 6
28 Acrobat PDFMaker 6.0 for Word 8
29 Acrobat PDFMaker 6.0 for PowerPoint 1
30 Acrobat PDFMaker 7.0.7 for Word 15
31 Acrobat PDFMaker 7.0 for PowerPoint 1
32 Acrobat PDFMaker 7.0.5 for PowerPoint 1
33 Acrobat PDFMaker 7.0 for Word 26
34 Acrobat PDFMaker 8.0 for Excel 5
35 Acrobat PDFMaker 8.0 for Word 3
36 Acrobat PDFMaker 8.1 for Word 398
37 Acrobat PDFMaker 8.1 for PowerPoint 16
38 Acrobat PDFMaker 8.1 for Excel 90
39 Acrobat PDFMaker 9.0 for PowerPoint 1
40 Acrobat PDFMaker 9.0 for Word 1118
41 Acrobat PDFMaker 9.0 Word 版 2
42 Acrobat PDFMaker 9.1 for PowerPoint 39
43 Acrobat PDFMaker 9.1 for Word 136
44 AdLib OCR Engine 6
45 Adobe Acrobat 10.1.7 1
46 Adobe Acrobat 11.0 28
47 Adobe Acrobat 11.0.14 1
48 Adobe Acrobat 11.0.3 2
49 Adobe Acrobat 15.0 1
... ... ...
473 Visioneer 9650 V1.10 32
474 Visioneer OneTouch 4.0 2
475 WIA-HP Scanjet G3110 2
476 WIA-IS450 2
477 WIA-Visioneer 9650 6
478 Windows NT 4.0 1
479 Word 28
480 Word 用 Acrobat PDFMaker 7.0 1
481 Writer 3
482 XPP 318
483 XSL Formatter V4.3 R1 (4,3,2008,0424) for Linux 16
484 Xerox 4112 1
485 Xerox 4127 1
486 Xerox D95 Copier-Printer 1
487 Xerox DocuMate 3220 3
488 Xerox WorkCentre 5325 1
489 Xerox WorkCentre 5735 1
490 Xerox WorkCentre 5745 2
491 Xerox WorkCentre 5855 29
492 Xerox WorkCentre 7335 1
493 Xerox WorkCentre 7556 2
494 Xerox WorkCentre 7655 2
495 Xerox WorkCentre 7675 1
496 Xerox WorkCentre 7835 39
497 XyEnterprise XPP 8.4C.1 SP #2 279
498 XyEnterprise XPP 8.4C.1 SP #3 1
499 bt2p.dll (VB) 6
500 c42pdf 0.08 args: 9
501 callas software gmbh, PDFEngine V. 2.0.001 9
502 dvips(k) 5.86 Copyright 1999 Radical Eye Software 3
503 dvips(k) 5.94b Copyright 2004 Radical Eye Software 1
504 eCopy Desktop 9.2.0.56 20
505 eCopy, Inc 159
506 eCopy, Inc. 66
507 fig2dev Version 3.2 Patchlevel 0-beta3 1
508 gnuplot 3
509 gnuplot 4.2 patchlevel 2 15
510 hp scanjet 5590 TWAIN 2
511 hp scanjet 8200 series #2 TWAIN 1
512 hp scanjet 8200 series TWAIN 1
513 https://ecf.nysd.uscourts.gov/cgi-bin/show_temp.pl?file=10815940-0--25817.pdf&type=application/pdf 1
514 iPhoto 9.6 1
515 iPhoto 9.6.1 1
516 idraw 11
517 pdfFactory Pro www.pdffactory.com 3
518 pdfFactory www.pdffactory.com 2
519 pdftk 1.41 - www.pdftk.com 3
520 pdftk 1.44 - www.pdftk.com 1
521 pdftk 2.02 - www.pdftk.com 2
522 picnik.com 12

523 rows × 2 columns

time: 102 ms

as is frequently the case, the number of different values is awkwardly large, thus pandas automatically cuts out the middle of the list to display it. I could tell pandas to show you 523 rows, but if it were 5230 rows, or 5,230,000 rows, it would be impractical to show all the values, in which case they need to be summarized in some way.

One answer would be to sort the "top N names" to the top, but I like how alphabetical order groups together different versions of the product. Thus I use pandas to filter for tools that produced more than 40 swatchless documents. This illustrates the diversity of tools, both desktop and server, that generate XMP annotated documents.

In [43]:
tools_without_swatches[tools_without_swatches["count"] >40]
Out[43]:
creatorTool count
0 76
17 Acrobat PDFMaker 10.1 for Word 238
20 Acrobat PDFMaker 10.1 for Excel 71
24 Acrobat PDFMaker 11 for Excel 267
25 Acrobat PDFMaker 11 for Word 218
26 Acrobat PDFMaker 15 for Word 44
36 Acrobat PDFMaker 8.1 for Word 398
38 Acrobat PDFMaker 8.1 for Excel 90
40 Acrobat PDFMaker 9.0 for Word 1118
43 Acrobat PDFMaker 9.1 for Word 136
77 Adobe Adobe Media Encoder CC 2015.4 (Macintosh) 57
80 Adobe After Effects CC 2014 (Macintosh) 93
91 Adobe Audition 4.0 170
104 Adobe Fireworks CS3 163
105 Adobe Fireworks CS4 345
106 Adobe Fireworks CS4 PR 140
108 Adobe Fireworks CS5 11.0.0.484 Macintosh 67
110 Adobe Fireworks CS5 11.0.1.7 Windows 72
127 Adobe Fireworks CS5.1 11.1.0.205 Windows 131
130 Adobe Fireworks CS6 (Macintosh) 773
131 Adobe Fireworks CS6 (Windows) 711
134 Adobe Illustrator CC 2014 (Macintosh) 138
138 Adobe Illustrator CS2 805
147 Adobe InDesign CC 2014 (Macintosh) 73
148 Adobe InDesign CC 2015 (Macintosh) 161
154 Adobe InDesign CS2_J (4.0.5) 48
164 Adobe InDesign CS6 (Macintosh) 152
170 Adobe Photoshop CC (Macintosh) 1580
171 Adobe Photoshop CC (Windows) 737
172 Adobe Photoshop CC (14.1 x001) (Windows) 47
177 Adobe Photoshop CC 2014 (Macintosh) 1544
178 Adobe Photoshop CC 2014 (Windows) 1511
180 Adobe Photoshop CC 2015 (Macintosh) 1897
183 Adobe Photoshop CC 2015 (Windows) 1764
188 Adobe Photoshop CC 2015.5 (Macintosh) 168
189 Adobe Photoshop CC 2015.5 (Windows) 157
190 Adobe Photoshop CC 2017 (Macintosh) 55
191 Adobe Photoshop CC 2017 (Windows) 56
195 Adobe Photoshop CC 2014 (2014.1.0 x001) (Macintosh) 69
202 Adobe Photoshop CC 2015 (2015.0.1 20150824.3d.2719 2015/08/24:14:39:40 x003) (Macintosh) 94
204 Adobe Photoshop CC 2015 (2015.1 20150923.jekn.1044281 2015/09/23:15:13:59 x003) (Macintosh) 42
208 Adobe Photoshop CC Macintosh 58
209 Adobe Photoshop CS Macintosh 60
210 Adobe Photoshop CS Windows 66
211 Adobe Photoshop CS2 Windows 209
212 Adobe Photoshop CS2 Macintosh 440
213 Adobe Photoshop CS3 Macintosh 62
214 Adobe Photoshop CS3 Windows 169
216 Adobe Photoshop CS4 Macintosh 399
219 Adobe Photoshop CS5 Macintosh 5635
220 Adobe Photoshop CS5 Windows 1334
223 Adobe Photoshop CS5.1 Macintosh 1272
224 Adobe Photoshop CS5.1 Windows 679
225 Adobe Photoshop CS6 (Macintosh) 5109
226 Adobe Photoshop CS6 (Windows) 1531
235 Adobe Photoshop CS6 (13.1 x001 (0.000000_14.836270)) (Macintosh) 110
239 Adobe Photoshop CS6 (13.0 20120229.m.403 2012/02/29:21:00:00) (Macintosh) 69
248 Adobe Photoshop Lightroom 4.4 (Windows) 338
262 Adobe Premiere Pro 3.0 71
272 After Effects 7.0 354
273 After Effects 8.0 123
279 Arbortext 5.4 47
281 Aspose Ltd. 794
283 Canon 41
316 FUJITSU fi-4340Cd 57
327 Federal Digital System, U. S. Government Printing Office 221
331 FrameMaker 7.0 61
347 Illustrator 138
385 Microsoft® Excel® 2010 81
390 Microsoft® Office Word 2007 74
391 Microsoft® PowerPoint® 2010 70
395 Microsoft® Word 2010 521
399 Oi/GFS, writer v00.06.02 634
406 PFU ScanSnap Manager 5.0.11 182
408 PFU ScanSnap Manager 5.1.51 #S1300i 74
409 PFU ScanSnap Manager 5.1.51 #S1500 148
410 PFU ScanSnap Manager 4.1.12 67
424 PFU ScanSnap Manager 5.1.51 #S510 76
429 PScript5.dll Version 5.2 72
430 PScript5.dll Version 5.2.2 935
482 XPP 318
497 XyEnterprise XPP 8.4C.1 SP #2 279
505 eCopy, Inc 159
506 eCopy, Inc. 66
time: 23 ms

Unicode transparency

RDF, and by extension, XMP supports the full Unicode character set. rdflib, the Python library I use to work with rdf, builds on the Python 3 support to support a full range of characters. The following function selects for strings that only contain ASCII characters:

In [44]:
def only_ascii(sample):
    return all(map(lambda x: x< 128,[ord(x) for x in sample]))
time: 6 ms

I then negate the only_ascii function, apply it to a Pandas series, and filter the whole dataframe to see creatorTool(s) that contain non-ascii characters:

In [45]:
not_ascii=tools_without_swatches["creatorTool"].apply(lambda a: not only_ascii(a))
tools_without_swatches[not_ascii]
Out[45]:
creatorTool count
41 Acrobat PDFMaker 9.0 Word 版 2
82 Adobe After Effects CS5.5 10.5x198∆ Windows 64 1
271 Adobe Photoshop Lightroom 1
385 Microsoft® Excel® 2010 81
386 Microsoft® Office Excel® 2007 5
387 Microsoft® Office PowerPoint® 2007 20
388 Microsoft® Office Publisher 2007 2
389 Microsoft® Office Visio® 2007 9
390 Microsoft® Office Word 2007 74
391 Microsoft® PowerPoint® 2010 70
392 Microsoft® PowerPoint® 2013 1
393 Microsoft® PowerPoint® 2016 5
394 Microsoft® Visio® 2010 3
395 Microsoft® Word 2010 521
396 Microsoft® Word 2013 4
443 PowerPoint 用 Acrobat PDFMaker 11 1
465 Tif2Pdf © 2009-11 Copitrak Inc. 1
480 Word 用 Acrobat PDFMaker 7.0 1
time: 26 ms

A certain big software company likes to use the registered mark, another uses the copyright mark, others contain chinese characters. If you have a good eye you might notice row 271 doesn't have visible non-ascii characters, instead it has visible non-ascii characters.

In [46]:
tools_without_swatches.at[271,'creatorTool']
Out[46]:
'Adobe\xa0Photoshop Lightroom'
time: 8.01 ms

Somebody just had to insert a non-breaking space; oddly, this turns up just once, while other names for Lightroom turn up far more often:

In [47]:
tools_without_swatches[tools_without_swatches["creatorTool"].apply(lambda x: x.find('Lightroom')>=0)]
Out[47]:
creatorTool count
248 Adobe Photoshop Lightroom 4.4 (Windows) 338
249 Adobe Photoshop Lightroom 6.2.1 (Macintosh) 15
250 Adobe Photoshop Lightroom 9
251 Adobe Photoshop Lightroom 5.0 (Macintosh) 1
252 Adobe Photoshop Lightroom 5.0 (Windows) 6
253 Adobe Photoshop Lightroom 4.1 (Windows) 2
254 Adobe Photoshop Lightroom 3.4.1 3
255 Adobe Photoshop Lightroom 4.1 (Macintosh) 2
256 Adobe Photoshop Lightroom 6.9 (Macintosh) 1
257 Adobe Photoshop Lightroom 4.3 (Windows) 1
258 Adobe Photoshop Lightroom 3.3 8
259 Adobe Photoshop Lightroom 5.7.1 (Macintosh) 1
260 Adobe Photoshop Lightroom 6.0 (Windows) 2
271 Adobe Photoshop Lightroom 1
time: 17 ms

As usual in a data investigation, you encounter the ocassional random thing, such as the URL of a web site that generated a document.

In [48]:
tools_without_swatches[tools_without_swatches["creatorTool"].apply(lambda x: x.find('http')==0)]
Out[48]:
creatorTool count
513 https://ecf.nysd.uscourts.gov/cgi-bin/show_temp.pl?file=10815940-0--25817.pdf&type=application/pdf 1
time: 12 ms

Even though this URI fails to resolve with the following message:

Cannot redisplay /tmp/10815940-0--25817.pdf, it has already been shown once.

I'd better take a look at the document to see that this link doesn't compromise my privacy:

In [49]:
endpoint.select("""
   SELECT ?packet {
        ?packet xap:CreatorTool "https://ecf.nysd.uscourts.gov/cgi-bin/show_temp.pl?file=10815940-0--25817.pdf&type=application/pdf"
   }
""")
Out[49]:
packet
0 file:///C:/Users/paul_000/cftc/cftc/www.cftc.gov/idc/groups/public/%40newsroom/documents/file/mfgopinionorderwithdrawing1210.pdf/0001w
time: 14 ms
In [50]:
cftc=endpoint.peel(URIRef(_.at[0,'packet']))
ttl(cftc)
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix o2: <http://rdf.ontology2.com/metadata/> .
@prefix pdf: <http://ns.adobe.com/pdf/1.3/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xap: <http://ns.adobe.com/xap/1.0/> .
@prefix xapMM: <http://ns.adobe.com/xap/1.0/mm/> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xmp: <http://ns.adobe.com/xap/1.0/> .
@prefix xmpMM: <http://ns.adobe.com/xap/1.0/mm/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .


<file:///C:/Users/paul_000/cftc/cftc/www.cftc.gov/idc/groups/public/%40newsroom/documents/file/mfgopinionorderwithdrawing1210.pdf/0001w> pdf:Producer "Adobe Acrobat 10.1.3 Paper Capture Plug-in" ;
    xap:CreateDate "2012-12-10T16:45:48-05:00" ;
    xap:CreatorTool "https://ecf.nysd.uscourts.gov/cgi-bin/show_temp.pl?file=10815940-0--25817.pdf&type=application/pdf" ;
    xap:MetadataDate "2012-12-11T11:58:22-05:00" ;
    xap:ModifyDate "2012-12-11T11:58:22-05:00" ;
    xapMM:DocumentID "uuid:860d0786-cec0-42e0-bfbb-04cbadfe60ed" ;
    xapMM:InstanceID "uuid:a9a9ebe4-5bf5-4b5f-9a6c-0c92931a1699" ;
    dc:creator [ a rdf:Seq ;
            rdf:_1 "Rob Schwartz (OGC)" ] ;
    dc:description [ a rdf:Alt ;
            rdf:_1 "Koch Supply & Trading, L.P. v. Giddens - Opinion and Order Withdrawing Reference" ] ;
    dc:format "application/pdf" ;
    dc:title [ a rdf:Alt ;
            rdf:_1 "Order and Opinion Withdrawing Reference: Koch Supply & Trading, L.P. v. Giddens" ] ;
    o2:file "C:/Users/paul_000/cftc/cftc/www.cftc.gov/idc/groups/public/@newsroom/documents/file/mfgopinionorderwithdrawing1210.pdf" ;
    o2:fileLength 570702 ;
    o2:packetNumber 1 ;
    o2:rwFlag "w" ;
    o2:xmpEnd 6407 ;
    o2:xmpSize 4036 ;
    o2:xmpStart 2371 .


time: 32 ms

It's just a court order regarding the liquidation of MF Global that I got when I crawled the CFTC web site.

Conclusion

In this episode I

  • investigated namespaces used in my sample of XMP packets
  • investigated predicates used to describe documents
  • noted that predicates involving color swatches were the most frequent data set
  • decoded color swatches and investigated their prevalence
  • found that the swatches are used almost exclusively by Adobe Illustrator
  • took a look at the applications which generated the documents containing XMP packets
  • demonstrated that non-ASCII characters pass through cleanly from XMP packets
  • found that fields in documents can contain data that could be personally identifying

This episode is part of a series that demonstrates the art and science of SPARQL queries against complex data sets, such as XMP. I've been working hard to make my queries clear, but in the next episode I'll tune up my tools and use inference to make short work of the information about document history that can be found in XMP packets.

Want to read more articles like this? Subscribe to our mailing list!