Q&A

  • 프린트 제어 코드
안녕 하세요...

오랜 만에 글을 올리는 군요...



서버에서 작성된 리포트를 클라이언트에서 찍는 컴퓨팅 환경 입니다.

현재 클라이언트는 도스라서...

서버가 프린트 제어코드를 포함한 리포트 형식으로 파일을 생성하면,

클라이언트는 FTP로 파일을 수신한 후,

한라인씩 무조건 프린트에 write하면 출력이 됩니다.



헌데...

클라이언트가 윈도 버젼으로 가면서는

위와 같은 방법이 잘 되지 않는군요.



서버가 많은 클라이언트를 관리 하기 때문에...

일관성을 위해서 서버에서 리포트를 생성하는 솔루션이

가장 무난한데...



클라이언트에서 출력하는 것이 문제점이 되고 있습니다.

여러분의 많은 조언을 기다리겠습니다.







1  COMMENTS
  • Profile
    류종택 2000.04.05 04:44
    Delphi 1.0 때 필요해서 만든 유닛인데..

    소스가 지저분해서.. 올리기는 싫으나..

    도움이 되시길 바랍니다..

    윈도우즈에서도, 아래처럼 도스 방식으로 출력할 수 있습니다..





    From 류..



    ---------



    {$I-}

    Unit Prt;



    Interface



    Type

    CodeStr = String[20];



    Const

    KSSM : Packed Array [1..48] of CodeStr

    = (

    'KSSM', '46',

    '#폼피드', #12,

    '#초기화', #27+'@',

    '#1/180', #27+'J'+#1,

    '#2/180', #27+'J'+#2,

    '#5/180', #27+'J'+#5,

    '#10/180', #27+'J'+#10,

    '#18/180', #27+'J'+#18,

    '#완성형', #27+'@'+#28+'&'+#28+'t0',

    '#조합형', #27+'@'+#28+'&'+#28+'t1',

    '#이탤릭체지정', #27+'4',

    '#이탤릭체취소', #27+'5',

    '#강조체지정', #27+'E',

    '#강조체취소', #27+'F',

    '#일반문자', #27+'q'+#0,

    '#음각문자', #27+'q'+#1,

    '#영상문자', #27+'q'+#2,

    '#음각영상', #27+'q'+#3,

    '#두배확대', #28+'W1',

    '#두배취소', #28+'W0',

    '#가로두배지정', #27+'W'+#1,

    '#가로두배취소', #27+'W'+#0,

    '#세로두배지정', #27+'y'+#1,

    '#세로두배취소', #27+'y'+#0

    );

    KS : Packed Array [1..48] of CodeStr

    = (

    'KS', '46',

    '#폼피드', #12,

    '#초기화', #27+'@',

    '#1/180', #27+'J'+#1,

    '#2/180', #27+'J'+#2,

    '#5/180', #27+'J'+#5,

    '#10/180', #27+'J'+#10,

    '#18/180', #27+'J'+#18,

    '#고딕체', #27+'m'+#1,

    '#명조체', #27+'m'+#0,

    '#이탤릭체지정', #27+'4',

    '#이탤릭체취소', #27+'5',

    '#강조체지정', #27+'E',

    '#강조체취소', #27+'F',

    '#역상지정', #27+'r'+#1,

    '#역상취소', #27+'r'+#0,

    '#음영지정', #27+'z'+#1,

    '#음영취소', #27+'z'+#0,

    '#1.5배지정', #27+'s'+#1,

    '#1.5배취소', #27+'s'+#0,

    '#가로두배지정', #27+'W'+#1,

    '#가로두배취소', #27+'W'+#0,

    '#세로두배지정', #27+'y'+#1,

    '#세로두배취소', #27+'y'+#0

    );



    Var

    PrtFile : TextFile;

    TimeOut, PrtError : Byte;

    PrintPage : Boolean;

    PrintFileName : String;



    Procedure OpenPrinter;

    Procedure PrintStr(Strg:String);

    Procedure PrintLnStr(Strg:String);

    Procedure PrintCode(Code:Array of CodeStr; Strg:String);

    Procedure PrintLnCode(Code:Array of CodeStr; Strg:String);

    Procedure PrintFile(code:Array of CodeStr; FileName:String);

    Procedure CRLF(Lines:Word);

    Procedure FormFeed;

    Procedure ClosePrinter;



    Implementation



    Uses

    Windows, SysUtils, Forms, Dialogs, Printers, Strg, Bit;



    Procedure TranslateHex(Var St:String);

    Var

    Position, TempInt : Integer;

    TempStr, TempStr1, TempStr2 : String;

    Begin

    Position:= Pos('~[', St);

    While Position > 0 do

    Begin

    TempStr1:= Copy(St, Position+2, Length(St));

    TempInt:= Pos(']~', TempStr1);

    If TempInt > 0 then Dec(TempInt);

    SetLength(TempStr1, TempInt);

    If TempStr1 <> '' then

    Begin

    TempStr2:= TempStr1;

    TempStr:= '';

    While TempStr2 <> '' do

    Begin

    TempStr:= TempStr + Char(HexToByte(Copy(TempStr2, 1, 2)));

    Delete(TempStr2, 1, 2);

    End;

    Translate(St, '~['+TempStr1+']~', TempStr);

    End

    Else Delete(St, Position, 2);

    Position:= Pos('~[', St);

    End;

    end;



    Procedure OpenPrinter;

    Begin

    PrtError:= 0;

    AssignFile(PrtFile, PrintFileName);

    ReWrite(PrtFile);

    If IOResult <> 0 then

    Begin

    PrtError:= 1;

    ShowMessage('프린터를 점검하여 주십시오. ');

    End;

    End;



    Procedure PrintStr(Strg:String);

    Begin

    Write(PrtFile, Strg);

    End;



    Procedure PrintLnStr(Strg:String);

    Begin

    WriteLn(PrtFile, Strg);

    End;



    Procedure PrintCode(Code:Array of CodeStr; Strg:String);

    Var

    Loop, ListSize : Integer;

    TempStr : String;

    Begin

    ListSize:= StrToInt(Code[1]);

    TempStr:= Strg;

    For Loop:= 1 to ListSize Div 2 Do

    Begin

    Translate(TempStr, Code[Loop*2], Code[Loop*2+1]);

    If Pos('#폼피드', TempStr) > 0 then PrintPage:= True;

    If Pos(#12, TempStr) > 0 then PrintPage:= True;

    End;

    TranslateHex(TempStr);

    Write(PrtFile, TempStr);

    End;



    Procedure PrintLnCode(Code:Array of CodeStr; Strg:String);

    Var

    Loop, ListSize : Integer;

    TempStr : String;

    Begin

    ListSize:= StrToInt(Code[1]);

    TempStr:= Strg;

    For Loop:= 1 to ListSize Div 2 Do

    Begin

    Translate(TempStr, Code[Loop*2], Code[Loop*2+1]);

    If Pos('#폼피드', TempStr) > 0 then PrintPage:= True;

    If Pos(#12, TempStr) > 0 then PrintPage:= True;

    End;

    TranslateHex(TempStr);

    WriteLn(PrtFile, TempStr);

    End;



    Procedure PrintFile(Code:Array of CodeStr; FileName:String);

    Var

    PFile : TextFile;

    Line : String;

    Begin

    PrtError:= 0;

    AssignFile(PFile, FileName);

    Reset(PFile);

    If IOResult = 0 then

    Begin

    Repeat

    Line[1]:= 'X';

    ReadLn(PFile, Line);

    If Line[1] = '.' then

    Begin

    Delete(Line, 1, 1);

    PrintCode(Code, Line);

    End

    Else PrintLnCode(Code, Line);

    Until EOF(PFile);

    CloseFile(PFile);

    End

    Else

    Begin

    PrtError:= 1;

    ShowMessage('화일을 읽을 수가 없습니다.');

    End;

    End;



    Procedure CRLF(Lines:Word);

    Var

    Loop : Word;

    Begin

    For Loop:= 1 to Lines Do WriteLn(PrtFile);

    End;



    Procedure FormFeed;

    Begin

    Write(PrtFile, #12);

    End;



    Procedure ClosePrinter;

    Begin

    CloseFile(PrtFile);

    End;



    { 기존에 있던 것

    Begin

    PrintFileName:= 'LPT1';

    End.

    }



    // 경문이가 고친 것

    Var

    aDevice, aDriver, aPort: PChar;

    aHandle: THandle;

    Begin

    GetMem(aDevice, 50); // 50은 충분히 큰 값

    GetMem(aDriver, 50);

    GetMem(aPort, 50);

    Printer.GetPrinter(aDevice, aDriver, aPort, aHandle);

    PrintFileName:= StrPas(aPort);

    FreeMem(aDevice);

    FreeMem(aDriver);

    FreeMem(aPort);

    End.







    전기봉 wrote:

    > 안녕 하세요...

    > 오랜 만에 글을 올리는 군요...

    >

    > 서버에서 작성된 리포트를 클라이언트에서 찍는 컴퓨팅 환경 입니다.

    > 현재 클라이언트는 도스라서...

    > 서버가 프린트 제어코드를 포함한 리포트 형식으로 파일을 생성하면,

    > 클라이언트는 FTP로 파일을 수신한 후,

    > 한라인씩 무조건 프린트에 write하면 출력이 됩니다.

    >

    > 헌데...

    > 클라이언트가 윈도 버젼으로 가면서는

    > 위와 같은 방법이 잘 되지 않는군요.

    >

    > 서버가 많은 클라이언트를 관리 하기 때문에...

    > 일관성을 위해서 서버에서 리포트를 생성하는 솔루션이

    > 가장 무난한데...

    >

    > 클라이언트에서 출력하는 것이 문제점이 되고 있습니다.

    > 여러분의 많은 조언을 기다리겠습니다.

    >

    >

    >