This repository has been archived by the owner on Aug 7, 2021. It is now read-only.
forked from pdfcpu/pdfcpu
/
filter.go
147 lines (105 loc) · 2.98 KB
/
filter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package pdfcpu
// See 7.4 for a list of the defined filters.
import (
"bytes"
"io"
"github.com/hhrutter/pdfcpu/pkg/filter"
"github.com/hhrutter/pdfcpu/pkg/log"
)
func parmsForFilter(d *PDFDict) map[string]int {
m := map[string]int{}
if d == nil {
return m
}
for k, v := range d.Dict {
i, ok := v.(PDFInteger)
if !ok {
continue
}
m[k] = i.Value()
}
return m
}
// encodeStream encodes stream dict data by applying its filter pipeline.
func encodeStream(sd *PDFStreamDict) error {
log.Debug.Printf("encodeStream begin")
// No filter specified, nothing to encode.
if sd.FilterPipeline == nil {
log.Debug.Println("encodeStream: returning uncompressed stream.")
sd.Raw = sd.Content
streamLength := int64(len(sd.Raw))
sd.StreamLength = &streamLength
sd.Insert("Length", PDFInteger(streamLength))
return nil
}
var b io.Reader
b = bytes.NewReader(sd.Content)
var c *bytes.Buffer
// Apply each filter in the pipeline to result of preceding filter.
for _, f := range sd.FilterPipeline {
if f.DecodeParms != nil {
log.Debug.Printf("encodeStream: encoding filter:%s\ndecodeParms:%s\n", f.Name, f.DecodeParms)
} else {
log.Debug.Printf("encodeStream: encoding filter:%s\n", f.Name)
}
// make parms map[string]int
parms := parmsForFilter(f.DecodeParms)
fi, err := filter.NewFilter(f.Name, parms)
if err != nil {
return err
}
c, err = fi.Encode(b)
if err != nil {
return err
}
b = c
}
sd.Raw = c.Bytes()
streamLength := int64(len(sd.Raw))
sd.StreamLength = &streamLength
sd.Insert("Length", PDFInteger(streamLength))
log.Debug.Printf("encodeStream end")
return nil
}
// decodeStream decodes streamDict data by applying its filter pipeline.
func decodeStream(sd *PDFStreamDict) error {
log.Debug.Printf("decodeStream begin \n%s\n", sd)
if sd.Content != nil {
// This stream has already been decoded.
return nil
}
// No filter specified, nothing to decode.
if sd.FilterPipeline == nil {
log.Debug.Println("decodeStream: returning uncompressed stream.")
sd.Content = sd.Raw
return nil
}
var b io.Reader
b = bytes.NewReader(sd.Raw)
//fmt.Printf("decodedStream before:\n%s\n", hex.Dump(sd.Raw))
var c *bytes.Buffer
// Apply each filter in the pipeline to result of preceding filter.
for _, f := range sd.FilterPipeline {
if f.DecodeParms != nil {
log.Debug.Printf("decodeStream: decoding filter:%s\ndecodeParms:%s\n", f.Name, f.DecodeParms)
} else {
log.Debug.Printf("decodeStream: decoding filter:%s\n", f.Name)
}
// make parms map[string]int
parms := parmsForFilter(f.DecodeParms)
fi, err := filter.NewFilter(f.Name, parms)
if err != nil {
return err
}
c, err = fi.Decode(b)
if err != nil {
return err
}
//fmt.Printf("decodedStream after:%s\n%s\n", f.Name, hex.Dump(c.Bytes()))
b = c
}
sd.Content = c.Bytes()
//fmt.Printf("decodedStream returning %d(#%02x)bytes: \n%s\n", len(sd.Content), len(sd.Content), hex.Dump(c.Bytes()))
log.Debug.Printf("decodeStream end")
return nil
}