You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by Elyes Lehtihet <el...@gmail.com> on 2013/04/12 10:41:20 UTC

Extending COSName to produce PDF/A with correct OutputIntents

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);

Re: Extending COSName to produce PDF/A with correct OutputIntents

Posted by Guillaume Bailleul <gb...@gmail.com>.
Hi Elyes,

Thanks for your contribution.

I just have one side  question. Did you validate your PDF/A with other
validators than preflight ?

KR,

Guillaume


On Fri, Apr 12, 2013 at 11:30 AM, Timo Boehme <ti...@ontochem.com>wrote:

> Dear Elyes,
>
> thank you for the contribution. Could you please open an improvement issue
> with the code attached here:
> https://issues.apache.org/**jira/browse/PDFBOX<https://issues.apache.org/jira/browse/PDFBOX>
> .
>
> Thanks,
> Timo
>
> Am 12.04.2013 10:41, schrieb Elyes Lehtihet:
>
>  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 <http://www.color.org>");
>>
>> COSArray outputIntents = new COSArray();
>> outputIntents.add(oi);
>>
>> root.setItem("OutputIntents", outputIntents);
>>
>>
>
> --
>
>  Timo Boehme
>  OntoChem GmbH
>  H.-Damerow-Str. 4
>  06120 Halle/Saale
>  T: +49 345 4780474
>  F: +49 345 4780471
>  timo.boehme@ontochem.com
>
> ______________________________**______________________________**_________
>
>  OntoChem GmbH
>  Geschäftsführer: Dr. Lutz Weber
>  Sitz: Halle / Saale
>  Registergericht: Stendal
>  Registernummer: HRB 215461
> ______________________________**______________________________**_________
>
>

Re: Extending COSName to produce PDF/A with correct OutputIntents

Posted by Timo Boehme <ti...@ontochem.com>.
Dear Elyes,

thank you for the contribution. Could you please open an improvement 
issue with the code attached here:
https://issues.apache.org/jira/browse/PDFBOX.

Thanks,
Timo

Am 12.04.2013 10:41, schrieb Elyes Lehtihet:
> 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);
>


-- 

  Timo Boehme
  OntoChem GmbH
  H.-Damerow-Str. 4
  06120 Halle/Saale
  T: +49 345 4780474
  F: +49 345 4780471
  timo.boehme@ontochem.com

_____________________________________________________________________

  OntoChem GmbH
  Geschäftsführer: Dr. Lutz Weber
  Sitz: Halle / Saale
  Registergericht: Stendal
  Registernummer: HRB 215461
_____________________________________________________________________