From 1593b0ebd43630bd95f8f3c1cd32a3f0f9dd0468 Mon Sep 17 00:00:00 2001 From: Gunnsteinn Hall Date: Fri, 19 Aug 2016 09:13:12 +0000 Subject: [PATCH] Fixes --- pdf/outlines.go | 39 +++++++++++++++++++++++++++++++++------ pdf/reader.go | 10 ++++------ pdf/writer.go | 1 + 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/pdf/outlines.go b/pdf/outlines.go index 0dcc70f3..347a7d26 100644 --- a/pdf/outlines.go +++ b/pdf/outlines.go @@ -88,7 +88,7 @@ func newPdfOutlineFromDict(dict *PdfObjectDictionary) (*PdfOutline, error) { } // Does not traverse the tree. -func newPdfOutlineItemFromDict(dict *PdfObjectDictionary) (*PdfOutlineItem, error) { +func (this *PdfReader) newPdfOutlineItemFromDict(dict *PdfObjectDictionary) (*PdfOutlineItem, error) { item := PdfOutlineItem{} item.context = &item @@ -97,6 +97,10 @@ func newPdfOutlineItemFromDict(dict *PdfObjectDictionary) (*PdfOutlineItem, erro if !hasTitle { return nil, fmt.Errorf("Missing Title from Outline Item (required)") } + obj, err := this.traceToObject(obj) + if err != nil { + return nil, err + } title, ok := TraceToDirectObject(obj).(*PdfObjectString) if !ok { return nil, fmt.Errorf("Title not a string (%T)", obj) @@ -115,19 +119,42 @@ func newPdfOutlineItemFromDict(dict *PdfObjectDictionary) (*PdfOutlineItem, erro // Other keys. if obj, hasKey := (*dict)["Dest"]; hasKey { - item.Dest = obj + item.Dest, err = this.traceToObject(obj) + if err != nil { + return nil, err + } + err := this.traverseObjectData(item.Dest) + if err != nil { + return nil, err + } } if obj, hasKey := (*dict)["A"]; hasKey { - item.A = obj + item.A, err = this.traceToObject(obj) + if err != nil { + return nil, err + } + err := this.traverseObjectData(item.A) + if err != nil { + return nil, err + } } if obj, hasKey := (*dict)["SE"]; hasKey { - item.SE = obj + item.SE, err = this.traceToObject(obj) + if err != nil { + return nil, err + } } if obj, hasKey := (*dict)["C"]; hasKey { - item.C = obj + item.C, err = this.traceToObject(obj) + if err != nil { + return nil, err + } } if obj, hasKey := (*dict)["F"]; hasKey { - item.F = obj + item.F, err = this.traceToObject(obj) + if err != nil { + return nil, err + } } return &item, nil diff --git a/pdf/reader.go b/pdf/reader.go index 9c147a34..513935a1 100644 --- a/pdf/reader.go +++ b/pdf/reader.go @@ -205,13 +205,11 @@ func (this *PdfReader) loadOutlines() (*PdfOutlineTreeNode, error) { return nil, fmt.Errorf("File need to be decrypted first") } - outlines := &PdfOutline{} - // Has outlines? Otherwise return an empty outlines structure. catalog := this.catalog outlinesObj, hasOutlines := (*catalog)["Outlines"] if !hasOutlines { - return &outlines.PdfOutlineTreeNode, nil + return nil, nil } common.Log.Debug("-Has outlines") @@ -225,12 +223,12 @@ func (this *PdfReader) loadOutlines() (*PdfOutlineTreeNode, error) { outlineRoot, ok := outlineRootObj.(*PdfIndirectObject) if !ok { - return &outlines.PdfOutlineTreeNode, errors.New("Outline root should be an indirect object") + return nil, errors.New("Outline root should be an indirect object") } dict, ok := outlineRoot.PdfObject.(*PdfObjectDictionary) if !ok { - return &outlines.PdfOutlineTreeNode, errors.New("Outline indirect object should contain a dictionary") + return nil, errors.New("Outline indirect object should contain a dictionary") } common.Log.Debug("Outline root dict: %v", dict) @@ -254,7 +252,7 @@ func (this *PdfReader) buildOutlineTree(obj PdfObject) (*PdfOutlineTreeNode, err if _, hasTitle := (*dict)["Title"]; hasTitle { // Outline item has a title. - outlineItem, err := newPdfOutlineItemFromDict(dict) + outlineItem, err := this.newPdfOutlineItemFromDict(dict) if err != nil { return nil, err } diff --git a/pdf/writer.go b/pdf/writer.go index f19f687e..1f2289e1 100644 --- a/pdf/writer.go +++ b/pdf/writer.go @@ -547,6 +547,7 @@ func (this *PdfWriter) Write(ws io.WriteSeeker) error { common.Log.Debug("Write()") // Outlines. if this.outlineTree != nil { + common.Log.Debug("OutlineTree: %v", this.outlineTree) outlines := this.outlineTree.ToPdfObject(true) (*this.catalog)["Outlines"] = outlines err := this.addObjects(outlines)