Серверный PDF с ABCPdf.Webkit не отображает HighcartsC#

Место общения программистов C#
Ответить
Anonymous
 Серверный PDF с ABCPdf.Webkit не отображает Highcarts

Сообщение Anonymous »

У меня есть реализация ABCPdf 13.3.0, с помощью которой я пытаюсь визуализировать html-содержимое на сервере. Для этого я использую движок Webkit, поскольку он поддерживает импорт пользовательских шрифтов, а также потому, что Gecko не так хорошо отображает отчет.
Все работало отлично, пока мне не понадобилось добавьте Highcharts в микс. Я нашел способ создать разметку highcharts, использующую JavaScript. Когда я загружаю необработанную разметку в браузер, диаграмма отображается так, как ожидалось. Однако когда я отправляю ту же самую разметку через ABCPDF, отображается все, кроме диаграммы.
Вот пример необработанного HTML-кода для области с диаграммой, с разметка, сгенерированная высокими диаграммами, включала:


if (document.addEventListener) {document.addEventListener("DOMContentLoaded", function() {createChartf471be1cb2024da284178920e0794b6d();});} else if (document.attachEvent) {document.attachEvent("onreadystatechange", function(){if (document.readyState === "complete"){document.detachEvent("onreadystatechange", arguments.callee);createChartf471be1cb2024da284178920e0794b6d();}});}function createChartf471be1cb2024da284178920e0794b6d() {var ChartOptions = {"exporting":{"enabled":false},"title":{"text":""},"yAxis":[{"title":{"text":""},"min":0.0}],"xAxis":[{"categories":["62","63","64","65","66","67","68","69","70"]}],"credits":{"enabled":false},"legend":{"enabled":false},"chart":{"marginTop":0.0,"renderTo":"f471be1cb2024da284178920e0794b6d","marginRight":0.0,"height":"170","marginBottom":0.0,"marginLeft":0.0},"series":[{"color":"rgb(217,217,216)","type":"column","data":[{"y":2344.0,"x":62.0},{"y":2597.0,"x":63.0},{"y":2881.0,"x":64.0},{"y":3246.0,"x":65.0},{"y":3635.0,"x":66.0},{"y":4051.0,"x":67.0},{"y":4550.0,"x":68.0},{"y":5082.0,"x":69.0},{"y":5650.0,"x":70.0}],"dataLabels":{"inside":true,"format":"${text}","enabled":true}}],"plotOptions":{"column":{"stacking":"normal","animation":{"duration":0},"dataLabels":{"enabled":false}}}};Highcharts.chart("f471be1cb2024da284178920e0794b6d",ChartOptions);}
Test




Я пробовал различные способы задержки рендеринга, в том числе пытался использовать JavaScript (работает для Gecko, но не для Webkit), а также пробовал использовать некоторые настройки из найденного сообщения:
document.SetInfo(0, "RenderDelay", "500")
document.SetInfo(0, "OneStageRender", 0)

А вот основная логика моего рендерера (.net 9.0)
public async Task RenderMarkupToPdfAsync(PdfOptions options,
CancellationToken cancellationToken = default)
{
if (!XSettings.LicenseValid)
{
//license key installation omitted for brevity
}

using var document = new Doc();

document.HtmlOptions.Engine = EngineType.WebKit;
document.HtmlOptions.UseScript = options.EnableJavascript;
document.HtmlOptions.Media = MediaType.Screen;

document.HtmlOptions.ForWebKit.UseScript = true;
document.HtmlOptions.ForWebKit.OnLoadScript = $"window.ABCpdf_go = false; (function(){{ setTimeout(function(){{ window.ABCpdf_go = true; }}, 2000); }})();";

if (options.EnableJavascript && options.JavascriptWaitDuration.TotalMilliseconds > 0)
{
document.HtmlOptions.OnLoadScript = $"(function(){{ window.ABCpdf_go = false; setTimeout(function(){{ window.ABCpdf_go = true; }}, {options.JavascriptWaitDuration.TotalMilliseconds}); }})();";
}

foreach (var fontUri in options.FontUris)
{
document.AddImageUrl(fontUri.AbsoluteUri);
}

if (options.HorizontalMargin > 0 || options.VerticalMargin > 0)
{
document.Rect.Inset(options.HorizontalMargin, options.VerticalMargin);
}

var imageId = document.AddImageHtml(options.Html, true, 680, true);

while (document.Chainable(imageId))
{
document.Page = document.AddPage();
imageId = document.AddImageToChain(imageId);
}

//remove blank pages
for (var i = document.PageCount; i > 0; i--)
{
document.PageNumber = i;

//get the pdf content
var textContent = document.GetText("Text");

//delete the page if it is blank
if (string.IsNullOrEmpty(textContent))
{
document.Delete(document.Page);
}
}

//add page numbers to all pages after the cover page
if (options.IncludePageNumbers)
{
for (var i = 2; i k).Select(k => k.ToString()).ToList()
}
],
YAxis =
[
new YAxis
{
Min = 0,
Title = new YAxisTitle()
{
Text = ""
}
}
],
Series =
[
new ColumnSeries()
{
Data = data.Select(d => new ColumnSeriesData()
{
X = d.Key,
Y = d.Value
}).ToList(),
Color = "rgb(217,217,216)",
DataLabels = new ColumnSeriesDataLabels()
{
Enabled = true,
Inside = true,
Format = "${text}"
}
}
],
PlotOptions = new PlotOptions()
{
Column = new PlotOptionsColumn()
{
Stacking = PlotOptionsColumnStacking.Normal,
//AnimationBool = false,
Animation = new Animation()
{
Duration = 0
},
DataLabels = new PlotOptionsColumnDataLabels()
{
Enabled = false
}
}
},
Exporting = new Exporting()
{
Enabled = false
},
Credits = new Credits()
{
Enabled = false
},
Legend = new Legend()
{
Enabled = false
}
};

return chart;
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... -highcarts
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»