@@ -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
502502func 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
12901290func 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.
14161431func 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