This commit is contained in:
Gunnsteinn Hall 2016-08-19 09:13:12 +00:00
parent 6941899c74
commit 1593b0ebd4
3 changed files with 38 additions and 12 deletions

View File

@ -88,7 +88,7 @@ func newPdfOutlineFromDict(dict *PdfObjectDictionary) (*PdfOutline, error) {
} }
// Does not traverse the tree. // Does not traverse the tree.
func newPdfOutlineItemFromDict(dict *PdfObjectDictionary) (*PdfOutlineItem, error) { func (this *PdfReader) newPdfOutlineItemFromDict(dict *PdfObjectDictionary) (*PdfOutlineItem, error) {
item := PdfOutlineItem{} item := PdfOutlineItem{}
item.context = &item item.context = &item
@ -97,6 +97,10 @@ func newPdfOutlineItemFromDict(dict *PdfObjectDictionary) (*PdfOutlineItem, erro
if !hasTitle { if !hasTitle {
return nil, fmt.Errorf("Missing Title from Outline Item (required)") 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) title, ok := TraceToDirectObject(obj).(*PdfObjectString)
if !ok { if !ok {
return nil, fmt.Errorf("Title not a string (%T)", obj) return nil, fmt.Errorf("Title not a string (%T)", obj)
@ -115,19 +119,42 @@ func newPdfOutlineItemFromDict(dict *PdfObjectDictionary) (*PdfOutlineItem, erro
// Other keys. // Other keys.
if obj, hasKey := (*dict)["Dest"]; hasKey { 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 { 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 { 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 { 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 { if obj, hasKey := (*dict)["F"]; hasKey {
item.F = obj item.F, err = this.traceToObject(obj)
if err != nil {
return nil, err
}
} }
return &item, nil return &item, nil

View File

@ -205,13 +205,11 @@ func (this *PdfReader) loadOutlines() (*PdfOutlineTreeNode, error) {
return nil, fmt.Errorf("File need to be decrypted first") return nil, fmt.Errorf("File need to be decrypted first")
} }
outlines := &PdfOutline{}
// Has outlines? Otherwise return an empty outlines structure. // Has outlines? Otherwise return an empty outlines structure.
catalog := this.catalog catalog := this.catalog
outlinesObj, hasOutlines := (*catalog)["Outlines"] outlinesObj, hasOutlines := (*catalog)["Outlines"]
if !hasOutlines { if !hasOutlines {
return &outlines.PdfOutlineTreeNode, nil return nil, nil
} }
common.Log.Debug("-Has outlines") common.Log.Debug("-Has outlines")
@ -225,12 +223,12 @@ func (this *PdfReader) loadOutlines() (*PdfOutlineTreeNode, error) {
outlineRoot, ok := outlineRootObj.(*PdfIndirectObject) outlineRoot, ok := outlineRootObj.(*PdfIndirectObject)
if !ok { 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) dict, ok := outlineRoot.PdfObject.(*PdfObjectDictionary)
if !ok { 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) 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 { if _, hasTitle := (*dict)["Title"]; hasTitle {
// Outline item has a title. // Outline item has a title.
outlineItem, err := newPdfOutlineItemFromDict(dict) outlineItem, err := this.newPdfOutlineItemFromDict(dict)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -547,6 +547,7 @@ func (this *PdfWriter) Write(ws io.WriteSeeker) error {
common.Log.Debug("Write()") common.Log.Debug("Write()")
// Outlines. // Outlines.
if this.outlineTree != nil { if this.outlineTree != nil {
common.Log.Debug("OutlineTree: %v", this.outlineTree)
outlines := this.outlineTree.ToPdfObject(true) outlines := this.outlineTree.ToPdfObject(true)
(*this.catalog)["Outlines"] = outlines (*this.catalog)["Outlines"] = outlines
err := this.addObjects(outlines) err := this.addObjects(outlines)