Skip to content

Commit 91619f0

Browse files
fancycodehhrutter
authored andcommitted
Write out LazyObjectStreamObject without temporary decoding.
1 parent df5d53d commit 91619f0

File tree

3 files changed

+19
-6
lines changed

3 files changed

+19
-6
lines changed

pkg/pdfcpu/model/dereference.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func ProcessRefCounts(xRefTable *XRefTable, o types.Object) {
6161
}
6262
}
6363

64-
func (xRefTable *XRefTable) indRefToObject(ir *types.IndirectRef) (types.Object, error) {
64+
func (xRefTable *XRefTable) indRefToObject(ir *types.IndirectRef, decodeLazy bool) (types.Object, error) {
6565
if ir == nil {
6666
return nil, errors.New("pdfcpu: indRefToObject: input argument is nil")
6767
}
@@ -76,7 +76,7 @@ func (xRefTable *XRefTable) indRefToObject(ir *types.IndirectRef) (types.Object,
7676

7777
xRefTable.CurObj = int(ir.ObjectNumber)
7878

79-
if l, ok := entry.Object.(*types.LazyObjectStreamObject); ok {
79+
if l, ok := entry.Object.(*types.LazyObjectStreamObject); ok && decodeLazy {
8080
ob, err := l.DecodedObject(context.TODO())
8181
if err != nil {
8282
return nil, err
@@ -98,7 +98,17 @@ func (xRefTable *XRefTable) Dereference(o types.Object) (types.Object, error) {
9898
return o, nil
9999
}
100100

101-
return xRefTable.indRefToObject(&ir)
101+
return xRefTable.indRefToObject(&ir, true)
102+
}
103+
104+
func (xRefTable *XRefTable) DereferenceForWrite(o types.Object) (types.Object, error) {
105+
ir, ok := o.(types.IndirectRef)
106+
if !ok {
107+
// Nothing do dereference.
108+
return o, nil
109+
}
110+
111+
return xRefTable.indRefToObject(&ir, false)
102112
}
103113

104114
// DereferenceBoolean resolves and validates a boolean object, which may be an indirect reference.

pkg/pdfcpu/model/xreftable.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,7 @@ func (xRefTable *XRefTable) Catalog() (types.Dict, error) {
982982
return nil, errors.New("pdfcpu: Catalog: missing root dict")
983983
}
984984

985-
o, err := xRefTable.indRefToObject(xRefTable.Root)
985+
o, err := xRefTable.indRefToObject(xRefTable.Root, true)
986986
if err != nil || o == nil {
987987
return nil, err
988988
}
@@ -999,7 +999,7 @@ func (xRefTable *XRefTable) Catalog() (types.Dict, error) {
999999

10001000
// EncryptDict returns a pointer to the root object / catalog.
10011001
func (xRefTable *XRefTable) EncryptDict() (types.Dict, error) {
1002-
o, err := xRefTable.indRefToObject(xRefTable.Encrypt)
1002+
o, err := xRefTable.indRefToObject(xRefTable.Encrypt, true)
10031003
if err != nil || o == nil {
10041004
return nil, err
10051005
}

pkg/pdfcpu/writeObjects.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,9 @@ func writeObjectGeneric(ctx *model.Context, o types.Object, objNr, genNr int) (e
673673
case types.Name:
674674
err = writeNameObject(ctx, objNr, genNr, o)
675675

676+
case *types.LazyObjectStreamObject:
677+
err = writeObject(ctx, objNr, genNr, o.PDFString())
678+
676679
default:
677680
err = errors.Errorf("writeIndirectObject: undefined PDF object #%d %T\n", objNr, o)
678681
}
@@ -691,7 +694,7 @@ func writeIndirectObject(ctx *model.Context, ir types.IndirectRef) error {
691694
return nil
692695
}
693696

694-
o, err := ctx.Dereference(ir)
697+
o, err := ctx.DereferenceForWrite(ir)
695698
if err != nil {
696699
return errors.Wrapf(err, "writeIndirectObject: unable to dereference indirect object #%d", objNr)
697700
}

0 commit comments

Comments
 (0)