(ref pdfRef)
| 456 | } |
| 457 | |
| 458 | func (r *pdfReader) readObject(ref pdfRef) (any, error) { |
| 459 | if val, ok := r.cache[ref]; ok { |
| 460 | return val, nil |
| 461 | } |
| 462 | obj, ok := r.objects[ref] |
| 463 | if !ok { |
| 464 | return nil, fmt.Errorf("unknown object %v", ref) |
| 465 | } else if obj.free { |
| 466 | return nil, fmt.Errorf("bad object %v is free", ref) |
| 467 | } else if obj.compressed { |
| 468 | iobjectStream, err := r.readObject(pdfRef{obj.object, 0}) |
| 469 | if err != nil { |
| 470 | return nil, err |
| 471 | } |
| 472 | objectStream, ok := iobjectStream.(pdfStream) |
| 473 | if !ok { |
| 474 | return nil, fmt.Errorf("compressed object %v must refer to stream", ref) |
| 475 | } |
| 476 | |
| 477 | b, i := objectStream.data, 0 |
| 478 | object, offset := 0, 0 |
| 479 | for index := 0; index <= obj.offset; index++ { |
| 480 | val, n, err := pdfReadContentVal(b[i:]) |
| 481 | if err != nil { |
| 482 | return nil, fmt.Errorf("invalid stream: %w", err) |
| 483 | } |
| 484 | object, _ = val.(int) |
| 485 | i = moveWhiteSpace(b, i+n) |
| 486 | |
| 487 | val, n, err = pdfReadContentVal(b[i:]) |
| 488 | if err != nil { |
| 489 | return nil, fmt.Errorf("invalid stream: %w", err) |
| 490 | } |
| 491 | offset, _ = val.(int) |
| 492 | i = moveWhiteSpace(b, i+n) |
| 493 | } |
| 494 | if uint32(object) != ref[0] { |
| 495 | return nil, fmt.Errorf("bad object %v: invalid index in compressed object", ref) |
| 496 | } |
| 497 | |
| 498 | first, _ := r.GetInt(objectStream.dict["First"]) |
| 499 | offset += first |
| 500 | if len(b) <= offset { |
| 501 | return nil, fmt.Errorf("bad object %v: invalid offset in compressed object", ref) |
| 502 | } |
| 503 | |
| 504 | val, _, err := pdfReadVal(r, ref, b[offset:]) |
| 505 | if err != nil { |
| 506 | return nil, fmt.Errorf("bad object %v: %w", ref, err) |
| 507 | } |
| 508 | r.cache[ref] = val |
| 509 | return val, nil |
| 510 | } |
| 511 | val, err := r.readObjectAt(ref, obj.offset) |
| 512 | r.cache[ref] = val |
| 513 | return val, err |
| 514 | } |
| 515 |
no test coverage detected