Esempio n. 1
0
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
	}
}
Esempio n. 2
0
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")
	}
}
Esempio n. 3
0
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
}
Esempio n. 4
0
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))
}
Esempio n. 5
0
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()
	}
}
Esempio n. 6
0
func (sfc *pdfSurface) LineWidth(width float64) {
	sfc.endText()

	fmt.Fprintf(sfc.w, "%f w\r\n", d2g.ConvertUnit(width, sfc.u, d2g.U_PT))
}