Можно ли преобразовать PDF в векторное изображение, которое можно распечатать из .NET? - PullRequest
6 голосов
/ 19 августа 2011

У нас есть приложение .NET, которое печатает как на реальных принтерах, так и на PDF, в настоящее время используя PDFsharp, хотя эту часть можно изменить, если есть лучший вариант.Большая часть вывода - это сгенерированный текст или изображения, но может быть одна или несколько страниц, которые добавляются в конец.Эти страницы предоставляются конечным пользователем в формате PDF.

При печати на бумаге наши пользователи используют предварительно напечатанную бумагу, но в случае экспортированного PDF мы объединяем эти страницы сконец, поскольку они уже в формате PDF.

Мы хотим иметь возможность вставлять эти PDF-файлы непосредственно в поток печати, чтобы им не требовалась предварительно напечатанная бумага.Тем не менее, на самом деле нет хороших опций для рендеринга PDF на страницу GDI (System.Drawing.Graphics).

Есть ли векторный формат, в который PDF может быть преобразован какой-то внешней программой, который мог быотображается на странице GDI + без ухудшения качества путем преобразования в растровое изображение в первую очередь?

Ответы [ 4 ]

2 голосов
/ 19 августа 2011

В статье под названием « Как конвертировать PDF в EMF в .NET » я показал, как это сделать, используя наш продукт PDFOne .NET. ЭМП - это векторная графика, и вы можете отобразить их на холсте принтера.

Более простой альтернативой для вас является наложение PDF, описанное в другой статье под названием « Наложение PDF - объединение страниц PDF в .NET » PDFOne допускает смещения по оси X в оверлеях, что позволяет сшивать страницы по краям. В цитируемой здесь статье я наложил страницы друг на друга, установив смещения на ноль. Вы зададите ширину и высоту страницы.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я работаю на Gnostice.

0 голосов
/ 14 ноября 2012

Я наконец понял, что есть опция, которая отвечает моему общему требованию о встраивании векторного формата в задание на печать, но она не работает с печатью на основе GDI.

Формат файла XPS, созданный драйвером печати Microsoft XPS Writer, можно распечатать из WPF с помощью файла ReachFramework.dll, включенного в .NET. Используя WPF для печати вместо GDI, можно встроить страницу документа XPS в более крупный печатный документ.

Недостатком является то, что печать WPF работает несколько иначе, поэтому весь код поддержки, напрямую использующий содержимое в пространстве имен Sytem.Drawing, необходимо переписать.

Вот основные принципы встраивания документа XPS:

Открыть документ:

XpsDocument xpsDoc = new XpsDocument(filename, System.IO.FileAccess.Read);
var document = xpsDoc.GetFixedDocumentSequence().DocumentPaginator;

// pass the document into a custom DocumentPaginator that will decide
// what order to print the pages:
var mypaginator = new myDocumentPaginator(new DocumentPaginator[] { document });

// pass the paginator into PrintDialog.PrintDocument() to do the actual printing:
new PrintDialog().PrintDocument(mypaginator, "printjobname");

Затем создайте потомка DocumentPaginator, который будет выполнять фактическую печать. Переопределите абстрактные методы, в частности, GetPage должен возвращать DocumentPages в правильном порядке. Вот мое доказательство концепции кода, который демонстрирует, как добавить пользовательский контент в список документов Xps:

public override DocumentPage GetPage(int pageNumber)
{
    for (int i = 0; i < children.Count; i++)
    {
        if (pageNumber >= pageCounts[i])
            pageNumber -= pageCounts[i];
        else
            return FixFixedPage(children[i].GetPage(pageNumber));
    }
    if (pageNumber < PageCount)
    {
        DrawingVisual dv = new DrawingVisual();
        var dc = dv.Drawing.Append();
        dc = dv.RenderOpen();
        DoRender(pageNumber, dc); // some method to render stuff to the DrawingContext
        dc.Close();
        return new DocumentPage(dv);
    }
    return null;
}

При попытке печати в другой документ XPS выдается исключение «FixedPage не может содержать другую FixedPage», а сообщение Х.Алипуряна демонстрирует, как это исправить: http://social.msdn.microsoft.com/Forums/da/wpf/thread/841e804b-9130-4476-8709-0d2854c11582

private DocumentPage FixFixedPage(DocumentPage page)
{
    if (!(page.Visual is FixedPage))
        return page;

    // Create a new ContainerVisual as a new parent for page children
    var cv = new ContainerVisual();
    foreach (var child in ((FixedPage)page.Visual).Children)
    {
        // Make a shallow clone of the child using reflection
        var childClone = (UIElement)child.GetType().GetMethod(
            "MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic
            ).Invoke(child, null);

        // Setting the parent of the cloned child to the created ContainerVisual
        // by using Reflection.
        // WARNING: If we use Add and Remove methods on the FixedPage.Children,
        // for some reason it will throw an exception concerning event handlers
        // after the printing job has finished.
        var parentField = childClone.GetType().GetField(
            "_parent", BindingFlags.Instance | BindingFlags.NonPublic);
        if (parentField != null)
        {
            parentField.SetValue(childClone, null);
            cv.Children.Add(childClone);
        }
    }

    return new DocumentPage(cv, page.Size, page.BleedBox, page.ContentBox);
}

Извините, что это не совсем компиляция кода, я просто хотел дать обзор кусочков кода, необходимых для его работы, чтобы дать другим людям преимущество во всех разрозненных частях, которые должны собраться вместе, чтобы заставить его работать. Попытка создать более обобщенное решение будет намного сложнее, чем охват этого ответа.

0 голосов
/ 22 августа 2011

Хотя не с открытым исходным кодом и не является .NET-нативным (я полагаю, но на основе Delphi, но предлагает предварительно скомпилированную библиотеку .NET), Quick PDF может отображать PDF-файл в файл EMF, который вы можете загрузить в свою графику объект.

0 голосов
/ 19 августа 2011

Ghostscript может выводить PostScript (векторный файл), который можно напрямую отправлять на некоторые типы принтеров. Например, если вы используете принтер с поддержкой LPR, файл PS можно напрямую установить на этот принтер, используя что-то вроде этого проекта: http://www.codeproject.com/KB/printing/lpr.aspx

Есть также некоторые коммерческие опции, которые могут печатать PDF (хотя я не уверен, является ли внутренний механизм векторным или растровым), например http://www.tallcomponents.com/pdfcontrols2-features.aspx или http://www.tallcomponents.com/pdfrasterizer3.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...