Hello, First of all, thanks for this tool, found it very useful. Below some sample code to include (sRGB) ICC profile and corresponding OutputIntents to the generated PDF/A. The produced PDF successfully passes validation. It would be nice to have the COSName' extension included in the next release so we won't have to use a homemade build. Regards, Elyes
---- * Extension in COSName (org.apache.pdfbox.cos) public static final COSName OutputIntents = new COSName( "OutputIntents" ); public static final COSName OutputIntent = new COSName( "OutputIntent" ); public static final COSName DestOutputProfile = new COSName( "DestOutputProfile" ); * Add new classes public class OutputIntents implements COSObjectable { private COSDictionary dictionary; public OutputIntents(PDDocument doc, InputStream colorProfile) throws Exception{ dictionary = new COSDictionary(); dictionary.setItem(COSName.TYPE, COSName.OutputIntent); dictionary.setItem(COSName.S, COSName.GTS_PDFA1); /* Here you have to download .icc profile */ InputStream is = OutputIntents.class.getResourceAsStream("/test/color/sRGB.icc"); DestOutputProfile dop = new DestOutputProfile(doc,is, false); dop.configure(); dictionary.setItem(COSName.DestOutputProfile, dop); } public COSBase getCOSObject() { return dictionary; } public COSDictionary getDictionary() { return dictionary; } public void setInfo( String value ) { dictionary.setString("Info", value); } public void setOutputCondition( String value ) { dictionary.setString("OutputCondition", value); } public void setOutputConditionIdentifier( String value ) { dictionary.setString("OutputConditionIdentifier", value); } public void setRegistryName( String value ) { dictionary.setString("RegistryName", value); } } public class DestOutputProfile extends PDStream { public DestOutputProfile(PDDocument document) { super(document); } public DestOutputProfile(COSStream str) { super(str); } public DestOutputProfile(PDDocument doc, InputStream str) throws IOException { super(doc, str); } public DestOutputProfile(PDDocument doc, InputStream str, boolean filtered) throws IOException { super(doc, str, filtered); } public void configure(){ try { getStream().setFilters(COSName.FLATE_DECODE); getStream().setInt( COSName.LENGTH, getByteArray().length ); getStream().setInt(COSName.N, 3); addCompression(); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } } } * Sample code to include output intent PDDocumentCatalog cat = doc.getDocumentCatalog(); COSDictionary root = (COSDictionary)cat.getCOSObject(); OutputIntents oi = new OutputIntents(doc, colorProfile); oi.setInfo("sRGB IEC61966-2.1"); oi.setOutputCondition("sRGB IEC61966-2.1"); oi.setOutputConditionIdentifier("sRGB IEC61966-2.1"); oi.setRegistryName("http://www.color.org"); COSArray outputIntents = new COSArray(); outputIntents.add(oi); root.setItem("OutputIntents", outputIntents);