Add UpdateParams method to StreamEncoder

This commit is contained in:
Adrian-George Bostan 2019-01-24 22:21:51 +02:00
parent 195105ee56
commit b477c1430f

View File

@ -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