Какой лучший способ конвертировать FlowDocument в PDF - PullRequest
6 голосов
/ 07 февраля 2012

Как бы вы порекомендовали мне преобразовать FlowDocument в PDF для присоединения к EMail?

FlowDocument является динамическим, а не статичным.

Я бы предпочел иметь возможностьсохраняйте PDF в памяти как байт [], а не на диске, но это можно обсудить.

Спасибо за помощь!

Ответы [ 6 ]

4 голосов
/ 08 февраля 2012

Я предполагаю, что вы хотите, чтобы это происходило программно, а не как ручной процесс.

Способ 1: Установите драйвер PDF, например Amyuni или PrimoPDF . Распечатайте ваш FlowDocument с желаемым размером PrintTicket / page в драйвере принтера. PDF, который вы получаете от него, должен быть довольно хорошим преобразованием. Некоторые из этих драйверов (например, Amyuni) имеют SDK, которыми вы можете управлять этим процессом программно.

Метод 2: Программная печать в XPS с использованием драйвера XPS без диалогового окна «Сохранить как»; в Windows DDK есть пример, который вы можете создать самостоятельно. Затем используйте конвертер XPS в PDF, например NiXPS или Adobe SDK (так дорого, я не буду публиковать ссылки) или GhostXPS , чтобы конвертировать XPS напрямую в PDF.

Метод 3: Преобразование потокового документа непосредственно в XPS с использованием таких методов, как Этот , а затем с помощью преобразователя XPS в PDF, таких как упомянутые выше.

Отказ от ответственности: я не работаю ни на одну из этих компаний или их конкурентов. Я использовал Adobe SDK, принтер Amyuni и различные хитрости XPS с довольно хорошим успехом. Ни один метод не преобразует с 100% точностью.

3 голосов
/ 01 ноября 2012

Отказ от ответственности: я пишу библиотеку XamlToPDF, однако она бесплатна для любого типа использования.

http://xamltopdf.codeplex.com/

Очень легко создавать PDF, она поддерживает таблицы и изображения в видехорошо.

3 голосов
/ 07 февраля 2012

У меня есть два варианта, о которых я знаю.

Первое - использовать проприетарную библиотеку под названием NiPDF , в качестве альтернативы вы можете использовать Word Interop.

  1. Сохраните FlowDocument в файл DOCX, используя Open XML SDK
  2. Использование Word Interop для загрузки сохраненного документа из какого-то временного хранилища
  3. Установите WdSaveFormat на wdFormatPDF
  4. Сохраните документ еще раз (не забудьте переименовать файл в PDF)

Вы можете найти дополнительную информацию здесь

0 голосов
/ 18 июня 2019

Другой вариант для просмотра - FlowDocumentConverter .Это доступно в пакете NuGet , но для документации ограничение 10 страниц.

0 голосов
/ 07 января 2013

Мне удалось заставить это работать с драйвером принтера PDFCreator. Вам нужно установить драйвер, чтобы это работало, поэтому для некоторых это может оказаться не идеальным решением. Доступен интерфейс COM. Код более или менее выглядит примерно так:

        PDFCreator.clsPDFCreator _PDFCreator;
        PDFCreator.clsPDFCreatorError pErr;


        if (_PDFCreator.cStart(parameters, false))
        {
            _PDFCreator.cClearCache();
            _PDFCreator.set_cOption("UseAutosave", 1);
            _PDFCreator.cPrinterStop = false;
        }

        _PDFCreator.set_cOption("AutosaveFilename", file);
        _PDFCreator.set_cOption("AutosaveDirectory", folder);

    PrintDialog printDialog = new PrintDialog();                          
    printDialog.PrintDocument(((IDocumentPaginatorSource)flowDoc).DocumentPaginator, "Report");
0 голосов
/ 07 февраля 2012

Возможно, вы захотите рассмотреть продукт под названием «Report Writer for .NET» от Seberix (http://www.siberix.com/). Его API аналогичен коду в FlowDocument, который, я думаю, вам нужен, когда вы сказали «динамический, а не статический» (Но я уверен, что есть и различия. Дьяволы в деталях).

После создания объекта Siberix.Report.Report,

Siberix.Report.Report report = CreateMyPdfReport();  //You write this
Stream stream = new MemoryStream();
report.Publish(stream, Siberix.Report.FileFormat.PDF);
byte[] bytes = stream.ToArray();

Теперь байты могут быть сохранены в таблице базы данных или как угодно.

...