1 31 package org.pdfbox.pdmodel.graphics.color; 32 33 import java.awt.color.ColorSpace ; 34 import java.awt.color.ICC_ColorSpace ; 35 import java.io.IOException ; 36 import java.io.OutputStream ; 37 38 import org.pdfbox.cos.COSArray; 39 import org.pdfbox.cos.COSBase; 40 import org.pdfbox.cos.COSFloat; 41 import org.pdfbox.cos.COSName; 42 import org.pdfbox.pdmodel.PDDocument; 43 import org.pdfbox.pdmodel.common.PDStream; 44 45 51 public final class PDColorSpaceFactory 52 { 53 56 private PDColorSpaceFactory() 57 { 58 } 60 61 70 public static PDColorSpace createColorSpace( COSBase colorSpace ) throws IOException 71 { 72 PDColorSpace retval = null; 73 if( colorSpace instanceof COSName ) 74 { 75 retval = createColorSpace( ((COSName)colorSpace).getName() ); 76 } 77 else if( colorSpace instanceof COSArray ) 78 { 79 COSArray array = (COSArray)colorSpace; 80 COSName type = (COSName)array.getObject( 0 ); 81 if( type.getName().equals( PDCalGray.NAME ) ) 82 { 83 retval = new PDCalGray( array ); 84 } 85 else if( type.getName().equals( PDCalRGB.NAME ) ) 86 { 87 retval = new PDCalRGB( array ); 88 } 89 else if( type.getName().equals( PDDeviceN.NAME ) ) 90 { 91 retval = new PDDeviceN( array ); 92 } 93 else if( type.getName().equals( PDIndexed.NAME ) || 94 type.getName().equals( PDIndexed.ABBREVIATED_NAME )) 95 { 96 retval = new PDIndexed( array ); 97 } 98 else if( type.getName().equals( PDLab.NAME ) ) 99 { 100 retval = new PDLab( array ); 101 } 102 else if( type.getName().equals( PDSeparation.NAME ) ) 103 { 104 retval = new PDSeparation( array ); 105 } 106 else if( type.getName().equals( PDICCBased.NAME ) ) 107 { 108 retval = new PDICCBased( array ); 109 } 110 else if( type.getName().equals( PDPattern.NAME ) ) 111 { 112 retval = new PDPattern( array ); 113 } 114 else 115 { 116 throw new IOException ( "Unknown colorspace array type:" + type ); 117 } 118 } 119 else 120 { 121 throw new IOException ( "Unknown colorspace type:" + colorSpace ); 122 } 123 return retval; 124 } 125 126 135 public static PDColorSpace createColorSpace( String colorSpaceName ) throws IOException 136 { 137 PDColorSpace cs = null; 138 if( colorSpaceName.equals( PDDeviceCMYK.NAME ) || 139 colorSpaceName.equals( PDDeviceCMYK.ABBREVIATED_NAME ) ) 140 { 141 cs = PDDeviceCMYK.INSTANCE; 142 } 143 else if( colorSpaceName.equals( PDDeviceRGB.NAME ) || 144 colorSpaceName.equals( PDDeviceRGB.ABBREVIATED_NAME ) ) 145 { 146 cs = PDDeviceRGB.INSTANCE; 147 } 148 else if( colorSpaceName.equals( PDDeviceGray.NAME ) || 149 colorSpaceName.equals( PDDeviceGray.ABBREVIATED_NAME )) 150 { 151 cs = new PDDeviceGray(); 152 } 153 else if( colorSpaceName.equals( PDLab.NAME ) ) 154 { 155 cs = new PDLab(); 156 } 157 else if( colorSpaceName.equals( PDPattern.NAME ) ) 158 { 159 cs = new PDPattern(); 160 } 161 else 162 { 163 throw new IOException ( "Error: Unknown colorspace '" + colorSpaceName + "'" ); 164 } 165 return cs; 166 } 167 168 178 public static PDColorSpace createColorSpace( PDDocument doc, ColorSpace cs ) throws IOException 179 { 180 PDColorSpace retval = null; 181 if( cs.isCS_sRGB() ) 182 { 183 retval = PDDeviceRGB.INSTANCE; 184 } 185 else if( cs instanceof ICC_ColorSpace ) 186 { 187 ICC_ColorSpace ics = (ICC_ColorSpace )cs; 188 PDICCBased pdCS = new PDICCBased( doc ); 189 retval = pdCS; 190 COSArray ranges = new COSArray(); 191 for( int i=0; i<cs.getNumComponents(); i++ ) 192 { 193 ranges.add( new COSFloat( ics.getMinValue( i ) ) ); 194 ranges.add( new COSFloat( ics.getMaxValue( i ) ) ); 195 } 196 PDStream iccData = pdCS.getPDStream(); 197 OutputStream output = null; 198 try 199 { 200 output = iccData.createOutputStream(); 201 output.write( ics.getProfile().getData() ); 202 } 203 finally 204 { 205 if( output != null ) 206 { 207 output.close(); 208 } 209 } 210 pdCS.setNumberOfComponents( cs.getNumComponents() ); 211 } 212 else 213 { 214 throw new IOException ( "Not yet implemented:" + cs ); 215 } 216 return retval; 217 } 218 } | Popular Tags |