Skip to content

Commit 9e69220

Browse files
committed
Fix #1176
1 parent 6cfff8e commit 9e69220

File tree

3 files changed

+63
-45
lines changed

3 files changed

+63
-45
lines changed

pkg/pdfcpu/form/export.go

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,36 @@ func (f Form) listBoxValuesAndLock(id, name string) ([]string, bool, bool) {
203203
return nil, false, false
204204
}
205205

206+
func locateAPN(xRefTable *model.XRefTable, d types.Dict) (types.Dict, error) {
207+
208+
obj, ok := d.Find("AP")
209+
if !ok {
210+
return nil, errors.New("corrupt form field: missing entry \"AP\"")
211+
}
212+
d1, err := xRefTable.DereferenceDict(obj)
213+
if err != nil {
214+
return nil, err
215+
}
216+
if len(d1) == 0 {
217+
return nil, errors.New("corrupt form field: missing entry \"AP\"")
218+
}
219+
220+
obj, ok = d1.Find("N")
221+
if !ok {
222+
return nil, errors.New("corrupt AP field: missing entry \"N\"")
223+
}
224+
d2, err := xRefTable.DereferenceDict(obj)
225+
if err != nil {
226+
return nil, err
227+
}
228+
229+
if len(d2) == 0 {
230+
return nil, errors.New("corrupt AP field: missing entry \"N\"")
231+
}
232+
233+
return d2, nil
234+
}
235+
206236
func extractRadioButtonGroupOptions(xRefTable *model.XRefTable, d types.Dict) ([]string, bool, error) {
207237

208238
var opts []string
@@ -232,15 +262,12 @@ func extractRadioButtonGroupOptions(xRefTable *model.XRefTable, d types.Dict) ([
232262
}
233263
}
234264

235-
d1 := d.DictEntry("AP")
236-
if d1 == nil {
237-
return nil, false, errors.New("corrupt form field: missing entry AP")
238-
}
239-
d2 := d1.DictEntry("N")
240-
if d2 == nil {
241-
return nil, false, errors.New("corrupt AP field: missing entry N")
265+
d1, err := locateAPN(xRefTable, d)
266+
if err != nil {
267+
return nil, false, err
242268
}
243-
for k := range d2 {
269+
270+
for k := range d1 {
244271
k, err := types.DecodeName(k)
245272
if err != nil {
246273
return nil, false, err
@@ -320,7 +347,8 @@ func extractCheckBox(page int, d types.Dict, id, name, altName string, locked bo
320347
}
321348

322349
if o, ok := d.Find("V"); ok {
323-
cb.Value = o.(types.Name) != "Off"
350+
n := o.(types.Name)
351+
cb.Value = len(n) > 0 && n != "Off"
324352
}
325353

326354
return cb, nil

pkg/pdfcpu/form/fill.go

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -462,17 +462,12 @@ func fillRadioButtons(ctx *model.Context, d types.Dict, vNew string, v types.Nam
462462
return err
463463
}
464464

465-
d1 := d.DictEntry("AP")
466-
if d1 == nil {
467-
return errors.New("pdfcpu: corrupt form field: missing entry AP")
468-
}
469-
470-
d2 := d1.DictEntry("N")
471-
if d2 == nil {
472-
return errors.New("pdfcpu: corrupt AP field: missing entry N")
465+
d1, err := locateAPN(ctx.XRefTable, d)
466+
if err != nil {
467+
return err
473468
}
474469

475-
for k := range d2 {
470+
for k := range d1 {
476471
k, err := types.DecodeName(k)
477472
if err != nil {
478473
return err
@@ -561,17 +556,12 @@ func fillCheckBoxKid(ctx *model.Context, kids types.Array, off bool) (*types.Nam
561556
return nil, err
562557
}
563558

564-
d1 := d.DictEntry("AP")
565-
if d1 == nil {
566-
return nil, errors.New("pdfcpu: corrupt form field: missing entry AP")
567-
}
568-
569-
d2 := d1.DictEntry("N")
570-
if d2 == nil {
571-
return nil, errors.New("pdfcpu: corrupt AP field: missing entry N")
559+
d1, err := locateAPN(ctx.XRefTable, d)
560+
if err != nil {
561+
return nil, err
572562
}
573563

574-
offName, yesName, err := primitives.CalcCheckBoxASNames(ctx, d2)
564+
offName, yesName, err := primitives.CalcCheckBoxASNames(ctx, d1)
575565
if err != nil {
576566
return nil, err
577567
}
@@ -618,7 +608,8 @@ func fillCheckBox(
618608
vNew := strings.HasPrefix(s, "t") // true
619609
vOld := false
620610
if o, found := d.Find("V"); found {
621-
vOld = o.(types.Name) != "Off"
611+
n := o.(types.Name)
612+
vOld = len(n) > 0 && n != "Off"
622613
}
623614
if vNew == vOld {
624615
return nil

pkg/pdfcpu/form/form.go

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -303,19 +303,18 @@ func collectRadioButtonGroupOptions(xRefTable *model.XRefTable, d types.Dict) ([
303303
}
304304

305305
for _, o := range d.ArrayEntry("Kids") {
306+
306307
d, err := xRefTable.DereferenceDict(o)
307308
if err != nil {
308309
return nil, err
309310
}
310-
d1 := d.DictEntry("AP")
311-
if d1 == nil {
312-
return nil, errors.New("corrupt form field: missing entry \"AP\"")
313-
}
314-
d2 := d1.DictEntry("N")
315-
if d2 == nil {
316-
return nil, errors.New("corrupt AP field: missing entry \"N\"")
311+
312+
d1, err := locateAPN(xRefTable, d)
313+
if err != nil {
314+
return nil, err
317315
}
318-
for k := range d2 {
316+
317+
for k := range d1 {
319318
k, err := types.DecodeName(k)
320319
if err != nil {
321320
return nil, err
@@ -411,7 +410,8 @@ func collectBtn(xRefTable *model.XRefTable, d types.Dict, f *Field, fm *FieldMet
411410

412411
f.Typ = FTCheckBox
413412
if o, found := d.Find("V"); found {
414-
if o.(types.Name) != "Off" {
413+
n := o.(types.Name)
414+
if len(n) > 0 && n != "Off" {
415415
v := "Yes"
416416
if len(v) > fm.valMax {
417417
fm.valMax = len(v)
@@ -1313,19 +1313,18 @@ func resetBtn(xRefTable *model.XRefTable, d types.Dict) error {
13131313
// RadiobuttonGroup
13141314

13151315
for _, o := range d.ArrayEntry("Kids") {
1316+
13161317
d, err := xRefTable.DereferenceDict(o)
13171318
if err != nil {
13181319
return err
13191320
}
1320-
d1 := d.DictEntry("AP")
1321-
if d1 == nil {
1322-
return errors.New("corrupt form field: missing entry \"AP\"")
1323-
}
1324-
d2 := d1.DictEntry("N")
1325-
if d2 == nil {
1326-
return errors.New("corrupt AP field: missing entry \"N\"")
1321+
1322+
d1, err := locateAPN(xRefTable, d)
1323+
if err != nil {
1324+
return err
13271325
}
1328-
for k := range d2 {
1326+
1327+
for k := range d1 {
13291328
k, err := types.DecodeName(k)
13301329
if err != nil {
13311330
return err

0 commit comments

Comments
 (0)