问题描述
我是Puppeteer的新手。成功地将整个网站转换为pdf,但是,理想情况下,我需要将div中的MathJax方程转换为pdf。到目前为止,我正在使用以下代码:
// Require puppeteer
const puppeteer = require('puppeteer');
(async () => {
// Create an instance of the chrome browser
// But disable headless mode !
const browser = await puppeteer.launch()
// Create a new page
const page = await browser.newPage()
// Configure the navigation timeout
await page.goto('https://9217531f4f48.ngrok.io/chapter-14/weblesson.PHP',{
waitUntil: 'load',// Remove the timeout
timeout: 30000
});
// Navigate to a particular div on the website
const dom = await page.$eval('#doto',(el) => {
return el.innerHTML
}) // Get DOM HTML
await page.evaluate(async () => {
const script = document.createElement('script');
script.src ='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js" id="MathJax-script';
const promise = new Promise((resolve,reject) => {
script.onload = resolve;
script.onerror = reject;
});
document.head.appendChild(script);
await promise;
});
await page.setContent(dom)
await page.pdf({path: 'pdf/pairt.pdf',format: 'A4',printBackground: true,displayheaderfooter: true,headerTemplate: '<div id="header-template" style="font-size:10px !important; color:#808080; padding-left:10px"><span class="date"></span><span class="title"></span><span class="pageNumber"></span><span class="totalPages"></span></div>',footerTemplate: '<div id="footer-template" style="font-size:10px !important; color:#808080; padding-left:10px"><span class="date"></span><span class="title"></span><span class="url"></span><span class="pageNumber"></span><span class="totalPages"></span></div>',margin: {
top: '100px',bottom: '200px',right: '30px',left: '30px',},});
await page.close();
await browser.close()
})()
我得到以下内容
Puppeteer不允许MathJax脚本在页面$ eval上正确转换数学表达式。
预期输出;
我需要某人的帮助,如预期的输出中所示,如何将MathJax方程呈现为pdf
解决方法
@Davide Cervone,添加了waiting page.waitFor(5000)行后,可以使用此经过调整的代码来工作,以在创建pdf之前等待MathJax的完整呈现:
"use strict";
// Require puppeteer
const puppeteer = require('puppeteer');
(async () => {
// Create an instance of the chrome browser but disable headless mode !
const browser = await puppeteer.launch({args: ['--no-sandbox','--disable-setuid-sandbox']})
// Create a new page
const page = await browser.newPage()
// Configure the navigation timeout
await page.goto('https://a1e3b598ebba.ngrok.io/chapter-14/lesson.php',{waitUntil: 'load'});
// Navigate to a particular div on the website
const dom = await page.$eval('#doto',(el) => {
return el.innerHTML
}) // Get DOM innerHTML
await page.setContent(dom);
var cssb = [];
cssb.push('<style>');
cssb.push('h1 { font-size:10px;position:absolute;background-color:#f00; z-index:1000;color:#000; margin-left:30px;}');
cssb.push('</style>');
const css = cssb.join('');
await page.waitFor(5000);
await page.pdf({path: 'pdf/hn' + Date.now() + '.pdf',format: 'A4',printBackground: true,displayHeaderFooter: true,headerTemplate: '<div id="header-template" style="font-size:10px !important; color:#808080; padding-left:10px"><span class="date"></span>',footerTemplate: css + '<h1>Page <span class="pageNumber"></span> of <span class="totalPages"></span></h1>',margin: {
top: '100px',bottom: '100px',right: '30px',left: '30px',},});
await page.close();
await browser.close()
})()
我希望这对以后来这里的人有帮助。