HTML 转 PDF 有什么来源的解决方案吗

2018-01-18 23:12:32 +08:00
 qsnow6

看到那个用 WORD 筛选简历的帖子,想起这个需求。

之前谷歌到一款付费的 api,但是很坑爹

  1. 一个月 30 刀
  2. 限制请求次数
  3. 当月没用完就清零

今天登陆账号一看,清零了,心疼之前没用完的配额,不知道有来源的解决方案吗,html 转 pdf 有什么难点?

2100 次点击
所在节点    问与答
18 条回复
undeflife
2018-01-18 23:17:50 +08:00
自建后端 使用 wkhtmltopdf
也有前端转 pdf 的方案 也就是 html->canvas->image->pdf 效果不好:文件尺寸大、不清晰等问题
如果倾向第三方 api 的话 https://www.sejda.com/html-to-pdf 我试过效果还不错
lozzow
2018-01-19 00:02:40 +08:00
chrome,打印,另存为 PDF 不可以么
Tink
2018-01-19 00:10:37 +08:00
打印
ospider
2018-01-19 00:11:32 +08:00
pandoc
qsnow6
2018-01-19 00:35:59 +08:00
@Tink #3 @lozzow #2 打印没办法自动化啊,每个月有几十份要转


@undeflife #1 我试试 WKHTMLTOPDF

之前我用的第三方 api 是 https://pdfcrowd.com 效果还行,就是付费策略太坑
herozhang
2018-01-19 00:51:22 +08:00
chrome,打印,另存为 PDF 不可以么
shiny
2018-01-19 00:54:21 +08:00
Headless Chrome 支持直接创建 pdf
https://github.com/GoogleChrome/puppeteer
搜索 pdf 有示例代码。
yangxiongguo
2018-01-19 01:11:38 +08:00
按按按键键键精灵,另外 7 楼是最好的方案
geelaw
2018-01-19 01:48:50 +08:00
可以自动化 IE 的打印功能。

大概思路:

$PdfPrinter = @(Get-WmiObject -Class Win32_Printer | Where-Object Name -Like '*pdf*')
If ($PdfPrinter.Count -ne 1)
{
Write-Error '有多个 PDF 打印机或者没有 PDF 打印机'
exit
}
# 设置 Microsoft Print to PDF 为默认打印机
$PdfPrinter[0].SetDefaultPrinter()

# 打开 IE
$IE = New-Object -ComObject InternetExplorer.Application
$IE.Navigate('https://geelaw.blog/')

# 等 IE 加载完毕
While ($IE.Busy) { Start-Sleep 1; }

# 生成一个文件名
$FileName = [System.IO.Path]::Combine($env:TMP, [System.Guid]::NewGuid().ToString('n') + '.pdf')

# 准备一个脚本对象
$WSh = New-Object -ComObject WScript.Shell

# 用默认打印机打印
$IE.ExecWB(6, 2)

# 这里的等待时间需要动态调整才行,等保存对话框弹出来
Start-Sleep 1;

# 复制文件名,按 Ctrl+V,再按 Enter
$FileName | Set-Clipboard
$WSh.SendKeys('^V{ENTER}')

# 需要动态调整,等打印完成
Start-Sleep 1

# 关掉 IE
$IE.Quit()

# 打开保存的文件
$FileName | Invoke-Item

你可以使用可以编程设置保存位置的打印机来更好地自动化保存的位置(似乎 Adobe PDF Printer 是可以的)。
ysc3839
2018-01-19 02:34:48 +08:00
@geelaw 刚才试了一下,选择位置的对话框是在当前进程中的。那可以自己程序里调用 WebBrowser 打印,同时 Hook 一下相关 API,直接返回对应的位置。
binux
2018-01-19 02:37:37 +08:00
ysc3839
2018-01-19 02:52:13 +08:00
@geelaw 刚才调试了一下,确实会调用 GetSaveFileNameW,那就好办了。
ysc3839
2018-01-19 02:57:58 +08:00
关于网页兼容性。
wkhtmltopdf 用的是 QtWebKit。
刚才我说的调用 WebBrowser 还有些坑,要改个注册表来使用新版本的 IE 内核,否则会使用 IE7 的内核。
另外 Win10 的话有办法调用 Edge 的内核。
论通用性兼容性,Headless Chrome 是最好的。
GreatMartial
2018-01-19 07:57:21 +08:00
simple PDF
yingfengi
2018-01-19 08:16:36 +08:00
打印成 PDF
xycool
2018-01-19 08:47:58 +08:00
试试 Puppeteer ?
murmur
2018-01-19 08:49:05 +08:00
感觉 chrome 的打印功能很好用
Tink
2018-01-19 09:02:52 +08:00
@qsnow6 #5 无头 chrome 不行吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/424068

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX