UWP Создание PDF - лучший подход
Я работаю над приложением UWP и в качестве одного из требований мне нужно динамически генерировать PDF-файл.
Есть несколько ограничений / требований, которые мне нужно учитывать:
- Нужна возможность генерировать PDF из приложения UWP напрямую / в автономном режиме
- Потенциально нужна возможность генерировать отчет на сервере - в идеале из того же исходного шаблона
- Отчет должен быть несколько динамическим (то есть не компилироваться в само приложение и редактироваться в формате без перекомпиляции приложения)
- В идеале - не зависеть от библиотеки / компонента с закрытым исходным кодом
У меня было несколько идей о том, как подойти к этому:
- Создайте страницу XAML и преобразуйте ее в PDF, распечатав это представление XAML в виде PDF через скрытый диалог печати - ограниченный тем фактом, что XAML нужно будет скомпилировать в приложение +, вероятно, было бы неуместно использовать тот же подход для создания отчетов о на стороне сервера.
- Сделайте что-то подобное с WebView и HTML - но для этого потребуется выполнение логики JavaScript - и я не уверен, возможно ли это в приложении UWP.
Кто-нибудь достиг в прошлом чего-то подобного, и если да, то какой подход вы выбрали?
1 ответ
В настоящее время существует множество платных пакетов сторонних производителей для создания PDF в UWP, таких как Syncfusion и XFinium. Для бесплатных библиотек, таких как PDFSharp, которые недоступны в UWP. Поскольку вам не нужен платный, вы можете создать классическое приложение с бесплатными библиотеками, а затем создать AppService для его обработки. Для более подробной информации, пожалуйста, обратитесь к AppServiceBridgeSample.
Создайте страницу XAML и преобразуйте ее в формат PDF
Создать PDF с помощью функции печати может работать хорошо. Но для ваших требований "через скрытый диалог печати" невозможно, пользовательский интерфейс печати не может быть скрыт для печати.
Сделайте что-то похожее с WebView и HTML
Открытая библиотека jsPDF может помочь вам генерировать HTML в PDF с помощью JavaScript. И вы можете получить результат в формате PDF по InvokeScriptAsync
от WebView
, Например:
JavaScript
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.4/jspdf.debug.js"></script>
<script type='text/javascript'>
function print() {
var doc = new jsPDF()
doc.text('Hello world!', 10, 10);
doc.circle(50, 50, 50);
var pdfresult = doc.output();
document.getElementById('myDiv').innerText = pdfresult;
//doc.save('a4.pdf');
return pdfresult;
}
</script>
</head>
<body>
<div id='myDiv'>Hello</div>
</body>
</html>
WebView
Webview.Navigate(new Uri("ms-appx-web:///Assets/test.html"));
string pdfresult = await Webview.InvokeScriptAsync("eval", new string[] { "print()" });
StorageFile pdf = await ApplicationData.Current.LocalFolder.CreateFileAsync("test.pdf");
await FileIO.WriteTextAsync(pdf, pdfresult);
В конце концов, вы можете сами написать формат PDF. Вот документ для Windows Phone, но вы все еще можете ссылаться.