You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2016/09/26 16:55:47 UTC

tika git commit: Extract PDF DocInfo metadata into separate keys to prevent overwriting by XMP metadata (TIKA-2057).

Repository: tika
Updated Branches:
  refs/heads/2.x 94789a963 -> be78c549a


Extract PDF DocInfo metadata into separate keys to prevent overwriting by XMP metadata (TIKA-2057).


Project: http://git-wip-us.apache.org/repos/asf/tika/repo
Commit: http://git-wip-us.apache.org/repos/asf/tika/commit/be78c549
Tree: http://git-wip-us.apache.org/repos/asf/tika/tree/be78c549
Diff: http://git-wip-us.apache.org/repos/asf/tika/diff/be78c549

Branch: refs/heads/2.x
Commit: be78c549a94c1a23ab26e21c75c28cc27a4f3690
Parents: 94789a9
Author: tballison <ta...@mitre.org>
Authored: Mon Sep 26 12:55:40 2016 -0400
Committer: tballison <ta...@mitre.org>
Committed: Mon Sep 26 12:55:40 2016 -0400

----------------------------------------------------------------------
 CHANGES.txt                                     |   3 +
 .../main/java/org/apache/tika/metadata/PDF.java |  67 +++++
 .../org/apache/tika/parser/pdf/PDFParser.java   |  31 ++-
 .../apache/tika/parser/pdf/PDFParserTest.java   |   9 +
 .../test-documents/testPDF_diffTitles.pdf       | 261 +++++++++++++++++++
 5 files changed, 362 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tika/blob/be78c549/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 362f7e9..64534fc 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -17,6 +17,9 @@ Release 2.0 - ???
 
 Release 1.14 - ???
 
+  * Extract PDF DocInfo metadata into separate keys to prevent
+    overwriting by XMP metadata (TIKA-2057).
+
   * Re-enable fileUrl for tika-server (TIKA-2081).  If you choose,
     to use this feature, beware of the security vulnerabilities!
     See: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-3271

http://git-wip-us.apache.org/repos/asf/tika/blob/be78c549/tika-core/src/main/java/org/apache/tika/metadata/PDF.java
----------------------------------------------------------------------
diff --git a/tika-core/src/main/java/org/apache/tika/metadata/PDF.java b/tika-core/src/main/java/org/apache/tika/metadata/PDF.java
new file mode 100644
index 0000000..4123e73
--- /dev/null
+++ b/tika-core/src/main/java/org/apache/tika/metadata/PDF.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tika.metadata;
+
+/**
+ * PDF properties collection.
+ *
+ * @since Apache Tika 1.14
+ */
+public interface PDF {
+
+    String PDF_PREFIX = "pdf"+Metadata.NAMESPACE_PREFIX_DELIMITER;
+    String PDFA_PREFIX = "pdfa"+Metadata.NAMESPACE_PREFIX_DELIMITER;
+    String PDFAID_PREFIX = "pdfaid"+Metadata.NAMESPACE_PREFIX_DELIMITER;
+
+    /**
+     * Prefix to be used for properties that record what was stored
+     * in the docinfo section (as opposed to XMP)
+     */
+    String PDF_DOC_INFO_PREFIX = PDF_PREFIX + "docinfo" +
+            Metadata.NAMESPACE_PREFIX_DELIMITER;
+
+    String PDF_DOC_INFO_CUSTOM_PREFIX = PDF_DOC_INFO_PREFIX+"custom"+
+            Metadata.NAMESPACE_PREFIX_DELIMITER;
+
+    Property DOC_INFO_CREATED = Property.internalDate(PDF_DOC_INFO_PREFIX + "created");
+
+    Property DOC_INFO_CREATOR = Property.internalText(PDF_DOC_INFO_PREFIX + "creator");
+
+    Property DOC_INFO_CREATOR_TOOL = Property.internalText(PDF_DOC_INFO_PREFIX + "creator_tool");
+
+    Property DOC_INFO_MODIFICATION_DATE = Property.internalDate(PDF_DOC_INFO_PREFIX + "modified");
+
+    Property DOC_INFO_KEY_WORDS = Property.internalText(PDF_DOC_INFO_PREFIX + "keywords");
+
+    Property DOC_INFO_PRODUCER = Property.internalText(PDF_DOC_INFO_PREFIX + "producer");
+
+    Property DOC_INFO_SUBJECT = Property.internalText(PDF_DOC_INFO_PREFIX + "subject");
+
+    Property DOC_INFO_TITLE = Property.internalText(PDF_DOC_INFO_PREFIX + "title");
+
+    Property DOC_INFO_TRAPPED = Property.internalText(PDF_DOC_INFO_PREFIX + "trapped");
+
+    Property PDF_VERSION = Property.internalRational(PDF_PREFIX+"PDFVersion");
+    Property PDFA_VERSION = Property.internalRational(PDFA_PREFIX+"PDFVersion");
+    Property PDF_EXTENSION_VERSION = Property.internalRational(PDF_PREFIX+"PDFExtensionVersion");
+
+    Property PDFAID_CONFORMANCE = Property.internalText(PDFAID_PREFIX+"conformance");
+
+    Property PDFAID_PART = Property.internalText(PDFAID_PREFIX+"part");
+
+    Property IS_ENCRYPTED = Property.internalBoolean(PDF_PREFIX+"encrypted");
+}

http://git-wip-us.apache.org/repos/asf/tika/blob/be78c549/tika-parser-modules/tika-parser-multimedia-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
----------------------------------------------------------------------
diff --git a/tika-parser-modules/tika-parser-multimedia-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java b/tika-parser-modules/tika-parser-multimedia-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
index 866e4e7..763c82b 100644
--- a/tika-parser-modules/tika-parser-multimedia-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
+++ b/tika-parser-modules/tika-parser-multimedia-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
@@ -49,6 +49,7 @@ import org.apache.tika.extractor.EmbeddedDocumentExtractor;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.AccessPermissions;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.PDF;
 import org.apache.tika.metadata.PagedText;
 import org.apache.tika.metadata.Property;
 import org.apache.tika.metadata.TikaCoreProperties;
@@ -129,9 +130,9 @@ public class PDFParser extends AbstractParser {
             } else {
                 pdfDocument = PDDocument.load(new CloseShieldInputStream(stream), password);
             }
-            metadata.set("pdf:encrypted", Boolean.toString(pdfDocument.isEncrypted()));
+            metadata.set(PDF.IS_ENCRYPTED, Boolean.toString(pdfDocument.isEncrypted()));
 
-            metadata.set(Metadata.CONTENT_TYPE, "application/pdf");
+            metadata.set(Metadata.CONTENT_TYPE, MEDIA_TYPE.toString());
             extractMetadata(pdfDocument, metadata, context);
 
             AccessChecker checker = localConfig.getAccessChecker();
@@ -151,7 +152,7 @@ public class PDFParser extends AbstractParser {
 
             }
         } catch (InvalidPasswordException e) {
-            metadata.set("pdf:encrypted", "true");
+            metadata.set(PDF.IS_ENCRYPTED, "true");
             throw new EncryptedDocumentException(e);
         } finally {
             if (pdfDocument != null) {
@@ -231,22 +232,32 @@ public class PDFParser extends AbstractParser {
         PDDocumentInformation info = document.getDocumentInformation();
         metadata.set(PagedText.N_PAGES, document.getNumberOfPages());
         extractMultilingualItems(metadata, TikaCoreProperties.TITLE, info.getTitle(), dcSchema);
+        addMetadata(metadata, PDF.DOC_INFO_TITLE, info.getTitle());
         extractDublinCoreListItems(metadata, TikaCoreProperties.CREATOR, info.getAuthor(), dcSchema);
+        addMetadata(metadata, PDF.DOC_INFO_CREATOR, info.getAuthor());
         extractDublinCoreListItems(metadata, TikaCoreProperties.CONTRIBUTOR, null, dcSchema);
         addMetadata(metadata, TikaCoreProperties.CREATOR_TOOL, info.getCreator());
+        addMetadata(metadata, PDF.DOC_INFO_CREATOR_TOOL, info.getCreator());
         addMetadata(metadata, TikaCoreProperties.KEYWORDS, info.getKeywords());
+        addMetadata(metadata, PDF.DOC_INFO_KEY_WORDS, info.getKeywords());
         addMetadata(metadata, "producer", info.getProducer());
+        addMetadata(metadata, PDF.DOC_INFO_PRODUCER, info.getProducer());
         extractMultilingualItems(metadata, TikaCoreProperties.DESCRIPTION, null, dcSchema);
 
+        addMetadata(metadata, PDF.DOC_INFO_SUBJECT, info.getSubject());
+
         // TODO: Move to description in Tika 2.0
         addMetadata(metadata, TikaCoreProperties.TRANSITION_SUBJECT_TO_OO_SUBJECT, info.getSubject());
         addMetadata(metadata, "trapped", info.getTrapped());
+        addMetadata(metadata, PDF.DOC_INFO_TRAPPED, info.getTrapped());
             // TODO Remove these in Tika 2.0
         addMetadata(metadata, "created", info.getCreationDate());
+        addMetadata(metadata, PDF.DOC_INFO_CREATED, info.getCreationDate());
         addMetadata(metadata, TikaCoreProperties.CREATED, info.getCreationDate());
         Calendar modified = info.getModificationDate();
         addMetadata(metadata, Metadata.LAST_MODIFIED, modified);
         addMetadata(metadata, TikaCoreProperties.MODIFIED, modified);
+        addMetadata(metadata, PDF.DOC_INFO_MODIFICATION_DATE, info.getModificationDate());
 
         // All remaining metadata is custom
         // Copy this over as-is
@@ -256,6 +267,8 @@ public class PDFParser extends AbstractParser {
             String name = key.getName();
             if (!handledMetadata.contains(name)) {
                 addMetadata(metadata, name, info.getCOSObject().getDictionaryObject(key));
+                addMetadata(metadata, PDF.PDF_DOC_INFO_CUSTOM_PREFIX + name,
+                        info.getCOSObject().getDictionaryObject(key));
             }
         }
 
@@ -263,8 +276,8 @@ public class PDFParser extends AbstractParser {
         //Caveats:
         //    there is currently a fair amount of redundancy
         //    TikaCoreProperties.FORMAT can be multivalued
-        //    There are also three potential pdf specific version keys: pdf:PDFVersion, pdfa:PDFVersion, pdf:PDFExtensionVersion        
-        metadata.set("pdf:PDFVersion", Float.toString(document.getDocument().getVersion()));
+        //    There are also three potential pdf specific version keys: pdf:PDFVersion, pdfa:PDFVersion, pdf:PDFExtensionVersion
+        metadata.set(PDF.PDF_VERSION, Float.toString(document.getDocument().getVersion()));
         metadata.add(TikaCoreProperties.FORMAT.getName(),
                 MEDIA_TYPE.toString() + "; version=" +
                         Float.toString(document.getDocument().getVersion()));
@@ -275,12 +288,12 @@ public class PDFParser extends AbstractParser {
                 XMPSchemaPDFAId pdfaxmp = (XMPSchemaPDFAId) xmp.getSchemaByClass(XMPSchemaPDFAId.class);
                 if (pdfaxmp != null) {
                     if (pdfaxmp.getPart() != null) {
-                        metadata.set("pdfaid:part", Integer.toString(pdfaxmp.getPart()));
+                        metadata.set(PDF.PDFAID_PART, Integer.toString(pdfaxmp.getPart()));
                     }
                     if (pdfaxmp.getConformance() != null) {
-                        metadata.set("pdfaid:conformance", pdfaxmp.getConformance());
+                        metadata.set(PDF.PDFAID_CONFORMANCE, pdfaxmp.getConformance());
                         String version = "A-" + pdfaxmp.getPart() + pdfaxmp.getConformance().toLowerCase(Locale.ROOT);
-                        metadata.set("pdfa:PDFVersion", version);
+                        metadata.set(PDF.PDFA_VERSION, version);
                         metadata.add(TikaCoreProperties.FORMAT.getName(),
                                 MEDIA_TYPE.toString() + "; version=\"" + version + "\"");
                     }
@@ -304,7 +317,7 @@ public class PDFParser extends AbstractParser {
                         int el = adobeExt.getInt(COSName.getPDFName("ExtensionLevel"));
                         //-1 is sentinel value that something went wrong in getInt
                         if (el != -1) {
-                            metadata.set("pdf:PDFExtensionVersion", baseVersion + " Adobe Extension Level " + el);
+                            metadata.set(PDF.PDF_EXTENSION_VERSION, baseVersion + " Adobe Extension Level " + el);
                             metadata.add(TikaCoreProperties.FORMAT.getName(),
                                     MEDIA_TYPE.toString() + "; version=\"" + baseVersion + " Adobe Extension Level " + el + "\"");
                         }

http://git-wip-us.apache.org/repos/asf/tika/blob/be78c549/tika-parser-modules/tika-parser-multimedia-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
----------------------------------------------------------------------
diff --git a/tika-parser-modules/tika-parser-multimedia-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java b/tika-parser-modules/tika-parser-multimedia-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
index d16d3c3..9621d32 100644
--- a/tika-parser-modules/tika-parser-multimedia-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
+++ b/tika-parser-modules/tika-parser-multimedia-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
@@ -42,6 +42,7 @@ import org.apache.tika.extractor.ParserContainerExtractor;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.OfficeOpenXMLCore;
+import org.apache.tika.metadata.PDF;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.metadata.XMPMM;
 import org.apache.tika.mime.MediaType;
@@ -1195,6 +1196,14 @@ public class PDFParserTest extends TikaTest {
 
     }
 
+    @Test
+    public void testDiffTitles() throws Exception {
+        //different titles in xmp vs docinfo
+        Metadata m = getXML("testPDF_diffTitles.pdf").metadata;
+        assertEquals("this is a new title", m.get(PDF.DOC_INFO_TITLE));
+        assertEquals("Sample Title", m.get(TikaCoreProperties.TITLE));
+    }
+
     private void assertException(String path, Parser parser, ParseContext context, Class expected) {
         boolean noEx = false;
         InputStream is = getResourceAsStream(path);

http://git-wip-us.apache.org/repos/asf/tika/blob/be78c549/tika-test-resources/src/test/resources/test-documents/testPDF_diffTitles.pdf
----------------------------------------------------------------------
diff --git a/tika-test-resources/src/test/resources/test-documents/testPDF_diffTitles.pdf b/tika-test-resources/src/test/resources/test-documents/testPDF_diffTitles.pdf
new file mode 100644
index 0000000..7ea6ddd
--- /dev/null
+++ b/tika-test-resources/src/test/resources/test-documents/testPDF_diffTitles.pdf
@@ -0,0 +1,261 @@
+%PDF-1.6
+%\ufffd\ufffd\ufffd\ufffd
+1 0 obj
+<<
+/AcroForm 2 0 R
+/Metadata 3 0 R
+/Names 4 0 R
+/Outlines 5 0 R
+/Pages 6 0 R
+/SpiderInfo 7 0 R
+/Type /Catalog
+>>
+endobj
+8 0 obj
+<<
+/Author (Sample Author 1)
+/Citation (AUTHOR 1, Sample; AUTHOR 2, Sample \(1999\). <em>Sample Title</em>, Journal of Sample Organization, ORG - Sample Organization, October-December, Vol. 1, No. 9, p.99)
+/CitationName (AUTHOR 1, Sample; AUTHOR 2, Sample)
+/CreationDate (D:20140304090557+01'00')
+/Creator (Adobe Acrobat 10.0)
+/Edition (ENES)
+/Keywords ()
+/Language (EN)
+/ModDate (D:20140304090831+01'00')
+/Month (1999-10)
+/Number (9)
+/Page (99)
+/Period (October-December)
+/Producer (Acrobat Web Capture 10.0)
+/Related (0)
+/Sequence (2)
+/Title (this is a new title)
+/Type (Article)
+/Volume (1)
+>>
+endobj
+2 0 obj
+<<
+/DA (/Helv 0 Tf 0 g )
+/DR <<
+/Encoding <<
+/PDFDocEncoding 9 0 R
+>>
+/Font <<
+/Helv 10 0 R
+/ZaDb 11 0 R
+>>
+>>
+/Fields []
+>>
+endobj
+3 0 obj
+<<
+/Length 5401
+/Subtype /XML
+/Type /Metadata
+>>
+stream
+<?xpacket begin="\ufeff" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.2-c001 63.139439, 2010/09/27-13:37:26        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
+         <xmp:ModifyDate>2014-03-04T09:08:31+01:00</xmp:ModifyDate>
+         <xmp:CreateDate>2014-03-04T09:05:57+01:00</xmp:CreateDate>
+         <xmp:MetadataDate>2014-03-04T09:08:31+01:00</xmp:MetadataDate>
+         <xmp:CreatorTool>Adobe Acrobat 10.0</xmp:CreatorTool>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:dc="http://purl.org/dc/elements/1.1/">
+         <dc:format>application/pdf</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">Sample Title</rdf:li>
+            </rdf:Alt>
+         </dc:title>
+         <dc:creator>
+            <rdf:Bag>
+               <rdf:li>Sample Author 1</rdf:li>
+               <rdf:li>Sample Author 2</rdf:li>
+            </rdf:Bag>
+         </dc:creator>
+         <dc:rights>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">COPYRIGHT � XXXX by Sample Organization. No part of any contribution may be reproduced in any form without written permission from the organization and the author of the article, except for the quotation of brief passages in criticism and discussion. The source of the quotation should always be mentioned.</rdf:li>
+            </rdf:Alt>
+         </dc:rights>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
+         <xmpMM:DocumentID>uuid:0e46913c-72b9-40c0-8232-69e362abcd1e</xmpMM:DocumentID>
+         <xmpMM:InstanceID>uuid:2dba9ee8-a696-42fd-a295-575bc3316f13</xmpMM:InstanceID>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+         <pdf:Producer>Acrobat Web Capture 10.0</pdf:Producer>
+         <pdf:Keywords/>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+         <illustrator:StartupProfile>Print</illustrator:StartupProfile>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/">
+         <xmpRights:WebStatement>www.sampleurl.org</xmpRights:WebStatement>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/">
+         <pdfx:Citation>AUTHOR 1, Sample; AUTHOR 2, Sample (1999). &lt;em&gt;Sample Title&lt;/em&gt;, Journal of Sample Organization, ORG - Sample Organization, October-December, Vol. 1, No. 9, p.99</pdfx:Citation>
+         <pdfx:CitationName>AUTHOR 1, Sample; AUTHOR 2, Sample</pdfx:CitationName>
+         <pdfx:Volume>1</pdfx:Volume>
+         <pdfx:Number>9</pdfx:Number>
+         <pdfx:Edition>ENES</pdfx:Edition>
+         <pdfx:Month>1999-10</pdfx:Month>
+         <pdfx:Period>October-December</pdfx:Period>
+         <pdfx:Language>EN</pdfx:Language>
+         <pdfx:Sequence>2</pdfx:Sequence>
+         <pdfx:Page>99</pdfx:Page>
+         <pdfx:Related>0</pdfx:Related>
+         <pdfx:Type>Article</pdfx:Type>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>
+endstream
+endobj
+4 0 obj
+<<
+/IDS 12 0 R
+/URLS 13 0 R
+>>
+endobj
+5 0 obj
+<<
+/Count 1
+/First 14 0 R
+/Last 14 0 R
+/Type /Outlines
+>>
+endobj
+6 0 obj
+<<
+/Count 1
+/Kids [15 0 R]
+/Type /Pages
+>>
+endobj
+7 0 obj
+<<
+/V 1.25
+>>
+endobj
+9 0 obj
+<<
+/Differences [24 /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek /ring /tilde 39
+/quotesingle 96 /grave 128 /bullet /dagger /daggerdbl /ellipsis /emdash /endash
+/florin /fraction /guilsinglleft /guilsinglright /minus /perthousand /quotedblbase /quotedblleft /quotedblright /quoteleft
+/quoteright /quotesinglbase /trademark /fi /fl /Lslash /OE /Scaron /Ydieresis /Zcaron
+/dotlessi /lslash /oe /scaron /zcaron 160 /Euro 164 /currency 166
+/brokenbar 168 /dieresis /copyright /ordfeminine 172 /logicalnot /.notdef /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu 183 /periodcentered /cedilla /onesuperior
+/ordmasculine 188 /onequarter /onehalf /threequarters 192 /Agrave /Aacute /Acircumflex /Atilde
+/Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute
+/Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute
+/acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis
+/igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde
+/odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis]
+/Type /Encoding
+>>
+endobj
+10 0 obj
+<<
+/BaseFont /Helvetica
+/Encoding 9 0 R
+/Name /Helv
+/Subtype /Type1
+/Type /Font
+>>
+endobj
+11 0 obj
+<<
+/BaseFont /ZapfDingbats
+/Name /ZaDb
+/Subtype /Type1
+/Type /Font
+>>
+endobj
+12 0 obj
+<<
+>>
+endobj
+13 0 obj
+<<
+>>
+endobj
+14 0 obj
+<<
+/A 16 0 R
+/Parent 5 0 R
+/Title (Blank Page)
+>>
+endobj
+15 0 obj
+<<
+/CropBox [0.0 0.0 612.0 792.0]
+/MediaBox [0.0 0.0 612.0 792.0]
+/Parent 6 0 R
+/Resources <<
+>>
+/Rotate 0
+/Type /Page
+>>
+endobj
+16 0 obj
+<<
+/D [15 0 R /XYZ 0 792 null]
+/S /GoTo
+>>
+endobj
+17 0 obj
+<<
+/ID [<1DDBD40C7EC38C42A1DF390C16A7F655> <CDD527A0FD9D82458D271164221857FC>]
+/Info 8 0 R
+/Root 1 0 R
+/Type /XRef
+/Size 18
+/Index [0 17]
+/W [1 2 0]
+/Filter /FlateDecode
+/Length 60
+>>
+stream
+x\ufffdc```d\ufffdgd\ufffd\ufffd\ufffd\\ufffd(\ufffdQR\ufffdQ2\ufffdQr.#C?\ufffd\ufffd.F\ufffdg\ufffd\ufffd\ufffd\ufffd\ufffd2\u029ffT\ufffdeT\ufffd\ufffd9
+.
+endstream
+endobj
+startxref
+8402
+%%EOF