MCPcopy Create free account
hub / github.com/tdewolff/canvas / readCrossReferenceStream

Method readCrossReferenceStream

cmd/pdftext/reader.go:144–248  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

142}
143
144func (r *pdfReader) readCrossReferenceStream() (pdfDict, error) {
145 istream, err := r.readObjectAt(noEncryptRef, r.startxref)
146 if err != nil {
147 return pdfDict{}, fmt.Errorf("invalid cross reference stream: %w", err)
148 }
149 stream, ok := istream.(pdfStream)
150 if !ok {
151 return pdfDict{}, fmt.Errorf("invalid cross reference stream")
152 }
153 size, err := r.GetInt(stream.dict["Size"])
154 if err != nil {
155 return pdfDict{}, fmt.Errorf("invalid cross reference stream")
156 }
157 ws, err := r.GetArray(stream.dict["W"])
158 if err != nil || len(ws) != 3 {
159 return pdfDict{}, fmt.Errorf("invalid cross reference stream")
160 }
161 W := [3]int{}
162 for i, w := range ws {
163 W[i], err = r.GetInt(w)
164 if err != nil || 4 < W[i] {
165 return pdfDict{}, fmt.Errorf("invalid cross reference stream")
166 }
167 }
168 indices := make([]int, size)
169 if _, ok := stream.dict["Index"]; ok {
170 is, err := r.GetArray(stream.dict["Index"])
171 if err != nil {
172 return pdfDict{}, fmt.Errorf("invalid cross reference stream")
173 }
174 d := 0
175 for i := 0; i < len(is); i += 2 {
176 first, err1 := r.GetInt(is[i+0])
177 n, err2 := r.GetInt(is[i+1])
178 if err1 != nil || err2 != nil {
179 return pdfDict{}, fmt.Errorf("invalid cross reference stream")
180 }
181 for j := 0; j < n; j++ {
182 indices[d+j] = first + j
183 }
184 d += n
185 }
186 indices = indices[:d]
187 } else {
188 for i := 0; i < size; i++ {
189 indices[i] = i
190 }
191 }
192 dW := W[0] + W[1] + W[2]
193 if len(stream.data) != dW*size || W[1] == 0 {
194 return pdfDict{}, fmt.Errorf("invalid cross reference stream")
195 }
196 for i := 0; i < size; i++ {
197 if len(indices) <= i {
198 break
199 }
200
201 d := i * dW

Callers 1

readTrailerMethod · 0.95

Calls 5

readObjectAtMethod · 0.95
GetIntMethod · 0.95
GetArrayMethod · 0.95
readTrailerMethod · 0.95
readNumberLEFunction · 0.85

Tested by

no test coverage detected