2016-04-13 3 views
0

У меня есть приложение, которое печатает счета-фактуры. Я хотел бы иметь возможность предварительно сгенерировать счета в фоновом задании/процессе, чтобы я мог сократить время простоя, необходимое для отправки документа на принтер при появлении запроса пользователем или другими событиями автоматизации. Я ищу что-то вроде этого ...Предпроектировать графический объект для улучшения производительности печати

Graphics _g; 

// background task would call this method 
void GenerateInvoice(Invoice i) 
{ 
    _g = ???? // ???? 
    _g.DrawImage... 
    _g.DrawString.... 
} 

// user action, or automation event, would call this method... 
void PrintInvoice() 
{ 
    if (_g == null) 
    throw new DocumentNotPreparedException(); 

    PrintDocument pd = new PrintDocument(); 
    pd.PrinterSettings.PrinterName = "My Fast Printer"; 
    pd.PrintPage += PrintHandler; 
    pd.Print(); 
} 

void PrintHandler(object o, PrintPageEventArgs e) 
{ 
    // ???? 
    e.Graphics = _g; 
} 

Любые предложения о том, что должно быть сделано в и вокруг «???» разделы?

+1

Объект 'Graphics' на самом деле ничего не содержит. Если вы не против потери векторизованных данных (что может повлиять на производительность и качество), просто визуализируйте растровое изображение, а затем отрисуйте это растровое изображение в свой 'PrintHandler'. Для лучшего качества убедитесь, что растровое изображение имеет тот же DPI, что и принтер. – Luaan

+0

@ Luaan, вы имеете в виду сделать что-то вроде этого https://msdn.microsoft.com/en-us/library/ms404307(v=vs.110).aspx? – Tony

+0

Да. Это простой, но не готовый к производству пример, но он показывает основную идею. Затем вы можете использовать 'e.Graphics.DrawImage' для рисования всего растрового изображения сразу в вашем обработчике печати. – Luaan

ответ

0

Я хотел бы, чтобы иметь возможность заранее создать счета-фактуру в фоновой задаче/процессе, так что я могу уменьшить время простоя, необходимый для отправки документа на принтер

Первого шага должен сделать что вы знаете, что является источником «простоя». Было бы необычным, чтобы узкое место существовало в коде рендеринга вашей собственной программы. Чаще всего основным источником прерывания работы принтера является либо сам драйвер печати (например, драйвер с большим количеством кода и данных, которые необходимо загрузить для обработки задания), либо работа с принтером, для которого требуется растрирование на стороне клиента изображений (что требует большого количества памяти для поддержки требуемых растровых изображений с высоким разрешением, что, в свою очередь, может замедляться на некоторых машинах и, конечно же, значительно увеличивает время, затрачиваемое на отправку этих растрированных изображений на принтер, независимо от того, re использование).


Если и когда вы определили, что ваш собственный код, который медленно, и после того, как вы также определили, что ваш собственный код принципиально столь же эффективный, как вы можете это сделать, того вы могли бы рассмотреть предварительный рендеринг как способ улучшить работу пользователя. У вас есть два основных варианта: рендеринг в растровое изображение и рендеринг в metafile.

Лично я рекомендовал бы последнее. Метафайл сохранит ваши исходные команды рендеринга, обеспечивая независимое от разрешения и эффективное для памяти представление ваших данных печати. Это было бы особенно полезно, если ваш вывод состоит в основном из линейных чертежей и вывода текста.

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

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


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

+1

Я изучил этот вопрос дальше. Рендеринг занимает некоторое время, но я вижу способы, с помощью которых я могу предварительно сгенерировать некоторые элементы (штрих-коды и т. Д.). Я обнаружил, что реальным узким местом было создание нового PrintDocument для каждого счета-фактуры. Как только я начал повторно использовать экземпляр PrintDocument, предыдущая 2-3-секундная задержка снизилась до почти нуля (как определено с помощью StopWatch). – Tony

Смежные вопросы