Печать с Delphi - PullRequest
       25

Печать с Delphi

1 голос
/ 09 ноября 2011

Я сталкиваюсь с некоторыми трудностями при печати, когда я печатаю свои отчеты на физическом принтере, тексты идеально центрированы, но когда я печатаю тот же самый отчет на PDF-принтере (например, cutePDF) или устройстве записи документов XPS, левое поле становится равным 0. Между темЯ пытаюсь настроить поле, оно отлично работает в PDF и XPS, но при физической печати страницы печатаются с дополнительным левым полем.Я не могу обнаружить эту разницу, также я попытался установить поле только для нефизической печати, но не смог этого сделать.Было бы замечательно, если бы можно было настроить режим отображения в соответствии с выбором принтера, например, если я выберу принтер PDF или XPS Writer, поле будет изменено.Я использую Printer.canvas.textout (), процедуру для печати текста.

Может кто-нибудь, пожалуйста, помогите мне в этом.

Ответы [ 2 ]

3 голосов
/ 10 ноября 2011

Некоторые моменты, которые стоит выделить:

  • В Windows (и в TPrinter.Canvas) Delphi во время рисования существует нет такой концепции, как поля : весь размер бумаги доступен для холста - например, X = 0 будет указывать на самую левую часть листа;
  • Существуют так называемые «аппаратные поля» или «физические поля», в зависимости от возможностей принтера: это непечатная область вокруг бумаги; то есть, если вы нарисуете что-то в этой области, оно не будет закрашено - эти поля зависят от технологии и модели используемого принтера, а в некоторых случаях эти значения «полей» можно получить из драйвера принтера через GetDeviceCaps вызовы API ;
  • Но, исходя из моего эксперимента, не доверяйте тем «физическим полям», которые получены драйвером принтера - лучше (и более эстетично) использовать определенные программным полем поля и позволить вашему пользователю изменять их при необходимости (например, «Макет страницы» в MS Word);
  • PDF-принтеры обычно являются виртуальными принтерами, поэтому у них нет «физического запаса»;
  • При печати документа PDF Acrobat Reader может «подогнать» содержимое страницы к «физическим полям» физического принтера.

Итак, вот несколько возможных решений:

  • В Acrobat Reader, если у вашего PDF нет полей, нажмите «Печать», затем выберите «По размеру области печати» в параметре «Обработка страницы / Масштабирование страницы» - я полагаю, у вас есть «Нет» в качестве настроек здесь, так что результат обрезается принтером;
  • Из вашего приложения Delphi установите некоторые «логические» поля (например, 1 см вокруг вашей бумаги) при рисовании отчета - то есть не начинайте с X = 0 и Y = 0, но с некоторыми смещениями, и позвольте ширина и высота области рисования будет меньше (см., например, как реализован наш Open Source механизм отчетов );
  • В вашем приложении Delphi, если вы используете компонент Report, должны быть некоторые свойства для установки полей.

См. эту статью об обычной печати с использованием Delphi (некоторая информация устарела, но большинство все еще точна), или правильно настройте механизм отчетов.

0 голосов
/ 10 ноября 2011

Если вы используете TextOut (а не DrawText), у вас есть координаты x и y, в которые вы собираетесь поместить строку (и), которую нужно напечатать.Вы можете следить за вычислениями в отладчике (или записывать их в журнал, если приложение работает без отладчика).Возможно, что-то идет не так при определении координат (например, TextExtend не может измерить текст до центрирования, например, разрешение отличается от ожидаемого, вы получите холст для принтера с преобразованием, поэтому координаты не равны 1: 1 с пикселями.

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

Как сказал Кен, мы не сможем узнать больше ничего, если вы не покажете код ... так много возможностей ..

...