Uploaded image for project: 'PDFBox'
  1. PDFBox
  2. PDFBOX-1564

Extending COSName to produce PDF/A with correct OutputIntents

    Details

    • Type: Improvement
    • Status: Closed
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 1.8.2
    • Fix Version/s: 1.8.3, 2.0.0
    • Component/s: None
    • Labels:
      None

      Description

      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); DestOutputProfile dop = new DestOutputProfile(doc,colorProfile, 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();

      /* Here you have to download .icc profile */
      InputStream colorProfile =
      OutputIntents.class.getResourceAsStream("/test/color/sRGB.icc");

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

        Attachments

        1. create-pdfa.patch
          12 kB
          Guillaume Bailleul
        2. create-pdfa-2.patch
          12 kB
          Guillaume Bailleul

          Issue Links

            Activity

              People

              • Assignee:
                gbm.bailleul Guillaume Bailleul
                Reporter:
                elyesl Elyes Lehtihet
              • Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:

                  Time Tracking

                  Estimated:
                  Original Estimate - 1h
                  1h
                  Remaining:
                  Remaining Estimate - 1h
                  1h
                  Logged:
                  Time Spent - Not Specified
                  Not Specified