#javascript #c# #vue.js #dinktopdf #razorlight
#javascript #c# #vue.js #dinktopdf #razorlight
Вопрос:
Я работаю над созданием POC, в котором я компилирую index.cshtml с помощью razorlight, а затем создаю PDF-файл с помощью dinktopdf, пока у меня эта часть работает нормально.
Затем, используя vuejs и vue-qrcode, я смог добавить qr-код на страницу, где тег qr-кода преобразуется в canvas и отображается qr-код.
Теперь проблема, с которой я столкнулся, заключается в том, что во время создания PDF-файла vue-qrcode не компилируется в обычный html (это должен быть тег canvas), и в PDF-файл ничего не добавляется.
Решение находится в следующем репозитории
page = await engine.CompileRenderAsync(path, model);
показывает полную строку HTML-кода, и там вы можете увидеть, что тег qr-кода по-прежнему остается таким, какой он есть.
public async Task<byte[]> PrintPDFAsync()
{
var engine = new RazorLightEngineBuilder()
.UseFileSystemProject(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location))
.UseMemoryCachingProvider()
.Build();
var model = new List<WeatherForecast>(Get());
string page = null;
try
{
var path = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"Views/Home/Index.cshtml");
page = await engine.CompileRenderAsync(path, model);
}
catch (Exception e)
{
Console.WriteLine(e);
}
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Landscape,
PaperSize = PaperKind.A4Plus
},
Objects = {
new ObjectSettings() {
PagesCount = true,
HtmlContent = page,
WebSettings = { DefaultEncoding = "utf-8" },
HeaderSettings = { FontSize = 9, Right = "Page [page] of [toPage]", Line = true, Spacing = 2.812 }
}
}
};
byte[] pdf = null;
try
{
pdf = _pdfConverter.Convert(doc);
}
catch (Exception e)
{
Console.WriteLine(e);
}
return pdf;
}
Комментарии:
1. Прошу прощения. Обновлено.
2. Я не знаком с dinktopdf, но поддерживает ли он выполнение Javascript на странице? И ваша страница — это больше, чем просто QR-код, верно?
3. @John Да, Dinktopdf поддерживает javascript. Но я столкнулся с проблемой, из-за которой он не распознает библиотеку vue-qrcodoe. Да, он содержит изображения и таблицу, которые заполнены моделью.
Ответ №1:
Я смог решить проблему, используя чистый JavaScript QRCode вместо библиотеки vue-qrcode.
Окончательный вид
@model IEnumerable<POCWeb.Models.WeatherForecast>
@{
var BaseUrl = @Model.FirstOrDefault().BaseUrl;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="@BaseUrl/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="@BaseUrl/lib/vue/css/bootstrap-vue.min.css" />
</head>
<body>
<div id="app">
<header>
<div class="container">
<img src="@BaseUrl/img/logo.png" class="img-thumbnail">
</div>
</header>
<div class="container">
<main role="main" class="pb-3">
<table class="table">
<thead>
<tr>
<td>
Date
</td>
<td>
TemperatureC
</td>
<td>
Summary
</td>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@item.Date
</td>
<td>
@item.TemperatureC
</td>
<td>
@item.Summary
</td>
</tr>
}
</tbody>
</table>
</main>
</div>
<div class="container">
<div id="qrcode"></div>
</div>
<footer class="border-top footer text-muted">
<div class="container">
amp;copy; 2020 - POCWeb - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<p id="log"></p>
</div>
<script src="@BaseUrl/js/qrcode.js"></script>
<script>
try {
new QRCode(document.getElementById("qrcode"), "http://jindo.dev.naver.com/collie");
var c = document.getElementById("log");
c.innerHTML = "printed";
}
catch (err) {
var c = document.getElementById("log");
c.innerHTML = "catch: " err.messge;
}
</script>
</body>
</html>