func (sfc *pdfSurface) writeArc(rdr d2g.PathReader) { x := d2g.ConvertUnit(rdr.ReadFloat64(), sfc.u, d2g.U_PT) y := d2g.ConvertUnit(rdr.ReadFloat64(), sfc.u, d2g.U_PT) r := d2g.ConvertUnit(rdr.ReadFloat64(), sfc.u, d2g.U_PT) start := rdr.ReadFloat64() sweep := rdr.ReadFloat64() x0 := x + r*math.Cos(start) y0 := y + r*math.Sin(start) sfc.writeMove(x0, y0) a1 := start end := start + sweep sign := 1.0 if end < a1 { sign = -1.0 } left := math.Abs(sweep) for left > 0 { a2 := a1 + sign*math.Min(math.Pi/2, left) sfc.writePartialArc(x, y, r, a1, a2) left -= math.Abs(a2 - a1) a1 = a2 } }
func (sfc *pdfSurface) Text(f d2g.Font, x, y float64, text string) { if pf, ok := f.(*pdfFont); ok { if !sfc.inText { fmt.Fprint(sfc.w, "BT\r\n") sfc.inText = true } if sfc.lastFont == nil || !sfc.lastFont.Equals(pf) { fmt.Fprintf(sfc.w, "/F%d %f Tf\r\n", pf.face.id, d2g.ConvertUnit(pf.size, sfc.u, d2g.U_PT)) sfc.lastFont = pf sfc.fonts = append(sfc.fonts, pf.face) } fmt.Fprintf(sfc.w, "%f %f Td\r\n(", d2g.ConvertUnit(x, sfc.u, d2g.U_PT), d2g.ConvertUnit(y, sfc.u, d2g.U_PT)) textBuf := new(bytes.Buffer) for _, c := range text { escaped := false for eIx, ec := range charsToEscape { if c == ec { textBuf.WriteByte(escapeChar) textBuf.WriteByte(escapedChars[eIx]) escaped = true } } if !escaped { textBuf.WriteRune(c) } } if textBuf.Len() > 0 { sfc.w.Write(textBuf.Bytes()) } fmt.Fprint(sfc.w, ") Tj\r\n") } }
func (p *pdfPage) WriteTo(w io.Writer) (n int64, err error) { n, err = startObj(p, w) if err != nil { return 0, err } var width float64 var height float64 if p.po == dox2go.PO_Portrait { width = p.w height = p.h } else { width = p.h height = p.w } dw := dictionaryWriter{w, 0, nil} aw := arrayWriter{w, 0, nil} dw.Start() dw.Name("Type") dw.Name(p.Type()) dw.Name("Parent") dw.Ref(p.parent) dw.Name("MediaBox") aw.Start() aw.Value(0) aw.Value(" ") aw.Value(0) aw.Value(" ") aw.Value(dox2go.ConvertUnit(width, p.pu, dox2go.U_PT)) aw.Value(" ") aw.Value(dox2go.ConvertUnit(height, p.pu, dox2go.U_PT)) aw.End() dw.Name("Contents") dw.Ref(p.c) dw.Name("Resources") dw.Start() dw.Name("Font") dw.Start() for _, f := range p.sfc.fonts { dw.Value("/F") dw.Value(f.Id()) dw.Value(" ") dw.Ref(f) } dw.End() dw.Name("XObject") dw.Start() for key, xo := range p.sfc.xobjs { dw.Name(key) dw.Ref(xo) } dw.End() dw.End() dw.End() if dw.err != nil { return n, dw.err } if aw.err != nil { return n, aw.err } n = n + dw.n + aw.n n2, err := endObj(p, w) n += int64(n2) return n, err }
func (sfc *pdfSurface) Translate(x, y float64) { sfc.alterMatrix(1, 0, 0, 1, d2g.ConvertUnit(x, sfc.u, d2g.U_PT), d2g.ConvertUnit(y, sfc.u, d2g.U_PT)) }
func (sfc *pdfSurface) writePath(path *d2g.Path) { r := path.Reader() cmd, ok := r.ReadCommandType() for ok { switch cmd { case d2g.MoveCmdType: sfc.writeMove( d2g.ConvertUnit(r.ReadFloat64(), sfc.u, d2g.U_PT), d2g.ConvertUnit(r.ReadFloat64(), sfc.u, d2g.U_PT)) case d2g.LineCmdType: sfc.writeLine( d2g.ConvertUnit(r.ReadFloat64(), sfc.u, d2g.U_PT), d2g.ConvertUnit(r.ReadFloat64(), sfc.u, d2g.U_PT)) case d2g.CurveCmdType: sfc.writeCurve( d2g.ConvertUnit(r.ReadFloat64(), sfc.u, d2g.U_PT), d2g.ConvertUnit(r.ReadFloat64(), sfc.u, d2g.U_PT), d2g.ConvertUnit(r.ReadFloat64(), sfc.u, d2g.U_PT), d2g.ConvertUnit(r.ReadFloat64(), sfc.u, d2g.U_PT), d2g.ConvertUnit(r.ReadFloat64(), sfc.u, d2g.U_PT), d2g.ConvertUnit(r.ReadFloat64(), sfc.u, d2g.U_PT)) case d2g.RectCmdType: x1 := r.ReadFloat64() y1 := r.ReadFloat64() fmt.Fprintf(sfc.w, "%f %f %f %f re\r\n", d2g.ConvertUnit(x1, sfc.u, d2g.U_PT), d2g.ConvertUnit(y1, sfc.u, d2g.U_PT), d2g.ConvertUnit(r.ReadFloat64()-x1, sfc.u, d2g.U_PT), d2g.ConvertUnit(r.ReadFloat64()-y1, sfc.u, d2g.U_PT)) case d2g.ArcCmdType: sfc.writeArc(r) case d2g.CloseCmdType: fmt.Fprint(sfc.w, "h\r\n") default: r.Dump() panic("Unknown path command.") } cmd, ok = r.ReadCommandType() } }
func (sfc *pdfSurface) LineWidth(width float64) { sfc.endText() fmt.Fprintf(sfc.w, "%f w\r\n", d2g.ConvertUnit(width, sfc.u, d2g.U_PT)) }