2009-05-29 2 views
3

Моя программа должна выводить (довольно сложную) форму на принтер, включая несколько изображений. В настоящее время я делаю это, используя Delphi (2006) Printer.Canvas, после выбора PDF-принтера (PDF995). Это работает как удовольствие.Как распечатать частично прозрачное изображение в PDF-холсте с помощью Delphi?

Однако у меня теперь возникает проблема: есть одно частично прозрачное изображение, которое должно быть помещено поверх других элементов (границы, фон и т. Д.), Причем части этого текста все еще видны через части изображения ,

Выполнение этого на обычном экране Canvas работает нормально с обычным TBitmap s, используя TransparentColor. Однако, когда я пытаюсь сделать это на принтере, это не всегда работает; и когда я пытаюсь это сделать на принтере PDF, он никогда не работает: фон становится черным или (лучший результат до сих пор), становится белым, но все же перезаписывает что-нибудь под ним.

Я попытался достичь такого же результата, вставив PNG-изображение с альфа-прозрачностью (прозрачность a.k.a.) в документе Word, а затем отправив его в указанный принтер PDF. Полупрозрачность исчезает, но прозрачность пикселей сохраняется. Так что, по крайней мере, должно быть как-то возможно.

Кто-нибудь знает как?

ответ

2

Вы упомянули, что используете свойство TransparentColor, так правильно сказать, что вам не нужна альфа-прозрачность и вы можете избежать использования бинарной прозрачности (прозрачность для каждого пикселя выключена или включена)?

Если это так, возможно, будет возможно создать регион из вашего растрового изображения.

Затем вы используете эту область в качестве области отсечения и рисуете растровое изображение.

Принтер PDF может обрабатывать область отсечения правильно.

Вот пример генерации области из растрового изображения, он используется, чтобы сделать непрямоугольной формы, но идея та же: http://www.delphi-central.com/BitmapShapedForm.aspx

Вот еще один пример установки вырезанной для TCanvas: http://www.efg2.com/Lab/OtherProjects/PrinterDemo2.htm

+0

Интересная идея, будет приятно услышать, если это сработает. «Стек» для многих «PDF-принтеров» выглядит примерно так: App -> GDI -> Диспетчер очереди печати -> Драйвер PS -> Redirector (например, Redmon) -> Конвертер PS в PDF (обычно Ghostscript). К критическому фрагменту, по-видимому, относится правильный перевод вызовов GDI в PostScript. Ваше предложение, безусловно, может изменить результат в этом отношении. –

+0

Спасибо за подсказку, я постараюсь заставить это работать. – Martijn

+0

Он работает! Конечный результат - это процедура 'StretchDrawClipTransparency (Destination: TCanvas; DestRect: TRect; Bitmap: TBitmap; TransparencyColor: TColor = clNone);' , который, похоже, работает на экране, бумажном принтере, PDF-принтере и компоненте PDF-генератора - короче , все с холстом. Отсутствие полупрозрачности (иначе альфа-прозрачность), но для меня это достаточно хорошо. – Martijn

0

Я не думаю, что вы можете добиться частичной прозрачности с помощью принтера PDF. Что вы можете сделать, так это получить пакет VisPDF. С его помощью вы можете добавить маску к изображениям, содержащимся в pdf, которые вы фактически производите в своем приложении. Если это не вариант, вы можете комбинировать весь свой фоновый материал с одним изображением. Рисование на этом изображении алфавитной информации.

+0

Квотирующий исходный вопрос: «Я попытался достичь такого же результата, вставив PNG-изображение с альфа-прозрачностью (иначе называемой полупрозрачностью) в документе Word, а затем отправив это на указанный принтер PDF. Полупрозрачность исчезает, но пиксель прозрачность сохраняется, так что, по крайней мере, должно быть как можно возможно ». Хотя я посмотрю на пакет VisPDF. – Martijn

0

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

+0

Да, я тоже об этом думал. Недостатком является то, что он генерирует * огромные * PDF-файлы ... – Martijn

0

Возможно, вы захотите рассмотреть возможность использования стороннего компонента PDF в своем приложении для визуализации холста непосредственно в формате PDF. Я использую этот метод для специализированной отчетности (RTF, Radioemtric JPEG, Tables, Text и т. Д.) В коммерческом продукте, разработанном для инфракрасной термографии. Я очень доволен производительностью и качеством. Компонент, который я использую llPDFLib, был только что обновлен, и теперь я уверен, что он поддерживает полную прозрачность изображения.

Удачи. Печать изображений с альфа-каналом может быть сложной порой в моем опыте.

+0

Спасибо за ссылку на компонент, я проверю его. – Martijn