Skip to content

Commit c1b45d1

Browse files
committed
Refactor some Pdf/A connected classes. Minor changes
Move some Pdf/A classes to pdfa module. Revise xmp metadata creation. Use OutputIntent instead of OutputIntents PdfName in some cases. Throw Exception while null in Text constructor processing
1 parent 4390a26 commit c1b45d1

File tree

75 files changed

+303
-352
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+303
-352
lines changed

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfDocument.java

Lines changed: 13 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package com.itextpdf.kernel.pdf;
22

3-
import com.itextpdf.kernel.PdfException;
4-
import com.itextpdf.kernel.geom.PageSize;
3+
import com.itextpdf.io.source.ByteArrayOutputStream;
54
import com.itextpdf.io.source.RandomAccessFileOrArray;
5+
import com.itextpdf.kernel.PdfException;
66
import com.itextpdf.kernel.Version;
77
import com.itextpdf.kernel.crypto.BadPasswordException;
88
import com.itextpdf.kernel.events.EventDispatcher;
99
import com.itextpdf.kernel.events.IEventDispatcher;
1010
import com.itextpdf.kernel.events.IEventHandler;
1111
import com.itextpdf.kernel.events.PdfDocumentEvent;
1212
import com.itextpdf.kernel.font.PdfFont;
13+
import com.itextpdf.kernel.geom.PageSize;
1314
import com.itextpdf.kernel.numbering.EnglishAlphabetNumbering;
15+
import com.itextpdf.kernel.numbering.RomanNumbering;
1416
import com.itextpdf.kernel.pdf.annot.PdfAnnotation;
1517
import com.itextpdf.kernel.pdf.annot.PdfLinkAnnotation;
1618
import com.itextpdf.kernel.pdf.annot.PdfWidgetAnnotation;
@@ -19,26 +21,12 @@
1921
import com.itextpdf.kernel.pdf.navigation.PdfExplicitDestination;
2022
import com.itextpdf.kernel.pdf.tagging.PdfStructTreeRoot;
2123
import com.itextpdf.kernel.pdf.tagutils.TagStructureContext;
22-
import com.itextpdf.kernel.xmp.PdfAXMPUtil;
23-
import com.itextpdf.kernel.xmp.PdfConst;
24-
import com.itextpdf.kernel.xmp.XMPConst;
25-
import com.itextpdf.kernel.xmp.XMPException;
26-
import com.itextpdf.kernel.xmp.XMPMeta;
27-
import com.itextpdf.kernel.xmp.XMPMetaFactory;
28-
import com.itextpdf.kernel.xmp.XMPUtils;
24+
import com.itextpdf.kernel.xmp.*;
2925
import com.itextpdf.kernel.xmp.options.PropertyOptions;
3026
import com.itextpdf.kernel.xmp.options.SerializeOptions;
31-
import com.itextpdf.kernel.numbering.RomanNumbering;
3227

3328
import java.io.*;
34-
import java.util.ArrayList;
35-
import java.util.HashMap;
36-
import java.util.HashSet;
37-
import java.util.LinkedHashMap;
38-
import java.util.List;
39-
import java.util.Map;
40-
import java.util.Set;
41-
import java.util.TreeSet;
29+
import java.util.*;
4230

4331
public class PdfDocument implements IEventDispatcher, Closeable, Serializable {
4432

@@ -250,11 +238,7 @@ public void setXmpMetadata(final XMPMeta xmpMeta) throws XMPException {
250238
setXmpMetadata(xmpMeta, serializeOptions);
251239
}
252240

253-
public void setXmpMetadata() throws XMPException {
254-
setXmpMetadata((PdfAConformanceLevel) null);
255-
}
256-
257-
public void setXmpMetadata(PdfAConformanceLevel conformanceLevel) throws XMPException {
241+
public void createXmpMetadata() throws XMPException {
258242
checkClosingStatus();
259243
XMPMeta xmpMeta = XMPMetaFactory.create();
260244
xmpMeta.setObjectName(XMPConst.TAG_XMPMETA);
@@ -300,17 +284,13 @@ public void setXmpMetadata(PdfAConformanceLevel conformanceLevel) throws XMPExce
300284
}
301285
}
302286
if (isTagged()) {
303-
xmpMeta.setPropertyInteger(XMPConst.NS_PDFUA_ID, PdfAXMPUtil.PART, 1, new PropertyOptions(PropertyOptions.SEPARATE_NODE));
304-
}
305-
if (conformanceLevel != null) {
306-
addRdfDescription(xmpMeta, conformanceLevel);
287+
xmpMeta.setPropertyInteger(XMPConst.NS_PDFUA_ID, XMPConst.PART, 1, new PropertyOptions(PropertyOptions.SEPARATE_NODE));
307288
}
308289
setXmpMetadata(xmpMeta);
309290
}
310291

311-
public PdfStream getXmpMetadata() {
312-
checkClosingStatus();
313-
return getCatalog().getPdfObject().getAsStream(PdfName.Metadata);
292+
public byte[] getXmpMetadata() {
293+
return xmpMetadata;
314294
}
315295

316296
public PdfObject getPdfObject(final int objNum) {
@@ -1199,49 +1179,6 @@ protected void markObjectAsMustBeFlushed(PdfObject pdfObject){
11991179
}
12001180
}
12011181

1202-
protected void addRdfDescription(XMPMeta xmpMeta, PdfAConformanceLevel conformanceLevel) throws XMPException {
1203-
switch (conformanceLevel) {
1204-
case PDF_A_1A:
1205-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.PART, "1");
1206-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.CONFORMANCE, "A");
1207-
break;
1208-
case PDF_A_1B:
1209-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.PART, "1");
1210-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.CONFORMANCE, "B");
1211-
break;
1212-
case PDF_A_2A:
1213-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.PART, "2");
1214-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.CONFORMANCE, "A");
1215-
break;
1216-
case PDF_A_2B:
1217-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.PART, "2");
1218-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.CONFORMANCE, "B");
1219-
break;
1220-
case PDF_A_2U:
1221-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.PART, "2");
1222-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.CONFORMANCE, "U");
1223-
break;
1224-
case PDF_A_3A:
1225-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.PART, "3");
1226-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.CONFORMANCE, "A");
1227-
break;
1228-
case PDF_A_3B:
1229-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.PART, "3");
1230-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.CONFORMANCE, "B");
1231-
break;
1232-
case PDF_A_3U:
1233-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.PART, "3");
1234-
xmpMeta.setProperty(XMPConst.NS_PDFA_ID, PdfAXMPUtil.CONFORMANCE, "U");
1235-
break;
1236-
default:
1237-
break;
1238-
}
1239-
if (this.isTagged()) {
1240-
XMPMeta taggedExtensionMeta = XMPMetaFactory.parseFromString(PdfAXMPUtil.PDF_UA_EXTENSION);
1241-
XMPUtils.appendProperties(taggedExtensionMeta, xmpMeta, true, false);
1242-
}
1243-
}
1244-
12451182
protected void flushObject(PdfObject pdfObject, boolean canBeInObjStm) throws IOException {
12461183
writer.flushObject(pdfObject, canBeInObjStm);
12471184
}
@@ -1261,7 +1198,9 @@ protected void open(PdfVersion newPdfVersion) {
12611198
pdfVersion = reader.pdfVersion;
12621199
trailer = new PdfDictionary(reader.trailer);
12631200
catalog = new PdfCatalog((PdfDictionary) trailer.get(PdfName.Root, true));
1264-
1201+
if (catalog.getPdfObject().containsKey(PdfName.Metadata) && null != catalog.getPdfObject().get(PdfName.Metadata)) {
1202+
xmpMetadata = catalog.getPdfObject().getAsStream(PdfName.Metadata).getBytes();
1203+
}
12651204
PdfObject infoDict = trailer.get(PdfName.Info, true);
12661205
info = new PdfDocumentInfo(infoDict instanceof PdfDictionary ?
12671206
(PdfDictionary) infoDict : new PdfDictionary(), this);

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfName.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,7 @@ public class PdfName extends PdfPrimitiveObject implements Comparable<PdfName> {
507507
public static final PdfName Outlines = createDirectName("Outlines");
508508
public static final PdfName OutputCondition = createDirectName("OutputCondition");
509509
public static final PdfName OutputConditionIdentifier = createDirectName("OutputConditionIdentifier");
510+
public static final PdfName OutputIntent = createDirectName("OutputIntent");
510511
public static final PdfName OutputIntents = createDirectName("OutputIntents");
511512
public static final PdfName Outset = createDirectName("Outset");
512513
public static final PdfName Overlay = createDirectName("Overlay");

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfOutputIntent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class PdfOutputIntent extends PdfObjectWrapper<PdfDictionary> {
1616
public PdfOutputIntent(String outputConditionIdentifier, String outputCondition, String registryName, String info, InputStream iccStream) {
1717
super(new PdfDictionary());
1818
setOutputIntentSubtype(PdfName.GTS_PDFA1);
19-
getPdfObject().put(PdfName.Type, PdfName.OutputIntents);
19+
getPdfObject().put(PdfName.Type, PdfName.OutputIntent);
2020
if (outputCondition != null)
2121
setOutputCondition(outputCondition);
2222
if (outputConditionIdentifier != null)

kernel/src/main/java/com/itextpdf/kernel/utils/CompareTool.java

Lines changed: 9 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,51 +3,16 @@
33
import com.itextpdf.io.font.PdfEncodings;
44
import com.itextpdf.io.source.ByteUtils;
55
import com.itextpdf.kernel.geom.Rectangle;
6-
import com.itextpdf.kernel.pdf.PdfArray;
7-
import com.itextpdf.kernel.pdf.PdfBoolean;
8-
import com.itextpdf.kernel.pdf.PdfDictionary;
9-
import com.itextpdf.kernel.pdf.PdfDocument;
10-
import com.itextpdf.kernel.pdf.PdfDocumentInfo;
11-
import com.itextpdf.kernel.pdf.PdfIndirectReference;
12-
import com.itextpdf.kernel.pdf.PdfName;
13-
import com.itextpdf.kernel.pdf.PdfNumber;
14-
import com.itextpdf.kernel.pdf.PdfObject;
15-
import com.itextpdf.kernel.pdf.PdfPage;
16-
import com.itextpdf.kernel.pdf.PdfReader;
17-
import com.itextpdf.kernel.pdf.PdfStream;
18-
import com.itextpdf.kernel.pdf.PdfString;
19-
import com.itextpdf.kernel.pdf.PdfWriter;
6+
import com.itextpdf.kernel.pdf.*;
207
import com.itextpdf.kernel.pdf.annot.PdfAnnotation;
218
import com.itextpdf.kernel.pdf.annot.PdfLinkAnnotation;
22-
import com.itextpdf.kernel.xmp.PdfConst;
23-
import com.itextpdf.kernel.xmp.XMPConst;
24-
import com.itextpdf.kernel.xmp.XMPException;
25-
import com.itextpdf.kernel.xmp.XMPMeta;
26-
import com.itextpdf.kernel.xmp.XMPMetaFactory;
27-
import com.itextpdf.kernel.xmp.XMPUtils;
9+
import com.itextpdf.kernel.xmp.*;
2810
import com.itextpdf.kernel.xmp.options.SerializeOptions;
11+
import org.w3c.dom.Document;
12+
import org.w3c.dom.Element;
13+
import org.w3c.dom.Node;
14+
import org.xml.sax.SAXException;
2915

30-
import java.io.BufferedReader;
31-
import java.io.ByteArrayInputStream;
32-
import java.io.File;
33-
import java.io.FileFilter;
34-
import java.io.FileInputStream;
35-
import java.io.FileOutputStream;
36-
import java.io.IOException;
37-
import java.io.InputStream;
38-
import java.io.InputStreamReader;
39-
import java.io.OutputStream;
40-
import java.util.ArrayList;
41-
import java.util.Arrays;
42-
import java.util.Comparator;
43-
import java.util.LinkedHashMap;
44-
import java.util.LinkedHashSet;
45-
import java.util.List;
46-
import java.util.Map;
47-
import java.util.Set;
48-
import java.util.Stack;
49-
import java.util.StringTokenizer;
50-
import java.util.TreeSet;
5116
import javax.xml.parsers.DocumentBuilder;
5217
import javax.xml.parsers.DocumentBuilderFactory;
5318
import javax.xml.parsers.ParserConfigurationException;
@@ -57,11 +22,8 @@
5722
import javax.xml.transform.TransformerFactory;
5823
import javax.xml.transform.dom.DOMSource;
5924
import javax.xml.transform.stream.StreamResult;
60-
61-
import org.w3c.dom.Document;
62-
import org.w3c.dom.Element;
63-
import org.w3c.dom.Node;
64-
import org.xml.sax.SAXException;
25+
import java.io.*;
26+
import java.util.*;
6527

6628
public class CompareTool {
6729
private static final String cannotOpenOutputDirectory = "Cannot open output directory for <filename>.";
@@ -187,7 +149,7 @@ public String compareXmp(String outPdf, String cmpPdf, boolean ignoreDateAndProd
187149
try {
188150
cmpDocument = new PdfDocument(new PdfReader(this.cmpPdf));
189151
outDocument = new PdfDocument(new PdfReader(this.outPdf));
190-
byte[] cmpBytes = cmpDocument.getXmpMetadata().getBytes(), outBytes = outDocument.getXmpMetadata().getBytes();
152+
byte[] cmpBytes = cmpDocument.getXmpMetadata(), outBytes = outDocument.getXmpMetadata();
191153
if (ignoreDateAndProducerProperties) {
192154
XMPMeta xmpMeta = XMPMetaFactory.parseFromBuffer(cmpBytes);
193155

kernel/src/main/java/com/itextpdf/kernel/xmp/XMPConst.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,4 +205,10 @@ public interface XMPConst
205205
String TAG_XMPMETA = "xmpmeta";
206206
/** XMP meta tag version old */
207207
String TAG_XAPMETA = "xapmeta";
208+
209+
210+
/**
211+
* Part, always 1.
212+
*/
213+
String PART = "part";
208214
}

kernel/src/test/java/com/itextpdf/kernel/pdf/PdfEncryptionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void encryptWithPassword(String filename, int encryptionType, int compres
105105
PdfDocument document = new PdfDocument(writer);
106106
document.getDocumentInfo().setAuthor(author).
107107
setCreator(creator);
108-
document.setXmpMetadata();
108+
document.createXmpMetadata();
109109
PdfPage page = document.addNewPage();
110110
page.getFirstContentStream().getOutputStream().writeBytes(("q\n" +
111111
"BT\n" +

kernel/src/test/java/com/itextpdf/kernel/pdf/PdfStampingTest.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package com.itextpdf.kernel.pdf;
22

33
import com.itextpdf.io.source.ByteUtils;
4-
import com.itextpdf.kernel.utils.CompareTool;
54
import com.itextpdf.kernel.xmp.XMPException;
5+
import com.itextpdf.kernel.xmp.XMPMetaFactory;
66
import com.itextpdf.test.ExtendedITextTest;
77
import com.itextpdf.test.annotations.type.IntegrationTest;
8+
import org.junit.BeforeClass;
9+
import org.junit.Ignore;
10+
import org.junit.Test;
11+
import org.junit.experimental.categories.Category;
812

913
import java.io.File;
1014
import java.io.FileInputStream;
@@ -13,11 +17,6 @@
1317
import java.util.Calendar;
1418
import java.util.GregorianCalendar;
1519

16-
import org.junit.BeforeClass;
17-
import org.junit.Ignore;
18-
import org.junit.Test;
19-
import org.junit.experimental.categories.Category;
20-
2120
import static org.junit.Assert.*;
2221

2322
@Category(IntegrationTest.class)
@@ -765,15 +764,15 @@ public void stampingXmp1() throws IOException, XMPException {
765764
writer2.setFullCompression(false);
766765
PdfDocument pdfDoc2 = new PdfDocument(reader2, writer2);
767766
pdfDoc2.getDocumentInfo().setAuthor("Alexander Chingarev");
768-
pdfDoc2.setXmpMetadata();
767+
pdfDoc2.createXmpMetadata();
769768
pdfDoc2.close();
770769

771770
PdfReader reader3 = new PdfReader(new FileInputStream(filename2));
772771
PdfDocument pdfDoc3 = new PdfDocument(reader3);
773772
for (int i = 0; i < pdfDoc3.getNumberOfPages(); i++) {
774773
pdfDoc3.getPage(i + 1);
775774
}
776-
assertNotNull("XmpMetadata not found", pdfDoc3.getXmpMetadata());
775+
assertNotNull("XmpMetadata not found", XMPMetaFactory.parseFromBuffer(pdfDoc3.getXmpMetadata()));
777776
assertEquals("Number of pages", pageCount, pdfDoc3.getNumberOfPages());
778777
assertEquals("Rebuilt", false, reader3.hasRebuiltXref());
779778
assertEquals("Fixed", false, reader3.hasFixedXref());
@@ -813,15 +812,15 @@ public void stampingXmp2() throws IOException, XMPException {
813812
PdfDocument pdfDoc2 = new PdfDocument(reader2, writer2);
814813
pdfDoc2.getDocumentInfo().setAuthor("Alexander Chingarev");
815814
pdfDoc2.getDocumentInfo().setAuthor("Alexander Chingarev");
816-
pdfDoc2.setXmpMetadata();
815+
pdfDoc2.createXmpMetadata();
817816
pdfDoc2.close();
818817

819818
PdfReader reader3 = new PdfReader(new FileInputStream(filename2));
820819
PdfDocument pdfDoc3 = new PdfDocument(reader3);
821820
for (int i = 0; i < pdfDoc3.getNumberOfPages(); i++) {
822821
pdfDoc3.getPage(i + 1);
823822
}
824-
assertNotNull("XmpMetadata not found", pdfDoc3.getXmpMetadata());
823+
assertNotNull("XmpMetadata not found", XMPMetaFactory.parseFromBuffer(pdfDoc3.getXmpMetadata()));
825824
assertEquals("Number of pages", pageCount, pdfDoc3.getNumberOfPages());
826825
assertEquals("Rebuilt", false, reader3.hasRebuiltXref());
827826
assertEquals("Fixed", false, reader3.hasFixedXref());

kernel/src/test/java/com/itextpdf/kernel/pdf/XMPMetadataTest.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
package com.itextpdf.kernel.pdf;
22

3-
import com.itextpdf.test.annotations.type.IntegrationTest;
43
import com.itextpdf.kernel.xmp.XMPException;
54
import com.itextpdf.test.ExtendedITextTest;
6-
5+
import com.itextpdf.test.annotations.type.IntegrationTest;
6+
import org.junit.AfterClass;
7+
import org.junit.Assert;
8+
import org.junit.BeforeClass;
9+
import org.junit.Test;
10+
import org.junit.experimental.categories.Category;
711

812
import java.io.ByteArrayInputStream;
913
import java.io.ByteArrayOutputStream;
1014
import java.io.FileOutputStream;
1115
import java.io.IOException;
1216
import java.util.TimeZone;
1317

14-
import org.junit.AfterClass;
15-
import org.junit.Assert;
16-
import org.junit.BeforeClass;
17-
import org.junit.Test;
18-
import org.junit.experimental.categories.Category;
19-
2018
@Category(IntegrationTest.class)
2119
public class XMPMetadataTest extends ExtendedITextTest{
2220

@@ -45,15 +43,14 @@ public void createEmptyDocumentWithXmp() throws Exception {
4543
pdfDoc.getDocumentInfo().getPdfObject().remove(PdfName.CreationDate);
4644
PdfPage page = pdfDoc.addNewPage();
4745
page.flush();
48-
pdfDoc.setXmpMetadata();
46+
pdfDoc.createXmpMetadata();
4947
pdfDoc.close();
5048
PdfReader reader = new PdfReader(destinationFolder +filename);
5149
PdfDocument pdfDocument = new PdfDocument(reader);
5250
Assert.assertEquals("Rebuilt", false, reader.hasRebuiltXref());
53-
Assert.assertEquals(readFile(sourceFolder + "emptyDocumentWithXmp.xml").length, pdfDocument.getXmpMetadata().getLength());
51+
Assert.assertEquals(readFile(sourceFolder + "emptyDocumentWithXmp.xml").length, pdfDocument.getXmpMetadata().length);
5452
Assert.assertNotNull(reader.pdfDocument.getPage(1));
5553
reader.close();
56-
5754
}
5855

5956

@@ -74,7 +71,7 @@ public void createEmptyDocumentWithAbcXmp() throws IOException, XMPException {
7471
PdfReader reader = new PdfReader(new ByteArrayInputStream(fos.toByteArray()));
7572
PdfDocument pdfDocument = new PdfDocument(reader);
7673
Assert.assertEquals("Rebuilt", false, reader.hasRebuiltXref());
77-
Assert.assertArrayEquals("abc".getBytes(), pdfDocument.getXmpMetadata().getBytes());
74+
Assert.assertArrayEquals("abc".getBytes(), pdfDocument.getXmpMetadata());
7875
Assert.assertNotNull(pdfDocument.getPage(1));
7976
reader.close();
8077

layout/src/main/java/com/itextpdf/layout/element/Text.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ public class Text extends AbstractElement<Text> implements ILeafElement<Text>, I
2121
* @param text the contents, as a {@link String}
2222
*/
2323
public Text(String text) {
24+
if (null == text) {
25+
throw new IllegalArgumentException();
26+
}
2427
this.text = text;
2528
}
2629

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfAConformanceLevel.java renamed to pdfa/src/main/java/com/itextpdf/pdfa/PdfAConformanceLevel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.itextpdf.kernel.pdf;
1+
package com.itextpdf.pdfa;
22

33
/**
44
* Enumeration of all the PDF/A conformance levels.

0 commit comments

Comments
 (0)