From b477c1430f5ef6e0081022e76190e69f0386ce62 Mon Sep 17 00:00:00 2001 From: Adrian-George Bostan Date: Thu, 24 Jan 2019 22:21:51 +0200 Subject: [PATCH] Add UpdateParams method to StreamEncoder --- pdf/core/encoding.go | 115 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/pdf/core/encoding.go b/pdf/core/encoding.go index 7d07c1e7..ab1ef230 100644 --- a/pdf/core/encoding.go +++ b/pdf/core/encoding.go @@ -58,6 +58,7 @@ type StreamEncoder interface { GetFilterName() string MakeDecodeParams() PdfObject MakeStreamDict() *PdfObjectDictionary + UpdateParams(params *PdfObjectDictionary) EncodeBytes(data []byte) ([]byte, error) DecodeBytes(encoded []byte) ([]byte, error) @@ -137,6 +138,29 @@ func (enc *FlateEncoder) MakeStreamDict() *PdfObjectDictionary { return dict } +// UpdateParams updates the parameter values of the encoder. +func (enc *FlateEncoder) UpdateParams(params *PdfObjectDictionary) { + predictor, err := GetNumberAsInt64(params.Get("Predictor")) + if err == nil { + enc.Predictor = int(predictor) + } + + bpc, err := GetNumberAsInt64(params.Get("BitsPerComponent")) + if err == nil { + enc.BitsPerComponent = int(bpc) + } + + columns, err := GetNumberAsInt64(params.Get("Width")) + if err == nil { + enc.Columns = int(columns) + } + + colorComponents, err := GetNumberAsInt64(params.Get("ColorComponents")) + if err == nil { + enc.Colors = int(colorComponents) + } +} + // Create a new flate decoder from a stream object, getting all the encoding parameters // from the DecodeParms stream object dictionary entry. func newFlateEncoderFromStream(streamObj *PdfObjectStream, decodeParams *PdfObjectDictionary) (*FlateEncoder, error) { @@ -508,6 +532,34 @@ func (enc *LZWEncoder) MakeStreamDict() *PdfObjectDictionary { return dict } +// UpdateParams updates the parameter values of the encoder. +func (enc *LZWEncoder) UpdateParams(params *PdfObjectDictionary) { + predictor, err := GetNumberAsInt64(params.Get("Predictor")) + if err == nil { + enc.Predictor = int(predictor) + } + + bpc, err := GetNumberAsInt64(params.Get("BitsPerComponent")) + if err == nil { + enc.BitsPerComponent = int(bpc) + } + + columns, err := GetNumberAsInt64(params.Get("Width")) + if err == nil { + enc.Columns = int(columns) + } + + colorComponents, err := GetNumberAsInt64(params.Get("ColorComponents")) + if err == nil { + enc.Colors = int(colorComponents) + } + + earlyChange, err := GetNumberAsInt64(params.Get("EarlyChange")) + if err == nil { + enc.EarlyChange = int(earlyChange) + } +} + // Create a new LZW encoder/decoder from a stream object, getting all the encoding parameters // from the DecodeParms stream object dictionary entry. func newLZWEncoderFromStream(streamObj *PdfObjectStream, decodeParams *PdfObjectDictionary) (*LZWEncoder, error) { @@ -825,6 +877,34 @@ func (enc *DCTEncoder) MakeStreamDict() *PdfObjectDictionary { return dict } +// UpdateParams updates the parameter values of the encoder. +func (enc *DCTEncoder) UpdateParams(params *PdfObjectDictionary) { + colorComponents, err := GetNumberAsInt64(params.Get("ColorComponents")) + if err == nil { + enc.ColorComponents = int(colorComponents) + } + + bpc, err := GetNumberAsInt64(params.Get("BitsPerComponent")) + if err == nil { + enc.BitsPerComponent = int(bpc) + } + + width, err := GetNumberAsInt64(params.Get("Width")) + if err == nil { + enc.Width = int(width) + } + + height, err := GetNumberAsInt64(params.Get("Height")) + if err == nil { + enc.Height = int(height) + } + + quality, err := GetNumberAsInt64(params.Get("Quality")) + if err == nil { + enc.Quality = int(quality) + } +} + // Create a new DCT encoder/decoder from a stream object, getting all the encoding parameters // from the stream object dictionary entry and the image data itself. // TODO: Support if used with other filters [ASCII85Decode FlateDecode DCTDecode]... @@ -1240,6 +1320,10 @@ func (enc *RunLengthEncoder) MakeStreamDict() *PdfObjectDictionary { return dict } +// UpdateParams updates the parameter values of the encoder. +func (enc *RunLengthEncoder) UpdateParams(params *PdfObjectDictionary) { +} + // ASCIIHexEncoder implements ASCII hex encoder/decoder. type ASCIIHexEncoder struct { } @@ -1265,6 +1349,10 @@ func (enc *ASCIIHexEncoder) MakeStreamDict() *PdfObjectDictionary { return dict } +// UpdateParams updates the parameter values of the encoder. +func (enc *ASCIIHexEncoder) UpdateParams(params *PdfObjectDictionary) { +} + func (enc *ASCIIHexEncoder) DecodeBytes(encoded []byte) ([]byte, error) { bufReader := bytes.NewReader(encoded) var inb []byte @@ -1339,6 +1427,10 @@ func (enc *ASCII85Encoder) MakeStreamDict() *PdfObjectDictionary { return dict } +// UpdateParams updates the parameter values of the encoder. +func (enc *ASCII85Encoder) UpdateParams(params *PdfObjectDictionary) { +} + // DecodeBytes decodes byte array with ASCII85. 5 ASCII characters -> 4 raw binary bytes func (enc *ASCII85Encoder) DecodeBytes(encoded []byte) ([]byte, error) { var decoded []byte @@ -1504,6 +1596,10 @@ func (enc *RawEncoder) MakeStreamDict() *PdfObjectDictionary { return MakeDict() } +// UpdateParams updates the parameter values of the encoder. +func (enc *RawEncoder) UpdateParams(params *PdfObjectDictionary) { +} + func (enc *RawEncoder) DecodeBytes(encoded []byte) ([]byte, error) { return encoded, nil } @@ -1537,6 +1633,10 @@ func (enc *CCITTFaxEncoder) MakeStreamDict() *PdfObjectDictionary { return MakeDict() } +// UpdateParams updates the parameter values of the encoder. +func (enc *CCITTFaxEncoder) UpdateParams(params *PdfObjectDictionary) { +} + func (enc *CCITTFaxEncoder) DecodeBytes(encoded []byte) ([]byte, error) { common.Log.Debug("Error: Attempting to use unsupported encoding %s", enc.GetFilterName()) return encoded, ErrNoCCITTFaxDecode @@ -1573,6 +1673,10 @@ func (enc *JBIG2Encoder) MakeStreamDict() *PdfObjectDictionary { return MakeDict() } +// UpdateParams updates the parameter values of the encoder. +func (enc *JBIG2Encoder) UpdateParams(params *PdfObjectDictionary) { +} + func (enc *JBIG2Encoder) DecodeBytes(encoded []byte) ([]byte, error) { common.Log.Debug("Error: Attempting to use unsupported encoding %s", enc.GetFilterName()) return encoded, ErrNoJBIG2Decode @@ -1609,6 +1713,10 @@ func (enc *JPXEncoder) MakeStreamDict() *PdfObjectDictionary { return MakeDict() } +// UpdateParams updates the parameter values of the encoder. +func (enc *JPXEncoder) UpdateParams(params *PdfObjectDictionary) { +} + func (enc *JPXEncoder) DecodeBytes(encoded []byte) ([]byte, error) { common.Log.Debug("Error: Attempting to use unsupported encoding %s", enc.GetFilterName()) return encoded, ErrNoJPXDecode @@ -1807,6 +1915,13 @@ func (enc *MultiEncoder) MakeStreamDict() *PdfObjectDictionary { return dict } +// UpdateParams updates the parameter values of the encoder. +func (enc *MultiEncoder) UpdateParams(params *PdfObjectDictionary) { + for _, encoder := range enc.encoders { + encoder.UpdateParams(params) + } +} + func (enc *MultiEncoder) DecodeBytes(encoded []byte) ([]byte, error) { decoded := encoded var err error