Предгенерировать графический объект для улучшения производительности печати

107
8

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

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;
}

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

спросил(а) 2016-04-13T15:04:00+03:00 4 года, 6 месяцев назад
1
Решение
100

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

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


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

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

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

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


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

ответил(а) 2016-04-13T20:36:00+03:00 4 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема