Skip to content

Commit d5fd063

Browse files
committed
Fix #807
1 parent 8f3e992 commit d5fd063

File tree

2 files changed

+34
-18
lines changed

2 files changed

+34
-18
lines changed

pkg/pdfcpu/model/xreftable.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1835,13 +1835,6 @@ func (xRefTable *XRefTable) consolidateResourcesWithContent(pageDict, resDict ty
18351835
return nil
18361836
}
18371837

1838-
if obj, found := pageDict.Find("Resources"); found {
1839-
if _, ok := obj.(types.IndirectRef); !ok {
1840-
return nil
1841-
}
1842-
1843-
}
1844-
18451838
bb, err := xRefTable.PageContent(pageDict)
18461839
if err != nil {
18471840
if err == ErrNoContent {

pkg/pdfcpu/optimize.go

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ func pageFonts(ctx *model.Context, pageNumber int) types.IntSet {
249249
return pageFonts
250250
}
251251

252-
func registerFontDict(ctx *model.Context, fontDict types.Dict, fName, rName, prefix string, objNr int) {
252+
func registerFontDictObjNr(ctx *model.Context, fName string, objNr int) {
253253
if log.OptimizeEnabled() {
254254
log.Optimize.Printf("optimizeFontResourcesDict: adding new font %s obj#%d\n", fName, objNr)
255255
}
@@ -332,7 +332,7 @@ func optimizeFontResourcesDict(ctx *model.Context, rDict types.Dict, pageNumber,
332332
continue
333333
}
334334

335-
registerFontDict(ctx, fontDict, fName, rName, prefix, objNr)
335+
registerFontDictObjNr(ctx, fName, objNr)
336336

337337
ctx.Optimize.FontObjects[objNr] =
338338
&model.FontObject{
@@ -436,7 +436,7 @@ func optimizeXObjectImage(ctx *model.Context, osd *types.StreamDict, rName strin
436436
return nil, nil
437437
}
438438

439-
func optimizeXObjectForm(ctx *model.Context, sd *types.StreamDict, rName string, objNr int) (*types.IndirectRef, error) {
439+
func optimizeXObjectForm(ctx *model.Context, sd *types.StreamDict, objNr int) (*types.IndirectRef, error) {
440440

441441
f := ctx.Optimize.FormStreamCache
442442
if len(f) == 0 {
@@ -501,7 +501,7 @@ func visited(o types.Object, visited []types.Object) bool {
501501

502502
func optimizeForm(ctx *model.Context, osd *types.StreamDict, rName string, rDict types.Dict, objNr, pageNumber, pageObjNumber int, vis []types.Object) error {
503503

504-
ir, err := optimizeXObjectForm(ctx, osd, rName, objNr)
504+
ir, err := optimizeXObjectForm(ctx, osd, objNr)
505505
if err != nil {
506506
return err
507507
}
@@ -1232,7 +1232,7 @@ func calcBinarySizes(ctx *model.Context) error {
12321232
return nil
12331233
}
12341234

1235-
func fixDeepDict(ctx *model.Context, d types.Dict, objNr, genNr int) error {
1235+
func fixDeepDict(ctx *model.Context, d types.Dict) error {
12361236
for k, v := range d {
12371237
ir, err := fixDeepObject(ctx, v)
12381238
if err != nil {
@@ -1246,7 +1246,7 @@ func fixDeepDict(ctx *model.Context, d types.Dict, objNr, genNr int) error {
12461246
return nil
12471247
}
12481248

1249-
func fixDeepArray(ctx *model.Context, a types.Array, objNr, genNr int) error {
1249+
func fixDeepArray(ctx *model.Context, a types.Array) error {
12501250
for i, v := range a {
12511251
ir, err := fixDeepObject(ctx, v)
12521252
if err != nil {
@@ -1289,7 +1289,6 @@ func fixDirectObject(ctx *model.Context, o types.Object) error {
12891289

12901290
func fixIndirectObject(ctx *model.Context, ir *types.IndirectRef) error {
12911291
objNr := int(ir.ObjectNumber)
1292-
genNr := int(ir.GenerationNumber)
12931292

12941293
if ctx.Optimize.Cache[objNr] {
12951294
return nil
@@ -1324,13 +1323,13 @@ func fixIndirectObject(ctx *model.Context, ir *types.IndirectRef) error {
13241323
switch o := entry.Object.(type) {
13251324

13261325
case types.Dict:
1327-
err = fixDeepDict(ctx, o, objNr, genNr)
1326+
err = fixDeepDict(ctx, o)
13281327

13291328
case types.StreamDict:
1330-
err = fixDeepDict(ctx, o.Dict, objNr, genNr)
1329+
err = fixDeepDict(ctx, o.Dict)
13311330

13321331
case types.Array:
1333-
err = fixDeepArray(ctx, o, objNr, genNr)
1332+
err = fixDeepArray(ctx, o)
13341333

13351334
}
13361335

@@ -1398,7 +1397,7 @@ func cacheFormFonts(ctx *model.Context) error {
13981397
log.Optimize.Printf("optimizeFontResourcesDict: baseFont: prefix=%s name=%s\n", prefix, fName)
13991398
}
14001399

1401-
registerFontDict(ctx, fontDict, fName, rName, prefix, objNr)
1400+
registerFontDictObjNr(ctx, fName, objNr)
14021401

14031402
ctx.Optimize.FormFontObjects[objNr] =
14041403
&model.FontObject{
@@ -1412,6 +1411,22 @@ func cacheFormFonts(ctx *model.Context) error {
14121411
return nil
14131412
}
14141413

1414+
func optimizeResourceDicts(ctx *model.Context) error {
1415+
for i := 1; i <= ctx.PageCount; i++ {
1416+
d, _, inhPAttrs, err := ctx.PageDict(i, true)
1417+
if err != nil {
1418+
return err
1419+
}
1420+
if d == nil {
1421+
continue
1422+
}
1423+
if len(inhPAttrs.Resources) > 0 {
1424+
d["Resources"] = inhPAttrs.Resources
1425+
}
1426+
}
1427+
return nil
1428+
}
1429+
14151430
// OptimizeXRefTable optimizes an xRefTable by locating and getting rid of redundant embedded fonts and images.
14161431
func OptimizeXRefTable(ctx *model.Context) error {
14171432
if log.InfoEnabled() {
@@ -1433,6 +1448,14 @@ func OptimizeXRefTable(ctx *model.Context) error {
14331448
return err
14341449
}
14351450

1451+
if ctx.Cmd == model.OPTIMIZE {
1452+
// Consolidate resource dicts.
1453+
// Extra step with potential for performance hit when processing large files.
1454+
if err := optimizeResourceDicts(ctx); err != nil {
1455+
return err
1456+
}
1457+
}
1458+
14361459
// Get rid of duplicate embedded fonts and images.
14371460
if err := optimizeFontAndImages(ctx); err != nil {
14381461
return err

0 commit comments

Comments
 (0)