Печать холста приложения WPF в файл или поток без ввода пользователя - PullRequest
0 голосов
/ 16 марта 2020

Я ищу способ создать PDF-документ, который содержит холст, созданный в приложении, и передать его в PDF Viewer. Я знаю, что могу печатать Canvas с помощью метода PringDialog PrintVisual - и это прекрасно работает, за исключением того, что я хочу создать файл и с помощью PrintDialog я не могу избавиться от диалогового окна, которое запрашивает имя файла.

Пока я пытался PrintDialog, и если есть способ создать только файл без запроса пользователя на ввод - это было бы здорово, потому что PDF, напечатанный PrintDialog, также имеет выбираемый текст.
Я также узнал некоторые предложения о классе PrintDocument, но насколько я знаю, качество не так велико, но я только что проверил это, и если кто-то знает, что это может быть достигнуто с PrintDocument, пожалуйста, сообщите. https://docs.microsoft.com/en-us/dotnet/api/system.drawing.printing.printdocument?redirectedfrom=MSDN&view=netframework-4.8

Кто-то знает об имени / библиотеке / статье / что-то, что поможет мне достичь чего-то, что может дать мне:

  • возможность создать PDF во время выполнения или abiliti, чтобы сохранить его в файл
  • хорошего качества

Спасибо!

ОБНОВЛЕНИЕ: Я думаю, что я попробую распечатать в XPS и PDF. Если это сработает, я напишу это здесь.

1 Ответ

0 голосов
/ 19 марта 2020

ОК, так что я обнаружил, что это было наиболее удобно. Я использую код по этой ссылке https://social.msdn.microsoft.com/Forums/vstudio/en-US/536919f0-f9c5-4431-939d-5e76657c9a5d/save-canvas-element-to-xamlxps-file?forum=wpf И теперь я конвертирую его в pdf, используя библиотеку syncfusion (которую получила моя компания) https://www.syncfusion.com/kb/9077/how-to-convert-xps-to-pdf-in-c-vb-net, но я думаю, что это тоже можно сделать с помощью pdfSharp.

PDF можно просматривать в программе просмотра, оно хорошего качества, а при наличии текста его можно выбрать.

    private async Task PrintingStreamToViewer(Canvas canvas, string pageName)//, PrintDialog prnt)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            string basename = Path.GetFileName($"temp{DateTime.Now.Second}.xps");
            string directory = Path.GetDirectoryName(Path.GetTempPath());

            var uri = new Uri($"{directory}\\{basename}", UriKind.Absolute);

            Export(uri, canvas);
            XPSToPdfConverter converter = new XPSToPdfConverter();
            //Convert the XPS to PDF
            PdfDocument document = converter.Convert(uri.AbsolutePath);

            var pdfPath = new Uri($"{directory}\\{pageName}{DateTime.Now.Ticks}.pdf", UriKind.Absolute);
            //Save the document
            document.Save(pdfPath.AbsolutePath);
            //Close the document
            document.Close(true);

            var pdfViewModel = PresentationInstances.Container.Resolve<PdfViewerControlViewModel>();
            try
            {
                pdfViewModel.SetPdfFile(pdfPath, (int)canvas.Width, (int)canvas.Height);
            }
            catch (Exception e)
            {
                PresHelper.WriteToDebug(e);
            }
            await _starMainPage.DialogService.ShowContentDialogAsync<IPdfViewerControl>(pdfViewModel);
        }
    }

Метод экспорта по приведенной выше ссылке:

    public void Export(Uri path, FrameworkElement surface)
    {
        if (path == null) return;

        // Save current canvas transorm
        Transform transform = surface.LayoutTransform;
        // Temporarily reset the layout transform before saving
        surface.LayoutTransform = null;
        // Get the size of the canvas
        Size size = new Size(surface.Width, surface.Height);
        // Measure and arrange elements
        surface.Measure(size);
        surface.Arrange(new Rect(size));
        // Open new package
        Package package = Package.Open(path.LocalPath, FileMode.Create);
        // Create new xps document based on the package opened
        XpsDocument doc = new XpsDocument(package);
        // Create an instance of XpsDocumentWriter for the document
        XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);
        // Write the canvas (as Visual) to the document
        writer.Write(surface);
        // Close document
        doc.Close();
        // Close package
        package.Close();
        // Restore previously saved layout
        surface.LayoutTransform = transform;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...