V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qsnow6
V2EX  ›  问与答

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

  •  
  •   qsnow6 · 2018-01-18 23:12:32 +08:00 via iPhone · 2009 次点击
    这是一个创建于 2286 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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


    @undeflife #1 我试试 WKHTMLTOPDF

    之前我用的第三方 api 是 https://pdfcrowd.com 效果还行,就是付费策略太坑
    herozhang
        6
    herozhang  
       2018-01-19 00:51:22 +08:00
    chrome,打印,另存为 PDF 不可以么
    shiny
        7
    shiny  
       2018-01-19 00:54:21 +08:00   ❤️ 2
    Headless Chrome 支持直接创建 pdf
    https://github.com/GoogleChrome/puppeteer
    搜索 pdf 有示例代码。
    yangxiongguo
        8
    yangxiongguo  
       2018-01-19 01:11:38 +08:00 via Android
    按按按键键键精灵,另外 7 楼是最好的方案
    geelaw
        9
    geelaw  
       2018-01-19 01:48:50 +08:00   ❤️ 2
    可以自动化 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
        10
    ysc3839  
       2018-01-19 02:34:48 +08:00
    @geelaw 刚才试了一下,选择位置的对话框是在当前进程中的。那可以自己程序里调用 WebBrowser 打印,同时 Hook 一下相关 API,直接返回对应的位置。
    binux
        11
    binux  
       2018-01-19 02:37:37 +08:00   ❤️ 1
    ysc3839
        12
    ysc3839  
       2018-01-19 02:52:13 +08:00
    @geelaw 刚才调试了一下,确实会调用 GetSaveFileNameW,那就好办了。
    ysc3839
        13
    ysc3839  
       2018-01-19 02:57:58 +08:00
    关于网页兼容性。
    wkhtmltopdf 用的是 QtWebKit。
    刚才我说的调用 WebBrowser 还有些坑,要改个注册表来使用新版本的 IE 内核,否则会使用 IE7 的内核。
    另外 Win10 的话有办法调用 Edge 的内核。
    论通用性兼容性,Headless Chrome 是最好的。
    GreatMartial
        14
    GreatMartial  
       2018-01-19 07:57:21 +08:00 via Android
    simple PDF
    yingfengi
        15
    yingfengi  
       2018-01-19 08:16:36 +08:00 via Android
    打印成 PDF
    xycool
        16
    xycool  
       2018-01-19 08:47:58 +08:00
    试试 Puppeteer ?
    murmur
        17
    murmur  
       2018-01-19 08:49:05 +08:00
    感觉 chrome 的打印功能很好用
    Tink
        18
    Tink  
       2018-01-19 09:02:52 +08:00
    @qsnow6 #5 无头 chrome 不行吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5358 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:06 · PVG 17:06 · LAX 02:06 · JFK 05:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.