Все делается достаточно банально и просто. С поиском решения весь процесс занял не более пары часов. Правда нужно использовать сторонние средства (уже слышу ехидные усмешки разработчиков node.js). К сожалению, полноценного процесса на Go на момент написания я не нашел. Используем wkhtmltopdf.
Он понравился прежде всего за простоту установки.
К примеру для Ubuntu:
apt-get install wkhtmltopdf
apt-get install xvfb
echo -e '#!/bin/bash\nxvfb-run -a --server-args="-screen 0, 1024x768x24" /usr/bin/wkhtmltopdf -q $*' > /usr/bin/wkhtmltopdf.sh
chmod a+x /usr/bin/wkhtmltopdf.sh
ln -s /usr/bin/wkhtmltopdf.sh /usr/local/bin/wkhtmltopdf
sudo dpkg -i name_packet.deb
go get github.com/SebastiaanKlippert/go-wkhtmltopdf
func (b *BaseController) Render() error {
if !b.EnableRender {
return nil
}
rb, err := b.RenderBytes()
if err != nil {
return err
}
export := b.GetString("export")
if export == "pdf" {
b.Ctx.Output.Header("Content-Type", "application/pdf; charset=utf-8")
return b.Ctx.Output.Body(ToPDF(rb))
}
if b.Ctx.ResponseWriter.Header().Get("Content-Type") == "" {
b.Ctx.Output.Header("Content-Type", "text/html; charset=utf-8")
}
return b.Ctx.Output.Body(rb)
}
package controllers
import (
"bytes"
"log"
"github.com/astaxie/beego"
wkhtmltopdf "github.com/SebastiaanKlippert/go-wkhtmltopdf"
)
// ToPDF ...
// Generate PDF document from HTML
func ToPDF(htmlStr []byte) []byte {
// Create new PDF generator
pdfg, err := wkhtmltopdf.NewPDFGenerator()
if err != nil {
log.Fatal(err)
}
pdfg.Dpi.Set(600)
pdfg.NoCollate.Set(false)
pdfg.PageSize.Set(wkhtmltopdf.PageSizeA4)
pdfg.MarginBottom.Set(40)
page1 := wkhtmltopdf.NewPageReader(bytes.NewReader(htmlStr))
pdfg.AddPage(page1)
// Create PDF document in internal buffer
err = pdfg.Create()
if err != nil {
beego.Trace(err)
}
// Return buffer contents
return pdfg.Bytes()
}
К сожалению, не доступен сервер mySQL