UWP Создание PDF - лучший подход

Я работаю над приложением UWP и в качестве одного из требований мне нужно динамически генерировать PDF-файл.

Есть несколько ограничений / требований, которые мне нужно учитывать:

  • Нужна возможность генерировать PDF из приложения UWP напрямую / в автономном режиме
  • Потенциально нужна возможность генерировать отчет на сервере - в идеале из того же исходного шаблона
  • Отчет должен быть несколько динамическим (то есть не компилироваться в само приложение и редактироваться в формате без перекомпиляции приложения)
  • В идеале - не зависеть от библиотеки / компонента с закрытым исходным кодом

У меня было несколько идей о том, как подойти к этому:

  1. Создайте страницу XAML и преобразуйте ее в PDF, распечатав это представление XAML в виде PDF через скрытый диалог печати - ограниченный тем фактом, что XAML нужно будет скомпилировать в приложение +, вероятно, было бы неуместно использовать тот же подход для создания отчетов о на стороне сервера.
  2. Сделайте что-то подобное с 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, но вы все еще можете ссылаться.

Другие вопросы по тегам