我该如何解决这个PDF生成?

问题描述 投票:0回答:1

员工移动了,只剩下我这个代码,曾经努力生成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" });
}

产生-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']
    });
}
javascript c# angular .net-core puppeteer
1个回答
0
投票

貌似产生-pdf.js脚本使用“HTML-PDF”。这可以在NPM发现:https://www.npmjs.com/package/html-pdf

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

所以,问题将是与包的使用,或者它的某种错误的。 (当然,这是由于我的假设,我不知道这个包在所有和没有经验与它的工作)

在这一点上我会尝试找出正在使用的是包的版本,请查看源代码,并试图找到一个暗示在那里。

这种结构似乎颇为曲折,但。为什么不直接产生在客户端的PDF摆在首位,或者它在C#代码生成?它在某一点的工作和现在一样,你都注意到这被证明是难以维持不应该是一个参数。

© www.soinside.com 2019 - 2024. All rights reserved.