2 Star 0 Fork 1

Deeao/golang-pdfcpu

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
object.go 41.14 KB
一键复制 编辑 原始数据 按行查看 历史
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628
/*
Copyright 2018 The pdfcpu Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package validate
import (
"fmt"
"strings"
"time"
"gitee.com/deeao/golang-pdfcpu/pkg/log"
"gitee.com/deeao/golang-pdfcpu/pkg/pdfcpu/model"
"gitee.com/deeao/golang-pdfcpu/pkg/pdfcpu/types"
"github.com/pkg/errors"
)
const (
// REQUIRED is used for required dict entries.
REQUIRED = true
// OPTIONAL is used for optional dict entries.
OPTIONAL = false
)
func validateEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) (types.Object, error) {
o, found := d.Find(entryName)
if !found || o == nil {
if required {
return nil, errors.Errorf("dict=%s required entry=%s missing (obj#%d).", dictName, entryName, xRefTable.CurObj)
}
return nil, nil
}
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
if required {
return nil, errors.Errorf("dict=%s required entry=%s missing (obj#%d).", dictName, entryName, xRefTable.CurObj)
}
return nil, nil
}
// Version check
if err = xRefTable.ValidateVersion(fmt.Sprintf("dict=%s entry=%s (obj#%d)", dictName, entryName, xRefTable.CurObj), sinceVersion); err != nil {
return nil, err
}
return o, nil
}
func validateArrayEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.Array) bool) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateArrayEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return nil, err
}
if o, err = xRefTable.Dereference(o); err != nil {
return nil, err
}
if o == nil {
if required {
return nil, errors.Errorf("validateArrayEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateArrayEntry end: optional entry %s is nil\n", entryName)
}
return nil, nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return nil, err
}
a, ok := o.(types.Array)
if !ok {
return nil, errors.Errorf("validateArrayEntry: dict=%s entry=%s invalid type %T", dictName, entryName, o)
}
// Validation
if validate != nil && !validate(a) {
return nil, errors.Errorf("validateArrayEntry: dict=%s entry=%s invalid dict entry", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateArrayEntry end: entry=%s\n", entryName)
}
return a, nil
}
func validateBooleanEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(bool) bool) (*bool, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return nil, err
}
if o, err = xRefTable.Dereference(o); err != nil {
return nil, err
}
if o == nil {
if required {
return nil, errors.Errorf("validateBooleanEntry: dict=%s required entry=%s missing", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanEntry end: entry %s is nil\n", entryName)
}
return nil, nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return nil, err
}
b, ok := o.(types.Boolean)
if !ok {
return nil, errors.Errorf("validateBooleanEntry: dict=%s entry=%s invalid type", dictName, entryName)
}
// Validation
if validate != nil && !validate(b.Value()) {
return nil, errors.Errorf("validateBooleanEntry: dict=%s entry=%s invalid name dict entry", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanEntry end: entry=%s\n", entryName)
}
flag := b.Value()
return &flag, nil
}
func validateFlexBooleanEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) (*bool, error) {
flag, err := validateBooleanEntry(xRefTable, d, dictName, entryName, required, sinceVersion, nil)
if err == nil {
return flag, nil
}
if xRefTable.ValidationMode != model.ValidationRelaxed {
return nil, err
}
n, err := validateNameEntry(xRefTable, d, dictName, entryName, required, sinceVersion,
func(s string) bool {
return types.MemberOf(strings.ToLower(s), []string{"false", "true"})
},
)
if err != nil || n == nil {
return nil, err
}
*flag = strings.ToLower(n.Value()) == "true"
return flag, nil
}
func validateBooleanArrayEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.Array) bool) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanArrayEntry begin: entry=%s\n", entryName)
}
a, err := validateArrayEntry(xRefTable, d, dictName, entryName, required, sinceVersion, validate)
if err != nil || a == nil {
return nil, err
}
for i, o := range a {
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
continue
}
if _, ok := o.(types.Boolean); !ok {
return nil, errors.Errorf("validateBooleanArrayEntry: dict=%s entry=%s invalid type at index %d\n", dictName, entryName, i)
}
}
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanArrayEntry end: entry=%s\n", entryName)
}
return a, nil
}
func timeOfDateObject(xRefTable *model.XRefTable, o types.Object, sinceVersion model.Version) (*time.Time, error) {
s, err := xRefTable.DereferenceStringOrHexLiteral(o, sinceVersion, nil)
if err != nil {
return nil, err
}
if s == "" {
return nil, nil
}
t, ok := types.DateTime(s, xRefTable.ValidationMode == model.ValidationRelaxed)
if !ok {
return nil, errors.Errorf("pdfcpu: validateDateObject: <%s> invalid date", s)
}
return &t, nil
}
func validateDateObject(xRefTable *model.XRefTable, o types.Object, sinceVersion model.Version) (string, error) {
s, err := xRefTable.DereferenceStringOrHexLiteral(o, sinceVersion, nil)
if err != nil {
return "", err
}
if s == "" {
return s, nil
}
t, ok := types.DateTime(s, xRefTable.ValidationMode == model.ValidationRelaxed)
if !ok {
return "", errors.Errorf("pdfcpu: validateDateObject: <%s> invalid date", s)
}
return types.DateString(t), nil
}
func validateDateEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) (*time.Time, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateDateEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return nil, err
}
s, err := xRefTable.DereferenceStringOrHexLiteral(o, sinceVersion, nil)
if err != nil {
return nil, err
}
if s == "" {
if required {
return nil, errors.Errorf("validateDateEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateDateEntry end: optional entry %s is nil\n", entryName)
}
return nil, nil
}
time, ok := types.DateTime(s, xRefTable.ValidationMode == model.ValidationRelaxed)
if !ok {
return nil, errors.Errorf("pdfcpu: validateDateEntry: <%s> invalid date", s)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateDateEntry end: entry=%s\n", entryName)
}
return &time, nil
}
func validateDictEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.Dict) bool) (types.Dict, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateDictEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return nil, err
}
if o, err = xRefTable.Dereference(o); err != nil {
return nil, err
}
if o == nil {
if required {
return nil, errors.Errorf("validateDictEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateDictEntry end: optional entry %s is nil\n", entryName)
}
return nil, nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return nil, err
}
d, ok := o.(types.Dict)
if !ok {
return nil, errors.Errorf("validateDictEntry: dict=%s entry=%s invalid type", dictName, entryName)
}
// Validation
if validate != nil && !validate(d) {
return nil, errors.Errorf("validateDictEntry: dict=%s entry=%s invalid dict entry", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateDictEntry end: entry=%s\n", entryName)
}
return d, nil
}
func validateFloat(xRefTable *model.XRefTable, o types.Object, validate func(float64) bool) (*types.Float, error) {
if log.ValidateEnabled() {
log.Validate.Println("validateFloat begin")
}
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
return nil, errors.New("pdfcpu: validateFloat: missing object")
}
f, ok := o.(types.Float)
if !ok {
return nil, errors.New("pdfcpu: validateFloat: invalid type")
}
// Validation
if validate != nil && !validate(f.Value()) {
return nil, errors.Errorf("pdfcpu: validateFloat: invalid float: %s\n", f)
}
if log.ValidateEnabled() {
log.Validate.Println("validateFloat end")
}
return &f, nil
}
func validateFunctionArrayEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.Array) bool) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateFunctionArrayEntry begin: entry=%s\n", entryName)
}
a, err := validateArrayEntry(xRefTable, d, dictName, entryName, required, sinceVersion, validate)
if err != nil || a == nil {
return nil, err
}
for _, o := range a {
if err = validateFunction(xRefTable, o); err != nil {
return nil, err
}
}
if log.ValidateEnabled() {
log.Validate.Printf("validateFunctionArrayEntry end: entry=%s\n", entryName)
}
return a, nil
}
func validateFunctionOrArrayOfFunctionsEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) error {
if log.ValidateEnabled() {
log.Validate.Printf("validateFunctionOrArrayOfFunctionsEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return err
}
if o, err = xRefTable.Dereference(o); err != nil {
return err
}
if o == nil {
if required {
return errors.Errorf("pdfcpu: validateFunctionOrArrayOfFunctionsEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateFunctionOrArrayOfFunctionsEntry end: optional entry %s is nil\n", entryName)
}
return nil
}
switch o := o.(type) {
case types.Array:
for _, o := range o {
if o == nil {
continue
}
if err = validateFunction(xRefTable, o); err != nil {
return err
}
}
default:
if err = validateFunction(xRefTable, o); err != nil {
return err
}
}
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return err
}
if log.ValidateEnabled() {
log.Validate.Printf("validateFunctionOrArrayOfFunctionsEntry end: entry=%s\n", entryName)
}
return nil
}
func validateIndRefEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) (*types.IndirectRef, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateIndRefEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return nil, err
}
ir, ok := o.(types.IndirectRef)
if !ok {
return nil, errors.Errorf("pdfcpu: validateIndRefEntry: dict=%s entry=%s invalid type", dictName, entryName)
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return nil, err
}
if log.ValidateEnabled() {
log.Validate.Printf("validateIndRefEntry end: entry=%s\n", entryName)
}
return &ir, nil
}
func validateIndRefArrayEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.Array) bool) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateIndRefArrayEntry begin: entry=%s\n", entryName)
}
a, err := validateArrayEntry(xRefTable, d, dictName, entryName, required, sinceVersion, validate)
if err != nil || a == nil {
return nil, err
}
for i, o := range a {
if _, ok := o.(types.IndirectRef); !ok {
return nil, errors.Errorf("pdfcpu: validateIndRefArrayEntry: invalid type at index %d\n", i)
}
}
if log.ValidateEnabled() {
log.Validate.Printf("validateIndRefArrayEntry end: entry=%s \n", entryName)
}
return a, nil
}
func validateInteger(xRefTable *model.XRefTable, o types.Object, validate func(int) bool) (*types.Integer, error) {
if log.ValidateEnabled() {
log.Validate.Println("validateInteger begin")
}
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
return nil, errors.New("pdfcpu: validateInteger: missing object")
}
i, ok := o.(types.Integer)
if !ok {
return nil, errors.New("pdfcpu: validateInteger: invalid type")
}
// Validation
if validate != nil && !validate(i.Value()) {
return nil, errors.Errorf("pdfcpu: validateInteger: invalid integer: %s\n", i)
}
if log.ValidateEnabled() {
log.Validate.Println("validateInteger end")
}
return &i, nil
}
func validateIntegerEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(int) bool) (*types.Integer, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateIntegerEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return nil, err
}
if o, err = xRefTable.Dereference(o); err != nil {
return nil, err
}
if o == nil {
if required {
return nil, errors.Errorf("pdfcpu: validateIntegerEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateIntegerEntry end: optional entry %s is nil\n", entryName)
}
return nil, nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return nil, err
}
i, ok := o.(types.Integer)
if !ok {
return nil, errors.Errorf("pdfcpu: validateIntegerEntry: dict=%s entry=%s invalid type", dictName, entryName)
}
// Validation
if validate != nil && !validate(i.Value()) {
return nil, errors.Errorf("pdfcpu: validateIntegerEntry: dict=%s entry=%s invalid dict entry", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateIntegerEntry end: entry=%s\n", entryName)
}
return &i, nil
}
func validateIntegerArray(xRefTable *model.XRefTable, o types.Object) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Println("validateIntegerArray begin")
}
a, err := xRefTable.DereferenceArray(o)
if err != nil || a == nil {
return nil, err
}
for i, o := range a {
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
continue
}
switch o.(type) {
case types.Integer:
// no further processing.
default:
return nil, errors.Errorf("pdfcpu: validateIntegerArray: invalid type at index %d\n", i)
}
}
if log.ValidateEnabled() {
log.Validate.Println("validateIntegerArray end")
}
return a, nil
}
func validateIntegerArrayEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.Array) bool) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateIntegerArrayEntry begin: entry=%s\n", entryName)
}
a, err := validateArrayEntry(xRefTable, d, dictName, entryName, required, sinceVersion, validate)
if err != nil || a == nil {
return nil, err
}
for i, o := range a {
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
continue
}
if _, ok := o.(types.Integer); !ok {
return nil, errors.Errorf("pdfcpu: validateIntegerArrayEntry: dict=%s entry=%s invalid type at index %d\n", dictName, entryName, i)
}
}
if log.ValidateEnabled() {
log.Validate.Printf("validateIntegerArrayEntry end: entry=%s\n", entryName)
}
return a, nil
}
func validateName(xRefTable *model.XRefTable, o types.Object, validate func(string) bool) (*types.Name, error) {
if log.ValidateEnabled() {
log.Validate.Println("validateName begin")
}
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
return nil, errors.New("pdfcpu: validateName: missing object")
}
name, ok := o.(types.Name)
if !ok {
return nil, errors.New("pdfcpu: validateName: invalid type")
}
// Validation
if validate != nil && !validate(name.Value()) {
return nil, errors.Errorf("pdfcpu: validateName: invalid name: %s\n", name)
}
if log.ValidateEnabled() {
log.Validate.Println("validateName end")
}
return &name, nil
}
func validateNameEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(string) bool) (*types.Name, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateNameEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return nil, err
}
if o, err = xRefTable.Dereference(o); err != nil {
return nil, err
}
if o == nil {
if required {
return nil, errors.Errorf("pdfcpu: validateNameEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateNameEntry end: optional entry %s is nil\n", entryName)
}
return nil, nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return nil, err
}
name, ok := o.(types.Name)
if !ok {
return nil, errors.Errorf("pdfcpu: validateNameEntry: dict=%s entry=%s invalid type %T", dictName, entryName, o)
}
// Validation
v := name.Value()
if validate != nil && (required || len(v) > 0) && !validate(v) {
return nil, errors.Errorf("pdfcpu: validateNameEntry: dict=%s entry=%s invalid dict entry: %s", dictName, entryName, v)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateNameEntry end: entry=%s\n", entryName)
}
return &name, nil
}
func validateNameArray(xRefTable *model.XRefTable, o types.Object) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Println("validateNameArray begin")
}
a, err := xRefTable.DereferenceArray(o)
if err != nil || a == nil {
return nil, err
}
for i, o := range a {
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
continue
}
if _, ok := o.(types.Name); !ok {
return nil, errors.Errorf("pdfcpu: validateNameArray: invalid type at index %d\n", i)
}
}
if log.ValidateEnabled() {
log.Validate.Println("validateNameArray end")
}
return a, nil
}
func validateNameArrayEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(a types.Array) bool) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateNameArrayEntry begin: entry=%s\n", entryName)
}
a, err := validateArrayEntry(xRefTable, d, dictName, entryName, required, sinceVersion, validate)
if err != nil || a == nil {
return nil, err
}
for i, o := range a {
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
continue
}
if _, ok := o.(types.Name); !ok {
return nil, errors.Errorf("pdfcpu: validateNameArrayEntry: dict=%s entry=%s invalid type at index %d\n", dictName, entryName, i)
}
}
if log.ValidateEnabled() {
log.Validate.Printf("validateNameArrayEntry end: entry=%s\n", entryName)
}
return a, nil
}
func validateNumber(xRefTable *model.XRefTable, o types.Object) (types.Object, error) {
if log.ValidateEnabled() {
log.Validate.Println("validateNumber begin")
}
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
return nil, errors.New("pdfcpu: validateNumber: missing object")
}
switch o.(type) {
case types.Integer:
// no further processing.
case types.Float:
// no further processing.
default:
return nil, errors.New("pdfcpu: validateNumber: invalid type")
}
if log.ValidateEnabled() {
log.Validate.Println("validateNumber end ")
}
return o, nil
}
func validateNumberEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(f float64) bool) (types.Object, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateNumberEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return nil, err
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return nil, err
}
if o, err = validateNumber(xRefTable, o); err != nil {
return nil, err
}
var f float64
// Validation
switch o := o.(type) {
case types.Integer:
f = float64(o.Value())
case types.Float:
f = o.Value()
}
if validate != nil && !validate(f) {
return nil, errors.Errorf("pdfcpu: validateFloatEntry: dict=%s entry=%s invalid dict entry", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateNumberEntry end: entry=%s\n", entryName)
}
return o, nil
}
func validateNumberArray(xRefTable *model.XRefTable, o types.Object) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Println("validateNumberArray begin")
}
a, err := xRefTable.DereferenceArray(o)
if err != nil || a == nil {
return nil, err
}
for i, o := range a {
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
continue
}
switch o.(type) {
case types.Integer:
// no further processing.
case types.Float:
// no further processing.
default:
return nil, errors.Errorf("pdfcpu: validateNumberArray: invalid type at index %d\n", i)
}
}
if log.ValidateEnabled() {
log.Validate.Println("validateNumberArray end")
}
return a, err
}
func validateNumberArrayEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.Array) bool) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateNumberArrayEntry begin: entry=%s\n", entryName)
}
a, err := validateArrayEntry(xRefTable, d, dictName, entryName, required, sinceVersion, validate)
if err != nil || a == nil {
return nil, err
}
for i, o := range a {
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
continue
}
switch o.(type) {
case types.Integer:
// no further processing.
case types.Float:
// no further processing.
default:
return nil, errors.Errorf("pdfcpu: validateNumberArrayEntry: invalid type at index %d\n", i)
}
}
if log.ValidateEnabled() {
log.Validate.Printf("validateNumberArrayEntry end: entry=%s\n", entryName)
}
return a, nil
}
func validateRectangleEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.Array) bool) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateRectangleEntry begin: entry=%s\n", entryName)
}
a, err := validateNumberArrayEntry(xRefTable, d, dictName, entryName, required, sinceVersion, func(a types.Array) bool { return len(a) == 4 })
if err != nil || a == nil {
return nil, err
}
if validate != nil && !validate(a) {
return nil, errors.Errorf("pdfcpu: validateRectangleEntry: dict=%s entry=%s invalid rectangle entry", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateRectangleEntry end: entry=%s\n", entryName)
}
return a, nil
}
func validateStreamDict(xRefTable *model.XRefTable, o types.Object) (*types.StreamDict, error) {
if log.ValidateEnabled() {
log.Validate.Println("validateStreamDict begin")
}
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
return nil, errors.New("pdfcpu: validateStreamDict: missing object")
}
sd, ok := o.(types.StreamDict)
if !ok {
return nil, errors.New("pdfcpu: validateStreamDict: invalid type")
}
if log.ValidateEnabled() {
log.Validate.Println("validateStreamDict endobj")
}
return &sd, nil
}
func validateStreamDictEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.StreamDict) bool) (*types.StreamDict, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateStreamDictEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return nil, err
}
sd, valid, err := xRefTable.DereferenceStreamDict(o)
if valid {
return nil, nil
}
if err != nil {
return nil, err
}
if sd == nil {
if required {
return nil, errors.Errorf("pdfcpu: validateStreamDictEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateStreamDictEntry end: optional entry %s is nil\n", entryName)
}
return nil, nil
}
// Version check
if err = xRefTable.ValidateVersion(fmt.Sprintf("dict=%s entry=%s", dictName, entryName), sinceVersion); err != nil {
return nil, err
}
// Validation
if validate != nil && !validate(*sd) {
return nil, errors.Errorf("pdfcpu: validateStreamDictEntry: dict=%s entry=%s invalid dict entry", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateStreamDictEntry end: entry=%s\n", entryName)
}
return sd, nil
}
func decodeString(o types.Object, dictName, entryName string) (s string, err error) {
switch o := o.(type) {
case types.StringLiteral:
s, err = types.StringLiteralToString(o)
case types.HexLiteral:
s, err = types.HexLiteralToString(o)
default:
err = errors.Errorf("pdfcpu: decodeString: dict=%s entry=%s invalid type %T", dictName, entryName, o)
}
return s, err
}
func validateStringEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(string) bool) (*string, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateStringEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return nil, err
}
if o, err = xRefTable.Dereference(o); err != nil {
return nil, err
}
if o == nil {
if required {
return nil, errors.Errorf("pdfcpu: validateStringEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateStringEntry end: optional entry %s is nil\n", entryName)
}
return nil, nil
}
// Version check
if err = xRefTable.ValidateVersion(fmt.Sprintf("dict=%s entry=%s", dictName, entryName), sinceVersion); err != nil {
return nil, err
}
s, err := decodeString(o, dictName, entryName)
if err != nil {
return nil, err
}
// Validation
if validate != nil && (required || len(s) > 0) && !validate(s) {
return nil, errors.Errorf("pdfcpu: validateStringEntry: dict=%s entry=%s invalid dict entry", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateStringEntry end: entry=%s\n", entryName)
}
return &s, nil
}
func validateStringArrayEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.Array) bool) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateStringArrayEntry begin: entry=%s\n", entryName)
}
a, err := validateArrayEntry(xRefTable, d, dictName, entryName, required, sinceVersion, validate)
if err != nil || a == nil {
return nil, err
}
for i, o := range a {
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
continue
}
switch o.(type) {
case types.StringLiteral:
// no further processing.
case types.HexLiteral:
// no further processing
default:
return nil, errors.Errorf("pdfcpu: validateStringArrayEntry: invalid type at index %d\n", i)
}
}
if log.ValidateEnabled() {
log.Validate.Printf("validateStringArrayEntry end: entry=%s\n", entryName)
}
return a, nil
}
func validateArrayArrayEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version, validate func(types.Array) bool) (types.Array, error) {
if log.ValidateEnabled() {
log.Validate.Printf("validateArrayArrayEntry begin: entry=%s\n", entryName)
}
a, err := validateArrayEntry(xRefTable, d, dictName, entryName, required, sinceVersion, validate)
if err != nil || a == nil {
return nil, err
}
for i, o := range a {
o, err := xRefTable.Dereference(o)
if err != nil {
return nil, err
}
if o == nil {
continue
}
switch o.(type) {
case types.Array:
// no further processing.
default:
return nil, errors.Errorf("pdfcpu: validateArrayArrayEntry: invalid type at index %d\n", i)
}
}
if log.ValidateEnabled() {
log.Validate.Printf("validateArrayArrayEntry end: entry=%s\n", entryName)
}
return a, nil
}
func validateStringOrStreamEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) error {
if log.ValidateEnabled() {
log.Validate.Printf("validateStringOrStreamEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return err
}
if o, err = xRefTable.Dereference(o); err != nil {
return err
}
if o == nil {
if required {
return errors.Errorf("pdfcpu: validateStringOrStreamEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateStringOrStreamEntry end: optional entry %s is nil\n", entryName)
}
return nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return err
}
switch o.(type) {
case types.StringLiteral, types.HexLiteral, types.StreamDict:
// no further processing
default:
return errors.Errorf("pdfcpu: validateStringOrStreamEntry: dict=%s entry=%s invalid type", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateStringOrStreamEntry end: entry=%s\n", entryName)
}
return nil
}
func validateNameOrStringEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) error {
if log.ValidateEnabled() {
log.Validate.Printf("validateNameOrStringEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return err
}
if o, err = xRefTable.Dereference(o); err != nil {
return err
}
if o == nil {
if required {
return errors.Errorf("pdfcpu: validateNameOrStringEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateNameOrStringEntry end: optional entry %s is nil\n", entryName)
}
return nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return err
}
switch o.(type) {
case types.StringLiteral, types.Name:
// no further processing
default:
return errors.Errorf("pdfcpu: validateNameOrStringEntry: dict=%s entry=%s invalid type", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateNameOrStringEntry end: entry=%s\n", entryName)
}
return nil
}
func validateIntOrStringEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) error {
if log.ValidateEnabled() {
log.Validate.Printf("validateIntOrStringEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return err
}
if o, err = xRefTable.Dereference(o); err != nil {
return err
}
if o == nil {
if required {
return errors.Errorf("pdfcpu: validateIntOrStringEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateIntOrStringEntry end: optional entry %s is nil\n", entryName)
}
return nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return err
}
switch o.(type) {
case types.StringLiteral, types.HexLiteral, types.Integer:
// no further processing
default:
return errors.Errorf("pdfcpu: validateIntOrStringEntry: dict=%s entry=%s invalid type", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateIntOrStringEntry end: entry=%s\n", entryName)
}
return nil
}
func validateBooleanOrStreamEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) error {
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanOrStreamEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return err
}
if o, err = xRefTable.Dereference(o); err != nil {
return err
}
if o == nil {
if required {
return errors.Errorf("pdfcpu: validateBooleanOrStreamEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanOrStreamEntry end: optional entry %s is nil\n", entryName)
}
return nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return err
}
switch o.(type) {
case types.Boolean, types.StreamDict:
// no further processing
default:
return errors.Errorf("pdfcpu: validateBooleanOrStreamEntry: dict=%s entry=%s invalid type", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanOrStreamEntry end: entry=%s\n", entryName)
}
return nil
}
func validateStreamDictOrDictEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) error {
if log.ValidateEnabled() {
log.Validate.Printf("validateStreamDictOrDictEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return err
}
if o, err = xRefTable.Dereference(o); err != nil {
return err
}
if o == nil {
if required {
return errors.Errorf("pdfcpu: validateStreamDictOrDictEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateStreamDictOrDictEntry end: optional entry %s is nil\n", entryName)
}
return nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return err
}
switch o.(type) {
case types.StreamDict:
// TODO validate 3D stream dict
case types.Dict:
// TODO validate 3D reference dict
default:
return errors.Errorf("pdfcpu: validateStreamDictOrDictEntry: dict=%s entry=%s invalid type", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateStreamDictOrDictEntry end: entry=%s\n", entryName)
}
return nil
}
func validateIntegerOrArrayOfInteger(xRefTable *model.XRefTable, o types.Object, dictName, entryName string) error {
switch o := o.(type) {
case types.Integer:
// no further processing
case types.Array:
for i, o := range o {
o, err := xRefTable.Dereference(o)
if err != nil {
return err
}
if o == nil {
continue
}
if _, ok := o.(types.Integer); !ok {
return errors.Errorf("pdfcpu: validateIntegerOrArrayOfInteger: dict=%s entry=%s invalid type at index %d\n", dictName, entryName, i)
}
}
default:
return errors.Errorf("pdfcpu: validateIntegerOrArrayOfInteger: dict=%s entry=%s invalid type", dictName, entryName)
}
return nil
}
func validateIntegerOrArrayOfIntegerEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) error {
if log.ValidateEnabled() {
log.Validate.Printf("validateIntegerOrArrayOfIntegerEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return err
}
if o, err = xRefTable.Dereference(o); err != nil {
return err
}
if o == nil {
if required {
return errors.Errorf("pdfcpu: validateIntegerOrArrayOfIntegerEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateIntegerOrArrayOfIntegerEntry end: optional entry %s is nil\n", entryName)
}
return nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return err
}
if err := validateIntegerOrArrayOfInteger(xRefTable, o, dictName, entryName); err != nil {
return err
}
if log.ValidateEnabled() {
log.Validate.Printf("validateIntegerOrArrayOfIntegerEntry end: entry=%s\n", entryName)
}
return nil
}
func validateNameOrArrayOfName(xRefTable *model.XRefTable, o types.Object, dictName, entryName string) error {
switch o := o.(type) {
case types.Name:
// no further processing
case types.Array:
for i, o := range o {
o, err := xRefTable.Dereference(o)
if err != nil {
return err
}
if o == nil {
continue
}
if _, ok := o.(types.Name); !ok {
err = errors.Errorf("pdfcpu: validateNameOrArrayOfName: dict=%s entry=%s invalid type at index %d\n", dictName, entryName, i)
return err
}
}
default:
return errors.Errorf("pdfcpu: validateNameOrArrayOfName: dict=%s entry=%s invalid type", dictName, entryName)
}
return nil
}
func validateNameOrArrayOfNameEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) error {
if log.ValidateEnabled() {
log.Validate.Printf("validateNameOrArrayOfNameEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return err
}
if o, err = xRefTable.Dereference(o); err != nil {
return err
}
if o == nil {
if required {
return errors.Errorf("pdfcpu: validateNameOrArrayOfNameEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateNameOrArrayOfNameEntry end: optional entry %s is nil\n", entryName)
}
return nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return err
}
if err := validateNameOrArrayOfName(xRefTable, o, dictName, entryName); err != nil {
return err
}
if log.ValidateEnabled() {
log.Validate.Printf("validateNameOrArrayOfNameEntry end: entry=%s\n", entryName)
}
return nil
}
func validateBooleanOrArrayOfBoolean(xRefTable *model.XRefTable, o types.Object, dictName, entryName string) error {
switch o := o.(type) {
case types.Boolean:
// no further processing
case types.Array:
for i, o := range o {
o, err := xRefTable.Dereference(o)
if err != nil {
return err
}
if o == nil {
continue
}
if _, ok := o.(types.Boolean); !ok {
return errors.Errorf("pdfcpu: validateBooleanOrArrayOfBoolean: dict=%s entry=%s invalid type at index %d\n", dictName, entryName, i)
}
}
default:
return errors.Errorf("pdfcpu: validateBooleanOrArrayOfBoolean: dict=%s entry=%s invalid type", dictName, entryName)
}
return nil
}
func validateBooleanOrArrayOfBooleanEntry(xRefTable *model.XRefTable, d types.Dict, dictName, entryName string, required bool, sinceVersion model.Version) error {
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanOrArrayOfBooleanEntry begin: entry=%s\n", entryName)
}
o, err := d.Entry(dictName, entryName, required)
if err != nil || o == nil {
return err
}
if o, err = xRefTable.Dereference(o); err != nil {
return err
}
if o == nil {
if required {
return errors.Errorf("pdfcpu: validateBooleanOrArrayOfBooleanEntry: dict=%s required entry=%s is nil", dictName, entryName)
}
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanOrArrayOfBooleanEntry end: optional entry %s is nil\n", entryName)
}
return nil
}
// Version check
if err = xRefTable.ValidateVersion("dict="+dictName+" entry="+entryName, sinceVersion); err != nil {
return err
}
if err := validateBooleanOrArrayOfBoolean(xRefTable, o, dictName, entryName); err != nil {
return err
}
if log.ValidateEnabled() {
log.Validate.Printf("validateBooleanOrArrayOfBooleanEntry end: entry=%s\n", entryName)
}
return nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/deeao/golang-pdfcpu.git
git@gitee.com:deeao/golang-pdfcpu.git
deeao
golang-pdfcpu
golang-pdfcpu
v1.0.2

搜索帮助