Сохранение WPF FlowDocument в файл PDF напрямую с помощью PrintDocument из Windows Forms - PullRequest
0 голосов
/ 11 февраля 2019

Я использую Microsoft Visual Studio 2017 и Microsoft Print to PDF в Windows 10.

Я пытаюсь создать PDF-файл FlowDocument без PrintDialog и знаю, что это невозможно в чистом WPF.Поэтому я упомянул system.drawing.printing.PrintDocument Windows Forms в своем проекте WPF.

Я застрял в точке преобразования FlowDocument в PrintDocument.

PrintDocument _PrintDocument = (PrintDocument)FlowDocument1;

IDocumentPaginatorSource _DocumentPaginatorSource = FlowDocument1;
PrintDocument _PrintDocument = FlowDocument1;

Ни один из них не работает.

Возможно ли создание PDF-файла в боковом направлении, назначив код и имя папки и файла?Обязательно ли использовать сторонний компонент?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Кажется, что нет прямого способа сохранения PDF-файла без какого-либо диалогового окна в текущих версиях Windows и WPF.Но я получил ответ через PdfSharp.Xps.Это довольно просто, и качество документов хорошо сохраняется.

Вы можете легко использовать его с помощью диспетчера пакетов Nuget Visual Studio.

0 голосов
/ 11 февраля 2019

Если вы можете установить принтер по умолчанию в формате PDF или XPS, вы можете использовать этот фрагмент кода.Он будет использовать принтер по умолчанию, а затем распечатывать изображение, которое вы хотите.Имейте в виду, что если вам нужна ориентация, отличная от альбомной, вы должны изменить ее.
РЕДАКТИРОВАТЬ:
Для полноты вы можете выполнить поиск очереди печати для печати PDF, например:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Printing;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Xps;
using System.Windows.Xps.Packaging;

namespace Services.Printing
{
    public static class PrintingService
    {
        public static void Print(Visual elementToPrint, string description)
        {
            using (var printServer = new LocalPrintServer())
            {
                var dialog = new PrintDialog();
                //Find the PDF printer
                var qs = printServer.GetPrintQueues();
                var queue = qs.FirstOrDefault(q => q.Name.Contains("PDF"));
                if(queue == null) {/*handle what you want to do here (possibly use XPS?)*/}
                dialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
                dialog.PrintQueue = queue;
                dialog.PrintVisual(elementToPrint, description);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...