Skip to content

Commit

Permalink
Fix #624
Browse files Browse the repository at this point in the history
  • Loading branch information
hhrutter committed Jun 30, 2023
1 parent b17ba03 commit 05d0e93
Showing 1 changed file with 21 additions and 7 deletions.
28 changes: 21 additions & 7 deletions pkg/pdfcpu/optimize.go
Original file line number Diff line number Diff line change
Expand Up @@ -462,21 +462,30 @@ func optimizeXObjectForm(ctx *model.Context, sd *types.StreamDict, rName string,
return nil, nil
}

func optimizeFormResources(ctx *model.Context, o types.Object, pageNumber, pageObjNumber int) error {
func optimizeFormResources(ctx *model.Context, o types.Object, pageNumber, pageObjNumber int, visitedRes []types.Object) error {
d, err := ctx.DereferenceDict(o)
if err != nil {
return err
}
if d != nil {
// Optimize image and font resources.
if err = optimizeResources(ctx, d, pageNumber, pageObjNumber); err != nil {
if err = optimizeResources(ctx, d, pageNumber, pageObjNumber, visitedRes); err != nil {
return err
}
}
return nil
}

func optimizeXObjectResourcesDict(ctx *model.Context, rDict types.Dict, pageNumber, pageObjNumber int) error {
func visited(o types.Object, visited []types.Object) bool {
for _, obj := range visited {
if obj == o {
return true
}
}
return false
}

func optimizeXObjectResourcesDict(ctx *model.Context, rDict types.Dict, pageNumber, pageObjNumber int, vis []types.Object) error {
log.Optimize.Printf("optimizeXObjectResourcesDict page#%dbegin: %s\n", pageObjNumber, rDict)
pageImages := pageImages(ctx, pageNumber)

Expand All @@ -487,6 +496,11 @@ func optimizeXObjectResourcesDict(ctx *model.Context, rDict types.Dict, pageNumb
continue
}

if visited(indRef, vis) {
continue
}
vis = append(vis, indRef)

log.Optimize.Printf("optimizeXObjectResourcesDict: processing xobject: %s, %s\n", rName, indRef)
objNr := int(indRef.ObjectNumber)
log.Optimize.Printf("optimizeXObjectResourcesDict: objectNumber = %d\n", objNr)
Expand Down Expand Up @@ -531,7 +545,7 @@ func optimizeXObjectResourcesDict(ctx *model.Context, rDict types.Dict, pageNumb
continue
}

if err := optimizeFormResources(ctx, o, pageNumber, pageObjNumber); err != nil {
if err := optimizeFormResources(ctx, o, pageNumber, pageObjNumber, vis); err != nil {
return err
}

Expand All @@ -547,7 +561,7 @@ func optimizeXObjectResourcesDict(ctx *model.Context, rDict types.Dict, pageNumb
}

// Optimize given resource dictionary by removing redundant fonts and images.
func optimizeResources(ctx *model.Context, resourcesDict types.Dict, pageNumber, pageObjNumber int) error {
func optimizeResources(ctx *model.Context, resourcesDict types.Dict, pageNumber, pageObjNumber int, visitedRes []types.Object) error {
log.Optimize.Printf("optimizeResources begin: pageNumber=%d pageObjNumber=%d\n", pageNumber, pageObjNumber)

if resourcesDict == nil {
Expand Down Expand Up @@ -589,7 +603,7 @@ func optimizeResources(ctx *model.Context, resourcesDict types.Dict, pageNumber,
return errors.Errorf("pdfcpu: optimizeResources: xobject resource dict is null for page %d pageObj %d\n", pageNumber, pageObjNumber)
}

if err = optimizeXObjectResourcesDict(ctx, d, pageNumber, pageObjNumber); err != nil {
if err = optimizeXObjectResourcesDict(ctx, d, pageNumber, pageObjNumber, visitedRes); err != nil {
return err
}

Expand Down Expand Up @@ -620,7 +634,7 @@ func parseResourcesDict(ctx *model.Context, pageDict types.Dict, pageNumber, pag
if d != nil {

// Optimize image and font resources.
if err = optimizeResources(ctx, d, pageNumber, pageObjNumber); err != nil {
if err = optimizeResources(ctx, d, pageNumber, pageObjNumber, []types.Object{}); err != nil {
return err
}

Expand Down

0 comments on commit 05d0e93

Please sign in to comment.