From b89d7b1ab108d54a983c9653d47df07bbad5336e Mon Sep 17 00:00:00 2001 From: Horst Rutter Date: Sun, 14 Jan 2024 00:18:11 +0100 Subject: [PATCH] Fix #766 --- pkg/pdfcpu/validate/annotation.go | 112 ++++++++++++++++++++++++------ 1 file changed, 89 insertions(+), 23 deletions(-) diff --git a/pkg/pdfcpu/validate/annotation.go b/pkg/pdfcpu/validate/annotation.go index 5ba27b70..19ed675e 100644 --- a/pkg/pdfcpu/validate/annotation.go +++ b/pkg/pdfcpu/validate/annotation.go @@ -1393,27 +1393,90 @@ func validateBorderArray(xRefTable *model.XRefTable, a types.Array) bool { if len(a) == 0 { return true } - if len(a) == 1 || len(a) == 2 || len(a) > 4 { - return false + + if xRefTable.Version() == model.V10 { + return len(a) == 3 } - if len(a) == 3 { - _, err := validateNumberArray(xRefTable, a) - return err == nil + + if !(len(a) == 3 || len(a) == 4) { + return false } - // len = 4 + for i := 0; i < len(a); i++ { - o := a[3] - a1, ok := o.(types.Array) - if !ok { - return xRefTable.ValidationMode == model.ValidationRelaxed - } - if len(a1) != 2 { - return false + if i == 3 { + // validate dash pattern array + // len must be 0,1,2,3 numbers (dont'allow only 0s) + a1, ok := a[i].(types.Array) + if !ok { + return xRefTable.ValidationMode == model.ValidationRelaxed + } + + if len(a1) == 0 { + return true + } + + if len(a1) > 3 { + return false + } + + all0 := true + for j := 0; j < len(a1); j++ { + o, err := xRefTable.Dereference(a1[j]) + if err != nil || o == nil { + return false + } + + var f float64 + + switch o := o.(type) { + case types.Integer: + f = float64(o.Value()) + case types.Float: + f = o.Value() + default: + return false + } + + if f < 0 { + return false + } + + if f != 0 { + all0 = false + break + } + + } + if all0 { + return false + } + + continue + } + + o, err := xRefTable.Dereference(a[i]) + if err != nil || o == nil { + return false + } + + var f float64 + + switch o := o.(type) { + case types.Integer: + f = float64(o.Value()) + case types.Float: + f = o.Value() + default: + return false + } + + if f < 0 { + return false + } } - _, err := validateNumberArray(xRefTable, a1) - return err == nil + return true } func validateAnnotationDictGeneralPart1(xRefTable *model.XRefTable, d types.Dict, dictName string) (*types.Name, error) { @@ -1482,21 +1545,24 @@ func validateAnnotationDictGeneralPart2(xRefTable *model.XRefTable, d types.Dict } // Border, optional, array of numbers - a, err := validateArrayEntry(xRefTable, d, dictName, "Border", OPTIONAL, model.V10, nil) - if err != nil { - return err - } - if !validateBorderArray(xRefTable, a) { - return errors.Errorf("invalid border array: %s", a) + obj, found := d.Find("BS") + if !found || obj == nil || xRefTable.Version() < model.V12 { + a, err := validateArrayEntry(xRefTable, d, dictName, "Border", OPTIONAL, model.V10, nil) + if err != nil { + return err + } + if !validateBorderArray(xRefTable, a) { + return errors.Errorf("invalid border array: %s", a) + } } // C, optional array, of numbers, since V1.1 - if _, err = validateNumberArrayEntry(xRefTable, d, dictName, "C", OPTIONAL, model.V11, nil); err != nil { + if _, err := validateNumberArrayEntry(xRefTable, d, dictName, "C", OPTIONAL, model.V11, nil); err != nil { return err } // StructParent, optional, integer, since V1.3 - if _, err = validateIntegerEntry(xRefTable, d, dictName, "StructParent", OPTIONAL, model.V13, nil); err != nil { + if _, err := validateIntegerEntry(xRefTable, d, dictName, "StructParent", OPTIONAL, model.V13, nil); err != nil { return err }