Skip to content

Commit 9d476dd

Browse files
committed
Fix #77
1 parent 14e74ba commit 9d476dd

3 files changed

Lines changed: 69 additions & 22 deletions

File tree

pkg/pdfcpu/rotate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package pdfcpu
1818

1919
import "github.com/hhrutter/pdfcpu/pkg/log"
2020

21-
func rotatePage(xRefTable *XRefTable, i, rotation int) error {
21+
func rotatePage(xRefTable *XRefTable, i, j int) error {
2222

2323
log.Debug.Printf("rotate page:%d\n", i)
2424

@@ -27,7 +27,7 @@ func rotatePage(xRefTable *XRefTable, i, rotation int) error {
2727
return err
2828
}
2929

30-
d.Update("Rotate", Integer(inhPAttrs.rotate+float64(rotation)))
30+
d.Update("Rotate", Integer((inhPAttrs.rotate+j)%360))
3131

3232
return nil
3333
}

pkg/pdfcpu/stamp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1350,7 +1350,7 @@ func watermarkPage(xRefTable *XRefTable, i int, wm *Watermark) error {
13501350
return err
13511351
}
13521352

1353-
wm.pageRot = inhPAttrs.rotate
1353+
wm.pageRot = float64(inhPAttrs.rotate)
13541354

13551355
log.Debug.Printf("\n%s\n", wm)
13561356

pkg/pdfcpu/xreftable.go

Lines changed: 66 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -760,15 +760,19 @@ func (xRefTable *XRefTable) DereferenceInteger(o Object) (*Integer, error) {
760760

761761
i, ok := o.(Integer)
762762
if !ok {
763-
return nil, errors.Errorf("ValidateInteger: wrong type <%v>", o)
763+
return nil, errors.Errorf("DereferenceInteger: wrong type <%v>", o)
764764
}
765765

766766
return &i, nil
767767
}
768768

769-
// DereferenceNumber resolves a number object, which may be an indirect reference and returns a float64
770-
// It is assumed this func is called on a validated xRefTable.
771-
func (xRefTable *XRefTable) DereferenceNumber(o Object) (f float64) {
769+
// DereferenceNumber resolves a number object, which may be an indirect reference and returns a float64.
770+
func (xRefTable *XRefTable) DereferenceNumber(o Object) (float64, error) {
771+
772+
var (
773+
f float64
774+
err error
775+
)
772776

773777
o, _ = xRefTable.Dereference(o)
774778

@@ -780,11 +784,12 @@ func (xRefTable *XRefTable) DereferenceNumber(o Object) (f float64) {
780784
case Float:
781785
f = o.Value()
782786

783-
// TODO default: error
787+
default:
788+
err = errors.Errorf("DereferenceNumber: wrong type <%v>", o)
784789

785790
}
786791

787-
return f
792+
return f, err
788793
}
789794

790795
// DereferenceName resolves and validates a name object, which may be an indirect reference.
@@ -1525,15 +1530,32 @@ type InheritedPageAttrs struct {
15251530
resources Dict
15261531
mediaBox *Rectangle
15271532
cropBox *Rectangle
1528-
rotate float64
1533+
rotate int
15291534
}
15301535

1531-
func rect(xRefTable *XRefTable, a Array) *Rectangle {
1532-
llx := xRefTable.DereferenceNumber(a[0])
1533-
lly := xRefTable.DereferenceNumber(a[1])
1534-
urx := xRefTable.DereferenceNumber(a[2])
1535-
ury := xRefTable.DereferenceNumber(a[3])
1536-
return Rect(llx, lly, urx, ury)
1536+
func rect(xRefTable *XRefTable, a Array) (*Rectangle, error) {
1537+
1538+
llx, err := xRefTable.DereferenceNumber(a[0])
1539+
if err != nil {
1540+
return nil, err
1541+
}
1542+
1543+
lly, err := xRefTable.DereferenceNumber(a[1])
1544+
if err != nil {
1545+
return nil, err
1546+
}
1547+
1548+
urx, err := xRefTable.DereferenceNumber(a[2])
1549+
if err != nil {
1550+
return nil, err
1551+
}
1552+
1553+
ury, err := xRefTable.DereferenceNumber(a[3])
1554+
if err != nil {
1555+
return nil, err
1556+
}
1557+
1558+
return Rect(llx, lly, urx, ury), nil
15371559
}
15381560

15391561
func (xRefTable *XRefTable) checkInheritedPageAttrs(pageDict Dict, pAttrs *InheritedPageAttrs) error {
@@ -1554,7 +1576,10 @@ func (xRefTable *XRefTable) checkInheritedPageAttrs(pageDict Dict, pAttrs *Inher
15541576
if err != nil {
15551577
return err
15561578
}
1557-
pAttrs.mediaBox = rect(xRefTable, a)
1579+
pAttrs.mediaBox, err = rect(xRefTable, a)
1580+
if err != nil {
1581+
return err
1582+
}
15581583
}
15591584

15601585
obj, found = pageDict.Find("CropBox")
@@ -1563,13 +1588,22 @@ func (xRefTable *XRefTable) checkInheritedPageAttrs(pageDict Dict, pAttrs *Inher
15631588
if err != nil {
15641589
return err
15651590
}
1566-
pAttrs.cropBox = rect(xRefTable, a)
1591+
pAttrs.cropBox, err = rect(xRefTable, a)
1592+
if err != nil {
1593+
return err
1594+
}
15671595
}
15681596

15691597
obj, found = pageDict.Find("Rotate")
15701598
if found {
15711599
//fmt.Printf("found Rotate: %v %T\n", obj, obj)
1572-
pAttrs.rotate = xRefTable.DereferenceNumber(obj)
1600+
i, err := xRefTable.DereferenceInteger(obj)
1601+
if err != nil {
1602+
return err
1603+
}
1604+
1605+
pAttrs.rotate = i.Value()
1606+
15731607
//fmt.Printf("r=%v %T\n", r, r)
15741608
//pAttrs.rotate = &r
15751609
//fmt.Printf("found rotate(%f) for page %d\n", *rotate, *p)
@@ -1707,6 +1741,21 @@ func (xRefTable *XRefTable) emptyPage(parentIndRef *IndirectRef, mediaBox *Recta
17071741
return xRefTable.IndRefForNewObject(pageDict)
17081742
}
17091743

1744+
func (xRefTable *XRefTable) pageMediaBox(d *Dict) (*Rectangle, error) {
1745+
1746+
o, found := d.Find("MediaBox")
1747+
if !found {
1748+
return nil, errors.Errorf("pageMediaBox: missing mediaBox")
1749+
}
1750+
1751+
a, err := xRefTable.DereferenceArray(o)
1752+
if err != nil {
1753+
return nil, err
1754+
}
1755+
1756+
return rect(xRefTable, a)
1757+
}
1758+
17101759
func (xRefTable *XRefTable) insertIntoPageTree(root *IndirectRef, pAttrs *InheritedPageAttrs, p *int, selectedPages IntSet) (int, error) {
17111760

17121761
d, err := xRefTable.DereferenceDict(*root)
@@ -1763,12 +1812,10 @@ func (xRefTable *XRefTable) insertIntoPageTree(root *IndirectRef, pAttrs *Inheri
17631812
// Insert empty page.
17641813
mediaBox := pAttrs.mediaBox
17651814
if mediaBox == nil {
1766-
o1, _ := pageNodeDict.Find("MediaBox")
1767-
a1, err := xRefTable.DereferenceArray(o1)
1815+
mediaBox, err = xRefTable.pageMediaBox(&pageNodeDict)
17681816
if err != nil {
17691817
return 0, err
17701818
}
1771-
mediaBox = rect(xRefTable, a1)
17721819
}
17731820

17741821
indRef, err := xRefTable.emptyPage(root, mediaBox)

0 commit comments

Comments
 (0)