gifts2017

Автоматическое масштабирование табличного документа при печати

Опубликовал Андрей Шиба (andy-cj) в раздел Программирование - Практика программирования

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

Добрый день, друзья. В рамках решения одной из рабочих задач оптимимизации печати документов и был создан данный алгоритм. Несомненным преимуществом данного алгоритма является то, что пользователю не нужно мучится с настройками масштаба печатной формы и подгонять ее под разные принтеры. Данный алгоритм обрабатывает две ситуации, первая это когда количество страниц большое и уменьшением масштаба печати можно добиться максимального заполнения страниц (например в конце табличного документа появляется "хвостик", который не влазит на предыдущую страницу и выводится в начале следующей, фактически последний лист выходит пустой), вторая ситуация когда печатная форма занимает 1 лист, но заполнение не полное, в таком варианте алгоритм увеличивает масштаб печати, до значения позволяющего полностью заполнить печатный лист.
      Хочу обратить внимание, на то что при выполнении алгоритма используются драйвера принтера, и если в системе не установлено ни одного принтера выполнение функции вызовет исключение. Также было замечено что обращение к функции "ТабДокумент.КоличествоСтраниц() " занимает продолжительное время, скорее всего из-за использования драйвера принтера для подсчета количества страниц. Просьба учесть вышеперечисленные моменты при использовании данного алгоритма.

      Поцедуру можно поместить в общий модуль обработчиков печатных форм.

 


Процедура КорректировкаМасштабаТабДокумента(ТабДокумент,МинимальныйПроцентМасштаба=60) Экспорт



    Если
типЗнч(ТабДокумент)=Тип("ТабличныйДокумент") Тогда



       
//уменшение масштаба для уменьшения количества страниц

       
ИсходныйМасштаб = 100;

       
ТабДокумент.МасштабПечати = 100;

       
ИсходноеКоличествоСтраниц = ТабДокумент.КоличествоСтраниц();

       
ТабДокумент.МасштабПечати = МинимальныйПроцентМасштаба;

        Если
ТабДокумент.КоличествоСтраниц()

           
КоличествоОптимизированныхСтраниц = ТабДокумент.КоличествоСтраниц();

           
ТекущийПроцентМасштаба = МинимальныйПроцентМасштаба;

            Пока
КоличествоОптимизированныхСтраниц=ТабДокумент.КоличествоСтраниц() Цикл

               
ТекущийПроцентМасштаба = ТекущийПроцентМасштаба+1;

               
ТабДокумент.МасштабПечати = ТекущийПроцентМасштаба;

            КонецЦикла;

           
ТабДокумент.МасштабПечати = ТабДокумент.МасштабПечати-1;

        Иначе
//эффекта нет возвращаем мастаб печати обратно

           
ТабДокумент.МасштабПечати = ИсходныйМасштаб;

           
//увеличение масштаба для максимального заполнения страниц

           
ТекущийПроцентМасштаба = ИсходныйМасштаб;

            Пока
ИсходноеКоличествоСтраниц=ТабДокумент.КоличествоСтраниц() Цикл

               
ТекущийПроцентМасштаба = ТекущийПроцентМасштаба+1;

               
ТабДокумент.МасштабПечати = ТекущийПроцентМасштаба;

            КонецЦикла;

           
ТабДокумент.МасштабПечати = ТабДокумент.МасштабПечати-1;

        КонецЕсли;



    КонецЕсли;



КонецПроцедуры



См. также

Подписаться Добавить вознаграждение

Комментарии

0. Андрей Шиба (andy-cj) 24.02.12 03:11
Я думаю многие программисты сталкивались с проблемой масштабирования разрабатываемых печатных форм документов, то печатная форма вылазит вправо, то сиротливо ютится в углу страницы. В этой статье предоставлен алгоритм решающий эту проблему.

Перейти к публикации

1. Misha ⁠ (Magister) 24.02.12 03:11
Делал похожее, в итоге отказаться пришлось.
1) На некоторых принтерах глючит.
2) Если печатная форма формируется на сервере (актуально для управляемых форм) - можно 5 минут ждать, пока отработает.
3) Опять таки, иногда работает не сильно быстро даже на клиенте - на самых ходовых документах задержка была ощутимая.
2. Олег Семенов (corelius) 16.10.14 16:12
Вредительский код. Во-первых:
1. что за строка "Если ТабДокумент.КоличествоСтраниц()" ??? Где оператор "Тогда"???
2. в этом участке кода "зацикливание": "Пока ИсходноеКоличествоСтраниц=ТабДокумент.КоличествоСтраниц() Цикл". Переменная ИсходноеКоличествоСтраниц не меняется напротяжении всей работы алгоритма.

Бредовый код....
3. Андрей Шиба (andy-cj) 17.10.14 23:11
(2) corelius, Уважаемый Олег, публикация висит здесь с 2012 года. Был предложен алгоритм, вставлено с реальной разработки, это работает не у одного клиента. С того времени сайт пережил глобальные изменения, возможно что-то потерялось в публикации или проблемы форматированием, следить за актуальностью не собираюсь. Неужели вы думаете что за два года не нашлось бы любителей помокать в говно автора? Не работает Ctrl+C - Ctrl+V? Очень жаль, мой друг, не используйте, напишите лучше. Срать умеют все, не все могут культурно общаться, к сожалению.
4. Александр Рощанский (StripyCat) 16.06.15 14:57
В строке
Если ТабДокумент.КоличествоСтраниц()
на самом деле должно быть
Если ТабДокумент.КоличествоСтраниц() < ИсходноеКоличествоСтраниц Тогда

И в самом начале имеет смысл поставить
ТабДокумент.АвтоМасштаб = Ложь;
иначе вся эта конструкция может не работать как нужно.

Ну и параметр МинимальныйПроцентМасштаба на мой взгляд имеет смысл передавать 85-88. Иначе очень мелко получается. А так, оптимальный масштаб где-то в районе 92-93% лежит. И вот эти 1-2% алгоритм выбирает, чтобы не оставалось "висячих" строк.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа