如何解决此PDF生成问题?

时间:2019-02-02 21:43:57

标签: javascript c# angular .net-core puppeteer

员工继续前进,并留下了我曾经用来生成PDF的这段代码。我没有尝试进行调试的运气-带有断点,甚至没有console.logs-底部列出的脚本;有没有一种方法可以在Visual Studio中搜索大量已加载的脚本?

C#错误:

{System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.IO.IOException: The server returned an invalid or unrecognized response.
   at System.Net.Http.HttpConnection.FillAsync()

客户端错误:(这是因为服务器从不返回任何东西吗?)

ERROR Error: Uncaught (in promise): DataCloneError: Failed to execute 'postMessage' on 'Worker': TypeError: Failed to fetch could not be cloned.
Error: Failed to execute 'postMessage' on 'Worker': TypeError: Failed to fetch could not be cloned.
    at MessageHandler.postMessage (pdf.js:12334)
    at sendStreamRequest (pdf.js:12151)
    at Object.error (pdf.js:12194)
    at eval (pdf.js:8419)
    at ZoneDelegate.invoke (zone.js:392)

控制器方法

public async Task<IActionResult> Generate(string id)
{
    try
    {
        var stream = await _reportService.GenerateReportAsync(id);
        return new FileStreamResult(stream, "application/pdf");
    }
    catch(Exception ex)
    {
        throw;
    }            
}

服务方法:

public async Task<Stream> GenerateReportAsync(string id)
{
    return await Services.InvokeAsync<Stream>("./Node/generate-pdf.js", Configuration.Url, id, new { format = "A4" });
}

generate-pdf.js:

const pdf = require('html-pdf');
const puppeteer = require('puppeteer');

module.exports = async function (result, url, id, options) {

const browser = await createBrowser();
const page = await browser.newPage();
const css = await browser.newPage();

await page.goto(`${url}/reports/${id}`, {
    waitUntil: 'networkidle2'
});

await css.goto(`${url}/styles.bundle.css`, {
    waitUntil: 'networkidle2'
});

await page.waitForSelector('.report-loaded');
let cssBody = await css.evaluate(() => `<style>${document.documentElement.innerHTML}</style>`);
let bodyHtml = await page.evaluate(() => document.documentElement.innerHTML);

bodyHtml = bodyHtml.replace('<link href="styles.bundle.css" rel="stylesheet">', cssBody);

browser.close();

pdf.create(cssBody + bodyHtml, options).toStream((error, stream) => stream.pipe(result.stream));
}

async function createBrowser() {
    return await puppeteer.launch({
        args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
}

1 个答案:

答案 0 :(得分:0)

好像generate-pdf.js脚本正在使用“ html-pdf”。可以在npm上找到: https://www.npmjs.com/package/html-pdf

它有一个github页面: https://github.com/marcbachmann/node-html-pdf

所以问题将出在该软件包的使用上,或其中的某种错误。 (嗯,这只是我的一个假设,我一点都不知道这个程序包,也没有使用它的经验)

此时我想尝试找出正在使用该包的版本,检查出的源代码,并试图找到在那里的提示。

尽管如此,这种结构似乎很复杂。为什么不首先在客户端中生成PDF,还是在C#代码中生成PDF?它在某一点的工作应该不会像你现在注意到这被证明是难以维持的理由。