Как в принтере "поменять" бумагу?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как в принтере "поменять" бумагу?

Сообщение Aleh » 27.08.2018 18:47:14

..проект готов, приступаем к печати. Документы нужно разослать по принтерам.
Самый минимум: большие - на плоттер, маленькие - на ближайший принтер (прога знает на какие, и какие нужны форматы бумаги).

Printer.PrinterIndex:=3; //ставим принтер, скорее всего работает, не проверял, но видел работу в демках
Printer.Orientation:=poLandscape; //проверено - работает
Printer.? PaperSize, PaperName ? -

как установить требуемый размер бумаги?

на крайний случай выбрать и установить из числа предопределённых форматов?

или нужно каждый раз выполнять дополнительно рутинную установку штатными диалогами?

распечатка простого примера: 1-Титульный А3ландшафт, 2-записка А4портрет, 3-отчет измерений А4л, 4-каталог А4п, 5-схема А4-А2пл, 6-план А4-А0лп, 7-акт А4п
7раз менять - 1 раз обязательно вручную, и это если схема и план А4.
Особенно глупо это выглядит при печати в pdf.

Есть мысль дважды установить на клиентском компе принтер с разными дефолтными настройками бумаги например EPSON WF-7515 А4 и EPSON WF-7515 А3....
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Как в принтере "поменять" бумагу?

Сообщение Aleh » 19.09.2018 12:59:46

1 часть ответа - Установка предопределённых форматов бумаги Printer.PapSize.PaperName:=PaperName; - работает, проверено!
фрагмент исходников для "ленивых"..
Код: Выделить всё
function PaperSet(Prn1: TPrinter; PaperInd: integer): string;
//устанавливает бумагу в принтер и возвращает её название
var MyPaperSize, p2:TMapPt;// TMapPt = record :  x, y, z:double;
    i, j:integer;
    PapSize: TPaperSize;
    PrintCanv:TPrinterCanvas;
    bol:boolean;
    s:string;
begin
result:='';
i:=abs(PaperInd)-1;
if i<0 then exit;
if Prn1=nil then Prn1:=Printer;
//PaperElems - массив записей с размерами и названиями нужных программе форматов а4, а3, ...
MyPaperSize:=PaperElems[i].Size1; //размер нужного программе формата в метрах
PapSize:=Printer.PaperSize;
bol:=false;
if Printer.Orientation=poLandscape then
  begin
   Printer.Orientation:=poPortrait;//штатная ориентация
   bol:=true;
  end;

for j:=0 to PapSize.SupportedPapers.Count-1 do // список форматов бумаги текущего принтера
  begin
   s:=PapSize.SupportedPapers.Strings[j];
   PapSize.PaperName:=s;//!!!!!устанавливаем формат!!!!!
   PrintCanv:=TPrinterCanvas(Printer.Canvas);//берём пощупать размеры
   //в Printer.PageWidth и Printer.PageHeight размер в пикселях без полей
   P2.x:=(Printer.PageWidth+PrintCanv.LeftMargin+PrintCanv.RightMargin)/Printer.XDPI*0.0254;//дюймы*0.0254=метры
   P2.y:=(Printer.PageHeight+PrintCanv.TopMargin+PrintCanv.BottomMargin)/Printer.XDPI*0.0254;
   if LineLength(MyPaperSize, p2)<MapEpsilon*0.1 then//длина линии (разность размеров форматов) < 1mm
    begin//наш формат с заданной точностью
     result:=s;
     if bol then
       Printer.Orientation:=poLandscape;
     exit;
    end;
  end;
end;


Добавлено спустя 3 минуты 8 секунд:
2 часть ответа - Установка любого размера бумаги (особенно бывает нужен для плоттеров с рулонной подачей)
https://ru.stackoverflow.com/questions/880293/%D0%9A%D0%B0%D0%BA-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE-%D0%B2-%D0%BF%D1%80%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B5-%D0%BF%D0%BE%D0%BC%D0%B5%D0%BD%D1%8F%D1%82%D1%8C-%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80-%D0%B1%D1%83%D0%BC%D0%B0%D0%B3%D0%B8
сам пока не проверил, не горит. Проверю-напишу
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 27

Рейтинг@Mail.ru