Как я могу устранить неполадки в этом поколении PDF? - PullRequest
0 голосов
/ 03 февраля 2019

Сотрудник перешел и оставил мне этот код, который когда-то работал для создания 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 голосов
/ 03 февраля 2019

Похоже, что скрипт generate-pdf.js использует "html-pdf".Это можно найти на npm: https://www.npmjs.com/package/html-pdf

И у него есть страница github: https://github.com/marcbachmann/node-html-pdf

Так что проблема будет с использованием этого пакета или какого-тоошибка в этом.(ну, это предположение с моей стороны, я совсем не знаю этот пакет и не имею опыта работы с ним)

На этом этапе я бы попытался выяснить, какая версия этого пакета используется.использовать, проверить исходный код и попытаться найти подсказку там.

Хотя эта структура выглядит довольно запутанной.Почему бы просто не сгенерировать PDF в клиенте или создать его в коде C #?То, что в какой-то момент это работало, не должно быть аргументом, поскольку вы сейчас замечаете, что это трудно поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...