diff options
-rw-r--r-- | lib/xmlgraphics-commons-1.2svn.jar | bin | 343511 -> 343559 bytes | |||
-rw-r--r-- | src/java/org/apache/fop/pdf/PDFMetadata.java | 30 | ||||
-rw-r--r-- | status.xml | 3 | ||||
-rw-r--r-- | test/java/org/apache/fop/render/pdf/PDFAMetadataTestCase.java | 112 | ||||
-rw-r--r-- | test/test.xconf | 3 | ||||
-rw-r--r-- | test/xml/pdf-a/minimal-pdf-a.fo | 2 | ||||
-rw-r--r-- | test/xml/pdf-a/with-cmyk-images.fo | 2 |
7 files changed, 131 insertions, 21 deletions
diff --git a/lib/xmlgraphics-commons-1.2svn.jar b/lib/xmlgraphics-commons-1.2svn.jar Binary files differindex becb45ad5..4ec816a04 100644 --- a/lib/xmlgraphics-commons-1.2svn.jar +++ b/lib/xmlgraphics-commons-1.2svn.jar diff --git a/src/java/org/apache/fop/pdf/PDFMetadata.java b/src/java/org/apache/fop/pdf/PDFMetadata.java index 571b77499..addd7f2b1 100644 --- a/src/java/org/apache/fop/pdf/PDFMetadata.java +++ b/src/java/org/apache/fop/pdf/PDFMetadata.java @@ -34,7 +34,6 @@ import org.apache.xmlgraphics.xmp.schemas.XMPBasicSchema; import org.apache.xmlgraphics.xmp.schemas.pdf.AdobePDFAdapter; import org.apache.xmlgraphics.xmp.schemas.pdf.AdobePDFSchema; import org.apache.xmlgraphics.xmp.schemas.pdf.PDFAAdapter; -import org.apache.xmlgraphics.xmp.schemas.pdf.PDFAOldXMPSchema; import org.apache.xmlgraphics.xmp.schemas.pdf.PDFAXMPSchema; import org.xml.sax.SAXException; @@ -136,7 +135,7 @@ public class PDFMetadata extends PDFStream { info.setCreationDate(d); } - //Important: Acrobat's preflight check for PDF/A-1b wants the creation date in the Info + //Important: Acrobat 7's preflight check for PDF/A-1b wants the creation date in the Info //object and in the XMP metadata to have the same timezone or else it shows a validation //error even if the times are essentially equal. @@ -149,7 +148,8 @@ public class PDFMetadata extends PDFStream { dc.setTitle(info.getTitle()); } if (info.getSubject() != null) { - dc.addSubject(info.getSubject()); + //Subject maps to dc:description["x-default"] as per ISO-19005-1:2005/Cor.1:2007 + dc.setDescription(null, info.getSubject()); } dc.addDate(info.getCreationDate()); @@ -157,25 +157,22 @@ public class PDFMetadata extends PDFStream { PDFAMode pdfaMode = pdfDoc.getProfile().getPDFAMode(); if (pdfaMode.isPDFA1LevelB()) { PDFAAdapter pdfa = PDFAXMPSchema.getAdapter(meta); - //Create the identification a second time with the old namespace to keep - //Adobe Acrobat happy - PDFAAdapter pdfaOld = PDFAOldXMPSchema.getAdapter(meta); pdfa.setPart(1); - pdfaOld.setPart(1); if (pdfaMode == PDFAMode.PDFA_1A) { pdfa.setConformance("A"); //PDF/A-1a - pdfaOld.setConformance("A"); //PDF/A-1a } else { pdfa.setConformance("B"); //PDF/A-1b - pdfaOld.setConformance("B"); //PDF/A-1b } } //XMP Basic Schema XMPBasicAdapter xmpBasic = XMPBasicSchema.getAdapter(meta); xmpBasic.setCreateDate(info.getCreationDate()); - PDFProfile profile = pdfDoc.getProfile(); - if (profile.isModDateRequired()) { + PDFProfile profile = pdfDoc.getProfile(); + if (info.getModDate() != null) { + xmpBasic.setModifyDate(info.getModDate()); + } else if (profile.isModDateRequired()) { + //if modify date is needed but none is in the Info object, use creation date xmpBasic.setModifyDate(info.getCreationDate()); } if (info.getCreator() != null) { @@ -210,14 +207,9 @@ public class PDFMetadata extends PDFStream { } else { info.setAuthor(null); } - String[] subjects = dc.getSubjects(); - //PDF/A-1 defines dc:subject as "Text" but XMP defines it as "bag Text". - //We're simply doing the inverse from createXMPFromUserAgent() above. - if (subjects != null && subjects.length > 0) { - info.setSubject(subjects[0]); - } else { - info.setSubject(null); - } + + //dc:description["x-default"] maps to Subject as per ISO-19005-1:2005/Cor.1:2007 + info.setSubject(dc.getDescription()); AdobePDFAdapter pdf = AdobePDFSchema.getAdapter(meta); info.setKeywords(pdf.getKeywords()); diff --git a/status.xml b/status.xml index 5d939e2e3..ff79d4998 100644 --- a/status.xml +++ b/status.xml @@ -28,6 +28,9 @@ <changes> <release version="FOP Trunk"> + <action context="Code" dev="JM" type="update"> + Updated PDF/A-1b support according to ISO-19005-1:2005/Cor.1:2007. + </action> <action context="Code" dev="JM" type="add" fixes-bug="41831" due-to="Adrian Cumiskey"> Add support for font auto-detection (easier font configuration). </action> diff --git a/test/java/org/apache/fop/render/pdf/PDFAMetadataTestCase.java b/test/java/org/apache/fop/render/pdf/PDFAMetadataTestCase.java new file mode 100644 index 000000000..2821dcb24 --- /dev/null +++ b/test/java/org/apache/fop/render/pdf/PDFAMetadataTestCase.java @@ -0,0 +1,112 @@ +/* + * 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. + */ + +/* $Id$ */ + +package org.apache.fop.render.pdf; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.apache.fop.pdf.PDFDocument; +import org.apache.fop.pdf.PDFInfo; +import org.apache.fop.pdf.PDFMetadata; +import org.apache.xmlgraphics.xmp.Metadata; +import org.apache.xmlgraphics.xmp.schemas.DublinCoreAdapter; +import org.apache.xmlgraphics.xmp.schemas.DublinCoreSchema; +import org.apache.xmlgraphics.xmp.schemas.XMPBasicAdapter; +import org.apache.xmlgraphics.xmp.schemas.XMPBasicSchema; +import org.apache.xmlgraphics.xmp.schemas.pdf.AdobePDFAdapter; +import org.apache.xmlgraphics.xmp.schemas.pdf.AdobePDFSchema; + +import junit.framework.TestCase; + +/** + * Test case for PDF/A metadata handling. + */ +public class PDFAMetadataTestCase extends TestCase { + + public void testInfoUpdate() throws Exception { + Metadata meta = new Metadata(); + DublinCoreAdapter dc = DublinCoreSchema.getAdapter(meta); + dc.setTitle("MyTitle"); + dc.setDescription(null, "MySubject"); + dc.addCreator("That's me"); + + AdobePDFAdapter pdf = AdobePDFSchema.getAdapter(meta); + pdf.setKeywords("XSL-FO XML"); + pdf.setProducer("SuperFOP"); + + XMPBasicAdapter xmp = XMPBasicSchema.getAdapter(meta); + xmp.setCreatorTool("WonderFOP"); + Calendar cal1 = Calendar.getInstance(TimeZone.getTimeZone("Europe/Zurich")); + cal1.set(2007, Calendar.JUNE, 5, 21, 49, 13); + cal1.set(Calendar.MILLISECOND, 0); + xmp.setCreateDate(cal1.getTime()); + Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("Europe/Zurich")); + cal2.set(2007, Calendar.JUNE, 6, 8, 15, 59); + cal2.set(Calendar.MILLISECOND, 0); + xmp.setModifyDate(cal2.getTime()); + + PDFInfo info = new PDFInfo(); + assertNull(info.getTitle()); + PDFMetadata.updateInfoFromMetadata(meta, info); + + assertEquals("MyTitle", info.getTitle()); + assertEquals("MySubject", info.getSubject()); + assertEquals("That's me", info.getAuthor()); + assertEquals("XSL-FO XML", info.getKeywords()); + assertEquals("SuperFOP", info.getProducer()); + assertEquals("WonderFOP", info.getCreator()); + assertEquals(cal1.getTime(), info.getCreationDate()); + assertEquals(cal2.getTime(), info.getModDate()); + } + + public void testXMPUpdate() throws Exception { + PDFDocument doc = new PDFDocument("SuperFOP"); + PDFInfo info = doc.getInfo(); + info.setTitle("MyTitle"); + info.setSubject("MySubject"); + info.setAuthor("That's me"); + info.setKeywords("XSL-FO XML"); + //info.setProducer("SuperFOP"); + info.setCreator("WonderFOP"); + Calendar cal1 = Calendar.getInstance(TimeZone.getTimeZone("Europe/Zurich")); + cal1.set(2007, Calendar.JUNE, 5, 21, 49, 13); + cal1.set(Calendar.MILLISECOND, 0); + info.setCreationDate(cal1.getTime()); + Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("Europe/Zurich")); + cal2.set(2007, Calendar.JUNE, 6, 8, 15, 59); + cal2.set(Calendar.MILLISECOND, 0); + info.setModDate(cal2.getTime()); + + Metadata meta = PDFMetadata.createXMPFromUserAgent(doc); + + DublinCoreAdapter dc = DublinCoreSchema.getAdapter(meta); + assertEquals("MyTitle", dc.getTitle()); + assertEquals("MySubject", dc.getDescription()); + assertEquals(1, dc.getCreators().length); + assertEquals("That's me", dc.getCreators()[0]); + AdobePDFAdapter pdf = AdobePDFSchema.getAdapter(meta); + assertEquals("XSL-FO XML", pdf.getKeywords()); + assertEquals("SuperFOP", pdf.getProducer()); + XMPBasicAdapter xmp = XMPBasicSchema.getAdapter(meta); + assertEquals("WonderFOP", xmp.getCreatorTool()); + assertEquals(cal1.getTime(), xmp.getCreateDate()); + assertEquals(cal2.getTime(), xmp.getModifyDate()); + } +} diff --git a/test/test.xconf b/test/test.xconf index 56fdd8bd8..1f022f9fd 100644 --- a/test/test.xconf +++ b/test/test.xconf @@ -9,12 +9,15 @@ <fonts> <font metrics-url="test/resources/fonts/glb12.ttf.xml" embed-url="test/resources/fonts/glb12.ttf"> <font-triplet name="Gladiator" style="normal" weight="normal"/> + <font-triplet name="Gladiator" style="normal" weight="bold"/> </font> <font metrics-url="test/resources/fonts/glb12.ttf.ansi.xml" embed-url="test/resources/fonts/glb12.ttf"> <font-triplet name="Gladiator-Ansi" style="normal" weight="normal"/> + <font-triplet name="Gladiator-Ansi" style="normal" weight="bold"/> </font> <font metrics-url="test/resources/fonts/glb12.ttf.ansi.xml"> <font-triplet name="Gladiator-Non-Embedded" style="normal" weight="normal"/> + <font-triplet name="Gladiator-Non-Embedded" style="normal" weight="bold"/> </font> </fonts> </renderer> diff --git a/test/xml/pdf-a/minimal-pdf-a.fo b/test/xml/pdf-a/minimal-pdf-a.fo index 0081be30b..94adf72e2 100644 --- a/test/xml/pdf-a/minimal-pdf-a.fo +++ b/test/xml/pdf-a/minimal-pdf-a.fo @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Gladiator"> +<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Gladiator" font-weight="bold"> <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="2cm"> <fo:region-body/> diff --git a/test/xml/pdf-a/with-cmyk-images.fo b/test/xml/pdf-a/with-cmyk-images.fo index f3429d304..109829046 100644 --- a/test/xml/pdf-a/with-cmyk-images.fo +++ b/test/xml/pdf-a/with-cmyk-images.fo @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Gladiator"> +<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Gladiator" font-weight="bold"> <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="2cm"> <fo:region-body/> |