bounty还有16小时到期。此问题的答案有资格获得+50声望奖励。girish希望引起更多关注这个问题。
我正在使用wkhtmltopdf库生成PDF,当它托管在服务器上时,我无法获得PDF文档的页脚。它在我的本地系统上工作正常。我使用下面的代码来设置页脚。
func HTMLtoPDF(html string, someID int64, templatePath string) (*wkhtml.PDFGenerator, error) {
pdfg, err := wkhtml.NewPDFGenerator()
if err != nil {
return nil, err
}
page := wkhtml.NewPageReader(strings.NewReader(util.FilterSmartQuotesEtc(html)))
tempPath := path.Clean(fmt.Sprintf("%v/%s", templatePath, "footer.html"))
footerFilePath, err := getFooterFilePath(tempPath, someID)
if err != nil {
return nil, err
}
page.FooterHTML.Set(footerFilePath)
pdfg.AddPage(page)
pdfg.MarginTop.Set(10)
pdfg.MarginBottom.Set(10)
// Create PDF document in internal buffer
err = pdfg.Create()
if err != nil {
return nil, err
}
return pdfg, nil
}
func getFooterFilePath(templatePath string, someID int64) (string, error) {
tmpl, err := htmlTemplate.ParseFiles(templatePath)
if err != nil {
return "", err
}
var buf bytes.Buffer
data := FooterData {
SomeID: someID,
}
err = tmpl.Execute(&buf, data)
if err != nil {
return "", err
}
// Save the rendered HTML to a temporary file
tmpFile, err := ioutil.TempFile("", "footer-*.html")
if err != nil {
return "", err
}
if _, err := tmpFile.Write(buf.Bytes()); err != nil {
return "", err
}
if err := tmpFile.Close(); err != nil {
return "", err
}
return tmpFile.Name(), nil
}
我已经验证了在getFooterFilePath函数中创建了临时页脚文件,并且我的someID变量也被替换。我通过记录生成的临时页脚文件检查了这一点,我可以在日志中看到内容。我做错什么了吗?任何帮助真的很感激
1条答案
按热度按时间tp5buhyn1#
wkhtmltopdf
具有--replace <name> <value>
选项,可以在页眉和页脚中将name
替换为value
(可重复)。这是创建动态页眉和页脚的推荐方法。希望它能解决这个问题。参考:https://wkhtmltopdf.org/usage/wkhtmltopdf.txt。下面是演示:
下面是footer. html文件:
如果上述方法不起作用,或者您有兴趣找出临时文件方法的问题所在,我们可以先做这些事情来缩小问题范围:
1.运行
strace -f /path/to/the/app > log.txt
跟踪系统调用和信号。-f
选项使其跟踪子进程(wkhtmltopdf
在子进程中运行)。1.最后一步的日志应该包含传递给
wkhtmltopdf
命令的选项。直接使用相同的选项运行wkhtmltopdf
命令,看看是否有什么不同。1.如果页脚被正确呈现,那么Go代码中有一些错误。可能是临时文件尚未准备好使用。
1.如果它没有任何区别,因为相同的命令在您的本地计算机上工作,这可能是与环境相关的问题。可能服务器上的
wkhtmltopdf
版本有bug;可能服务器没有所需的字体。请提供
log.txt
和直接运行wkhtmltopdf
的结果,以便我们决定下一步怎么做。