将很长 url 传递给 Puppeteer - 有更好的方法吗?
Passing very long url to Puppeteer - is there a better way?
所以一个 git 问题让我回滚了大约两周的工作 -
我目前正在尝试将大约 3300 个字符串的数组传递给车把模板,然后尝试将其打印为 pdf - 我的问题是我很确定我的 pupepteer URL 在 3000 处被切断人物。我不知所措。
<<<< my data logs as -----> Array(3330) [Object, Object, Object, Object, Object, Object, Object, Object, …] >>>
var templateHtml = fs.readFileSync(path.join(process.cwd(), 'template.html'), 'utf8');
var template = handlebars.compile(templateHtml);
var html = template(data);
await page.goto(`data:text/html;charset=UTF-8,${html}`, {
waitFor:10000
});
在我 git 崩溃之前,我正在打印 90 页 PDF,但我无法弄清楚我之前做了什么。
回答
您的问题似乎是 Data URI length limitation. It is 2MB in case of Chromium。因此,如果您的 html
超出限制,它将被修剪甚至根本不呈现。
我建议用page.setContent
,内容一样,没有上限
例子
注意: setContent
需要一个字符串作为输入,我刚刚复制了example.com的源码。
const puppeteer = require('puppeteer')
async function fn() {
const browser = await puppeteer.launch({ headless: true })
const page = await browser.newPage()
await page.goto('data:text/html,<h1>Template</h1>')
await page.waitFor(2000)
await page.setContent(
'<!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 2em; background-color: #fdfdff; border-radius: 0.5em; box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02); } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { div { margin: 0 auto; width: auto; } } </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>'
)
await page.pdf({ path: 'page.pdf' })
await browser.close()
}
fn()
所以一个 git 问题让我回滚了大约两周的工作 -
我目前正在尝试将大约 3300 个字符串的数组传递给车把模板,然后尝试将其打印为 pdf - 我的问题是我很确定我的 pupepteer URL 在 3000 处被切断人物。我不知所措。
<<<< my data logs as -----> Array(3330) [Object, Object, Object, Object, Object, Object, Object, Object, …] >>>
var templateHtml = fs.readFileSync(path.join(process.cwd(), 'template.html'), 'utf8');
var template = handlebars.compile(templateHtml);
var html = template(data);
await page.goto(`data:text/html;charset=UTF-8,${html}`, {
waitFor:10000
});
在我 git 崩溃之前,我正在打印 90 页 PDF,但我无法弄清楚我之前做了什么。
回答
您的问题似乎是 Data URI length limitation. It is 2MB in case of Chromium。因此,如果您的 html
超出限制,它将被修剪甚至根本不呈现。
我建议用page.setContent
,内容一样,没有上限
例子
注意: setContent
需要一个字符串作为输入,我刚刚复制了example.com的源码。
const puppeteer = require('puppeteer')
async function fn() {
const browser = await puppeteer.launch({ headless: true })
const page = await browser.newPage()
await page.goto('data:text/html,<h1>Template</h1>')
await page.waitFor(2000)
await page.setContent(
'<!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 2em; background-color: #fdfdff; border-radius: 0.5em; box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02); } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { div { margin: 0 auto; width: auto; } } </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>'
)
await page.pdf({ path: 'page.pdf' })
await browser.close()
}
fn()