@@ -259,7 +259,7 @@ func imageForCMYKWithoutSoftMask(im *PDFImage) image.Image {
259259 for y := 0 ; y < im .h ; y ++ {
260260 for x := 0 ; x < im .w ; x ++ {
261261 img .Set (x , y , color.CMYK {C : b [i ], M : b [i + 1 ], Y : b [i + 2 ], K : b [i + 3 ]})
262- i += 4
262+ i += im . comp
263263 }
264264 }
265265
@@ -773,25 +773,45 @@ func renderIndexed(xRefTable *model.XRefTable, im *PDFImage, resourceName string
773773}
774774
775775func renderDeviceN (xRefTable * model.XRefTable , im * PDFImage , resourceName string , cs types.Array ) (io.Reader , string , error ) {
776+ if im .comp <= 4 {
777+ switch im .comp {
778+ case 1 :
779+ // Gray
780+ return renderDeviceGrayToPNG (im , resourceName )
776781
777- switch im .comp {
778- case 1 :
782+ case 3 :
783+ // RGB
784+ return renderDeviceRGBToPNG (im , resourceName )
785+
786+ case 4 :
787+ // CMYK
788+ return renderDeviceCMYKToTIFF (im , resourceName )
789+ }
790+ }
791+
792+ alternateCS , ok := cs [2 ].(types.Name )
793+ if ! ok {
794+ return nil , "" , nil
795+ }
796+
797+ switch alternateCS {
798+ case model .DeviceGrayCS :
779799 // Gray
780800 return renderDeviceGrayToPNG (im , resourceName )
781801
782- case 3 :
802+ case model . DeviceRGBCS :
783803 // RGB
784804 return renderDeviceRGBToPNG (im , resourceName )
785805
786- case 4 :
806+ case model . DeviceCMYKCS :
787807 // CMYK
788808 return renderDeviceCMYKToTIFF (im , resourceName )
789809 }
790810
791811 return nil , "" , nil
792812}
793813
794- func renderFlateEncodedImage (xRefTable * model.XRefTable , sd * types.StreamDict , thumb bool , resourceName string , objNr int ) (io.Reader , string , error ) {
814+ func renderImage (xRefTable * model.XRefTable , sd * types.StreamDict , thumb bool , resourceName string , objNr int ) (io.Reader , string , error ) {
795815 // If color space is CMYK then write .tif else write .png
796816
797817 pdfImage , err := pdfImage (xRefTable , sd , thumb , objNr )
@@ -820,7 +840,7 @@ func renderFlateEncodedImage(xRefTable *model.XRefTable, sd *types.StreamDict, t
820840
821841 default :
822842 if log .InfoEnabled () {
823- log .Info .Printf ("renderFlateEncodedImage : objNr=%d, unsupported name colorspace %s\n " , objNr , cs .String ())
843+ log .Info .Printf ("renderImage : objNr=%d, unsupported name colorspace %s\n " , objNr , cs .String ())
824844 }
825845 }
826846
@@ -846,7 +866,7 @@ func renderFlateEncodedImage(xRefTable *model.XRefTable, sd *types.StreamDict, t
846866
847867 default :
848868 if log .InfoEnabled () {
849- log .Info .Printf ("renderFlateEncodedImage : objNr=%d, unsupported array colorspace %s\n " , objNr , csn )
869+ log .Info .Printf ("renderImage : objNr=%d, unsupported array colorspace %s\n " , objNr , csn )
850870 }
851871 }
852872
@@ -908,12 +928,16 @@ func renderDCTToPNG(xRefTable *model.XRefTable, sd *types.StreamDict, thumb bool
908928func RenderImage (xRefTable * model.XRefTable , sd * types.StreamDict , thumb bool , resourceName string , objNr int ) (io.Reader , string , error ) {
909929 // Image compression is the last filter in the pipeline.
910930
931+ if len (sd .FilterPipeline ) == 0 {
932+ return renderImage (xRefTable , sd , thumb , resourceName , objNr )
933+ }
934+
911935 f := sd .FilterPipeline [len (sd .FilterPipeline )- 1 ].Name
912936
913937 switch f {
914938
915939 case filter .Flate , filter .CCITTFax , filter .RunLength :
916- return renderFlateEncodedImage (xRefTable , sd , thumb , resourceName , objNr )
940+ return renderImage (xRefTable , sd , thumb , resourceName , objNr )
917941
918942 case filter .DCT :
919943 if sd .CSComponents == 4 {
0 commit comments