Skip to content

Commit

Permalink
Fix layout ParsePageFormat
Browse files Browse the repository at this point in the history
  • Loading branch information
hhrutter committed Sep 3, 2023
1 parent b4556cc commit 5349a52
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 49 deletions.
32 changes: 16 additions & 16 deletions pkg/api/test/create_test.go
Expand Up @@ -303,7 +303,7 @@ func writeTextDemoAlignedWidthAndMargin(
}

func createTextDemoAlignedWidthAndMargin(xRefTable *model.XRefTable, mediaBox *types.Rectangle, hAlign types.HAlignment, w, mLeft, mRight, mTop, mBot float64) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
writeTextDemoAlignedWidthAndMargin(xRefTable, p, region, hAlign, w, mLeft, mRight, mTop, mBot)
region = types.RectForWidthAndHeight(50, 70, 200, 200)
Expand Down Expand Up @@ -485,7 +485,7 @@ func writeTextAlignJustifyColumnDemo(xRefTable *model.XRefTable, p model.Page, r
}

func createTextAlignJustifyDemo(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
fontName := "Times-Roman"
writeTextAlignJustifyDemo(xRefTable, p, region, fontName)
Expand All @@ -495,7 +495,7 @@ func createTextAlignJustifyDemo(xRefTable *model.XRefTable, mediaBox *types.Rect
}

func createTextAlignJustifyColumnDemo(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
writeTextAlignJustifyColumnDemo(xRefTable, p, region)
region = types.RectForWidthAndHeight(0, 0, 200, 200)
Expand Down Expand Up @@ -579,7 +579,7 @@ func writeTextDemoAnchors(xRefTable *model.XRefTable, p model.Page, region *type
}

func createTextDemoAnchors(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
writeTextDemoAnchors(xRefTable, p, region)
region = types.RectForWidthAndHeight(50, 70, 200, 200)
Expand All @@ -588,7 +588,7 @@ func createTextDemoAnchors(xRefTable *model.XRefTable, mediaBox *types.Rectangle
}

func createTextDemoAnchorsWithOffset(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
dx, dy := 20., 20.
var region *types.Rectangle
writeTextDemoAnchorsWithOffset(xRefTable, p, region, dx, dy)
Expand Down Expand Up @@ -695,7 +695,7 @@ func writeTextDemoColumnAnchored(xRefTable *model.XRefTable, p model.Page, regio
}

func createTextDemoColumnAnchored(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
writeTextDemoColumnAnchored(xRefTable, p, region)
region = types.RectForWidthAndHeight(50, 70, 400, 400)
Expand All @@ -704,7 +704,7 @@ func createTextDemoColumnAnchored(xRefTable *model.XRefTable, mediaBox *types.Re
}

func createTextDemoColumnAnchoredWithOffset(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
dx, dy := 20., 20.
writeTextDemoColumnAnchoredWithOffset(xRefTable, p, region, dx, dy)
Expand Down Expand Up @@ -835,7 +835,7 @@ func writeTextRotateDemo(xRefTable *model.XRefTable, p model.Page, region *types
}

func createTextRotateDemo(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
writeTextRotateDemo(xRefTable, p, region)
region = types.RectForWidthAndHeight(150, 150, 300, 300)
Expand All @@ -844,7 +844,7 @@ func createTextRotateDemo(xRefTable *model.XRefTable, mediaBox *types.Rectangle)
}

func createTextRotateDemoWithOffset(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
dx, dy := 20., 20.
writeTextRotateDemoWithOffset(xRefTable, p, region, dx, dy)
Expand Down Expand Up @@ -1030,7 +1030,7 @@ func writeTextScaleAbsoluteDemo(xRefTable *model.XRefTable, p model.Page, region
}

func createTextScaleAbsoluteDemo(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
writeTextScaleAbsoluteDemo(xRefTable, p, region)
region = types.RectForWidthAndHeight(20, 70, 180, 180)
Expand All @@ -1039,7 +1039,7 @@ func createTextScaleAbsoluteDemo(xRefTable *model.XRefTable, mediaBox *types.Rec
}

func createTextScaleAbsoluteDemoWithOffset(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
dx, dy := 20., 20.
var region *types.Rectangle
writeTextScaleAbsoluteDemoWithOffset(xRefTable, p, region, dx, dy)
Expand Down Expand Up @@ -1241,7 +1241,7 @@ func writeTextScaleRelativeDemo(xRefTable *model.XRefTable, p model.Page, region
}

func createTextScaleRelativeDemo(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
writeTextScaleRelativeDemo(xRefTable, p, region)
region = types.RectForWidthAndHeight(50, 70, 200, 200)
Expand All @@ -1250,7 +1250,7 @@ func createTextScaleRelativeDemo(xRefTable *model.XRefTable, mediaBox *types.Rec
}

func createTextScaleRelativeDemoWithOffset(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
dx, dy := 20., 20.
writeTextScaleRelativeDemoWithOffset(xRefTable, p, region, dx, dy)
Expand Down Expand Up @@ -1803,7 +1803,7 @@ func writecreateTestRTLUserFont(xRefTable *model.XRefTable, p model.Page, region
}

func createTestRTLUserFont(xRefTable *model.XRefTable, mediaBox *types.Rectangle, language, fontName string) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
text := sampleTextRTL[language]
writecreateTestRTLUserFont(xRefTable, p, region, fontName, text)
Expand Down Expand Up @@ -1865,7 +1865,7 @@ func writecreateTestUserFontJustified(xRefTable *model.XRefTable, p model.Page,
}

func createTestUserFontJustified(xRefTable *model.XRefTable, mediaBox *types.Rectangle, rtl bool) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
var region *types.Rectangle
writecreateTestUserFontJustified(xRefTable, p, region, rtl)
return p
Expand Down Expand Up @@ -1946,7 +1946,7 @@ func TestUserFontRTL(t *testing.T) {
}

func createCJKVDemo(xRefTable *model.XRefTable, mediaBox *types.Rectangle) model.Page {
p := model.NewPage(mediaBox)
p := model.NewPage(mediaBox, nil)
mb := p.MediaBox

textEnglish := `pdfcpu
Expand Down
2 changes: 2 additions & 0 deletions pkg/pdfcpu/info.go
Expand Up @@ -225,6 +225,8 @@ func appendNotEqualMediaAndCropBoxInfo(ss *[]string, pb model.PageBoundaries, un
bb := pb.BleedBox()
ab := pb.ArtBox()

*ss = append(*ss, fmt.Sprintf(" MediaBox (%s) %v", unit, mb.Format(currUnit)))

s := trimBleedArtBoxString(cb, tb, bb, ab)
*ss = append(*ss, fmt.Sprintf(" CropBox (%s) %v %s", unit, cb.Format(currUnit), s))

Expand Down
12 changes: 9 additions & 3 deletions pkg/pdfcpu/model/page.go
Expand Up @@ -87,9 +87,15 @@ type Page struct {
Fields types.Array
}

// NewPage creates a page for a mediaBox.
func NewPage(mediaBox *types.Rectangle) Page {
return Page{MediaBox: mediaBox, Fm: FontMap{}, Im: ImageMap{}, Buf: new(bytes.Buffer)}
// NewPage creates a page for given mediaBox and cropBox.
func NewPage(mediaBox, cropBox *types.Rectangle) Page {
return Page{
MediaBox: mediaBox,
CropBox: cropBox,
Fm: FontMap{},
Im: ImageMap{},
AnnotTabs: map[int]FieldAnnotation{},
Buf: new(bytes.Buffer)}
}

// NewPageWithBg creates a page for a mediaBox.
Expand Down
2 changes: 1 addition & 1 deletion pkg/pdfcpu/model/xreftable.go
Expand Up @@ -2226,7 +2226,7 @@ func (xRefTable *XRefTable) PageDims() ([]types.Dim, error) {

dims := make([]types.Dim, len(pbs))
for i, pb := range pbs {
d := pb.CropBox().Dimensions()
d := pb.MediaBox().Dimensions()
if pb.Rot%180 != 0 {
d.Width, d.Height = d.Height, d.Width
}
Expand Down
41 changes: 20 additions & 21 deletions pkg/pdfcpu/primitives/pdf.go
Expand Up @@ -17,7 +17,6 @@
package primitives

import (
"bytes"
"io"
"net/http"
"path/filepath"
Expand Down Expand Up @@ -1027,15 +1026,29 @@ func (pdf *PDF) highlightPos(w io.Writer, x, y float64, cBox *types.Rectangle) {
draw.DrawHairCross(w, x, y, cBox)
}

func (pdf *PDF) renderPageBackground(page *PDFPage, w io.Writer, cropBox *types.Rectangle) {
func (pdf *PDF) renderPageBackground(page *PDFPage, w io.Writer) {
if page.bgCol == nil {
page.bgCol = pdf.bgCol
}
if page.bgCol != nil {
draw.FillRectNoBorder(w, cropBox, *page.bgCol)
draw.FillRectNoBorder(w, page.cropBox, *page.bgCol)
}
}

func (pdf *PDF) newModelPageforPDFPage(page *PDFPage) model.Page {
mediaBox := pdf.mediaBox
if page != nil && page.mediaBox != nil {
mediaBox = page.mediaBox
}

cropBox := pdf.cropBox
if page != nil && page.cropBox != nil {
cropBox = page.cropBox
}

return model.NewPage(mediaBox, cropBox)
}

// RenderPages renders page content into model.Pages
func (pdf *PDF) RenderPages() ([]*model.Page, model.FontMap, error) {

Expand All @@ -1048,19 +1061,8 @@ func (pdf *PDF) RenderPages() ([]*model.Page, model.FontMap, error) {
for i, page := range pdf.pages {

pageNr := i + 1
mediaBox := pdf.mediaBox
cropBox := pdf.cropBox

// check taborders

p := model.Page{
MediaBox: mediaBox,
CropBox: cropBox,
Fm: model.FontMap{},
Im: model.ImageMap{},
AnnotTabs: map[int]model.FieldAnnotation{},
Buf: new(bytes.Buffer),
}
p := pdf.newModelPageforPDFPage(page)

if page == nil {
if pageNr <= pdf.XRefTable.PageCount {
Expand Down Expand Up @@ -1088,14 +1090,11 @@ func (pdf *PDF) RenderPages() ([]*model.Page, model.FontMap, error) {
}

pp = append(pp, &p)
continue
}

if page.cropBox != nil {
cropBox = page.cropBox
continue
}

pdf.renderPageBackground(page, p.Buf, cropBox)
pdf.renderPageBackground(page, p.Buf)

var headerHeight, headerDy float64
var footerHeight, footerDy float64
Expand All @@ -1119,7 +1118,7 @@ func (pdf *PDF) RenderPages() ([]*model.Page, model.FontMap, error) {
}

// Render page content.
r := cropBox.CroppedCopy(0)
r := page.cropBox.CroppedCopy(0)
r.LL.Y += footerHeight + footerDy
r.UR.Y -= headerHeight + headerDy
page.Content.mediaBox = r
Expand Down
16 changes: 8 additions & 8 deletions pkg/pdfcpu/types/layout.go
Expand Up @@ -388,24 +388,24 @@ func ParsePageFormat(v string) (*Dim, string, error) {
// eg. A4L means A4 in landscape mode whereas A4 defaults to A4P
// The default mode is defined implicitly via PaperSize dimensions.

var landscape, portrait bool
portrait := true

if strings.HasSuffix(v, "L") {
v = v[:len(v)-1]
landscape = true
} else if strings.HasSuffix(v, "P") {
v = v[:len(v)-1]
portrait = true
portrait = false
} else {
v = strings.TrimSuffix(v, "P")
}

d, ok := PaperSize[v]
if !ok {
return nil, v, errors.Errorf("pdfcpu: page format %s is unsupported.\n", v)
}

if (d.Portrait() && landscape) || (d.Landscape() && portrait) {
d.Width, d.Height = d.Height, d.Width
dim := Dim{d.Width, d.Height}
if (d.Portrait() && !portrait) || (d.Landscape() && portrait) {
dim.Width, dim.Height = dim.Height, dim.Width
}

return d, v, nil
return &dim, v, nil
}

0 comments on commit 5349a52

Please sign in to comment.