Я попробовал wkhtmltopdf, но не смог заставить его работать удовлетворительно. Теперь я использую weasyprint как на MacOS, так и на Ubuntu (на Raspberry Pi).
Я использую эту функцию:
func generateWeasy(html: Bytes) -> Bytes {
// Fetch a PDF from WeasyPrint and return it
let weasy = Process()
let input = Pipe()
let output = Pipe()
let htmlData = Data(html)
weasy.standardInput = input
weasy.standardOutput = output
weasy.launchPath = "/usr/local/bin/weasyprint"
weasy.arguments = ["-f", "pdf", "-", "-"]
weasy.launch()
input.fileHandleForWriting.write(htmlData)
input.fileHandleForWriting.closeFile()
return output.fileHandleForReading.readDataToEndOfFile().makeBytes()
}
Затем для рендеринга вида в PDF я использую стандартный лист внутри маршрута:
html = try self.view.make("pdfCertificate", settings).makeBytes()
Затем я изменяю заголовок ответа и генерирую PDF:
let response = Response(status: .ok, body: .data( self.generateWeasy( html:html )))
response.headers["Content-Disposition"] = "filename=\"" + title + " - Certificates.pdf\""
return response