Rails HTML 使用 puppeteer 转 PDF(无头 chrome),如何将 html 发送到 puppeteer

Rails HTML to PDF using puppeteer (headless chrome), how to send html to puppeteer

我有一个 rails 应用程序,它使用下面的代码从 HTML 页面下载 PDF。它工作正常,但速度很慢,因为它在将页面保存为 PDF 之前加载页面。

如何直接从我的 Rails 服务器发送它 HTML,这样它就不需要加载 url?有什么方法可以呈现为字符串并通过它发送吗?还是我需要渲染到一个文件,然后发送它的路径?

class PagesController < ApplicationController

  def pdf
    tmp = Tempfile.new("tmp/pdf-chrome-puppeteer")
    system("yarn createPDF #{Shellwords.escape("https://google.com")} #{Shellwords.escape(tmp.path)}")
    pdf_filename = "output.pdf"
    send_file(tmp.path, filename: pdf_filename, type: 'application/pdf', disposition: 'attachment')
  end
end

我的 JS:

#!/usr/bin/env node

const puppeteer = require("puppeteer");

const createPdf = async() => {
  const startTime = new Date().getTime();
  let browser;
  try {
    browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
    const page = await browser.newPage();
    await page.goto(process.argv[2], {timeout: 30000, waitUntil: 'networkidle2'});
    await page.pdf({
      path: process.argv[3],
      format: 'A4',
      margin: { top: 36, right: 36, bottom: 20, left: 36 },
      printBackground: true
    });
  } catch (err) {
      console.log(err.message);
  } finally {
    if (browser) {
      browser.close();
    }
    process.exit();
  }
};

您可以将 html 存储在 stringTempFile 中。

   view = ActionView::Base.new Rails.configuration.paths['app/views']     
   view.assign(model_name: model_instance)
   html = view.render file: 'path/to/view'

您可以为此使用 gem。这捆绑了所有东西 https://github.com/Studiosity/grover