--- dao/DelphiScanner/LabelPrint.pas 2015/12/04 14:07:48 2790 +++ dao/DelphiScanner/LabelPrint.pas 2016/10/19 08:39:31 3125 @@ -4,7 +4,7 @@ uses ParentForm, - PakkeshopLabels, + LabelData, Configuration, StBarc; @@ -16,20 +16,40 @@ procedure CheckPrintQue(tjektype : string; PrinterNavn : String); - procedure SendTilPrinter(kontrolKoreliste, RuteNummer, Kommentar, BoghandlerNavn, Koreliste, SmsKode, DBKbane, Leveringssted : String; var PrintNyLabel : Boolean; BoghandlerNummer : string = ''); + procedure PrintLabel( Stregkode : String); + + + procedure PrintTestLabel( Linie1, Linie2, Linie3 : String); + + // PrintLabelData bliver brugt til PrinterTest + // og blicer derfor nødt til at være Public - procedure PrintPakkeshopLabel( PakkeshopLabel : TPakkeshopLabel); - procedure PrintDaodirekteLabel( RuteNummer, Kommentar, BoghandlerNavn : String) ; function GetPrinterCount() : Integer; + + private parentForm : IParentForm; Barcode : TStBarcode; var Config: TConfiguration; + procedure PrintZPL( ZplData : string); + + procedure PrintLabelData( LabelData : TLabelData); + procedure PrintSimpelLabel( LabelData : TLabelData) ; + + procedure PrintFuldPakkeLabel( PakkeshopLabel : TLabelData); + procedure PrintFuldPakkeLabelLille( PakkeshopLabel : TLabelData); + procedure PrintFuldPakkeLabelStor( PakkeshopLabel : TLabelData); + + procedure SendTilPrinter_old(kontrolKoreliste, RuteNummer, Kommentar, BoghandlerNavn, Koreliste, SmsKode, DBKbane, Leveringssted : String; var PrintNyLabel : Boolean; BoghandlerNummer : string = ''); + procedure PrintDaodirekteLabel_old( RuteNummer, Kommentar, BoghandlerNavn : String) ; + + + function SavePChar(p: PChar): PChar; function GetCurrentPrinterHandle(): THandle; @@ -44,8 +64,11 @@ WinSpool, Windows, SysUtils, //Format - Math, // DegToRad() bruges i PrintPakkeshopLabel - Forms + Math, // DegToRad() bruges i PrinTLabelData + Forms, + IdHTTP, + Graphics, + XMLDoc ; @@ -102,11 +125,12 @@ end; -procedure TLabelPrint.PrintDaodirekteLabel( RuteNummer, Kommentar, BoghandlerNavn : String) ; +procedure TLabelPrint.PrintDaodirekteLabel_old( RuteNummer, Kommentar, BoghandlerNavn : String) ; begin with Printer do begin BeginDoc; + Canvas.Font.Size := Config.FontSizeRute; if (Length(RuteNummer) > 7) then begin @@ -128,6 +152,11 @@ Canvas.TextOut(Config.XPosBoghandler, Config.YPosBoghandler, BoghandlerNavn); EndDoc; end; + + + + Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725 + end; @@ -147,12 +176,13 @@ // 'Test' skal vise alarmlinie, samt opdatere listbox1 // 'Timer' skal kun vise alarmlinie - if (PrinterNavn = 'Ingen') and ( (tjektype = 'Opstart') or (tjektype = 'Test') ) then - begin - - parentForm.LogMessage( 'Der er fravalgt printer i dette program' ); - end - else if (Printer.Printers.Count = 0) and ( (tjektype = 'Opstart') or (tjektype = 'Test') ) then +// if (PrinterNavn = 'Ingen') and ( (tjektype = 'Opstart') or (tjektype = 'Test') ) then +// begin +// +// parentForm.LogMessage( 'Der er fravalgt printer i dette program' ); +// end +// else + if (Printer.Printers.Count = 0) and ( (tjektype = 'Opstart') or (tjektype = 'Test') ) then begin parentForm.LogMessage( 'Der er ikke installeret en printer på denne PC' ); end @@ -219,10 +249,82 @@ ClosePrinter(hPrinter); end; end; + + + Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725 + end; -procedure TLabelPrint.SendTilPrinter(kontrolKoreliste, RuteNummer, Kommentar, BoghandlerNavn, Koreliste, SmsKode, DBKbane, Leveringssted : String; var PrintNyLabel : Boolean; BoghandlerNummer : string = ''); +procedure TLabelPrint.PrintLabel( Stregkode : String); +var + url: String; + response: String; + + httpClient: TIdHTTP; + + XMLDocument1: TXMLDocument; + + LabelData: TLabelData; + + +begin + + url := Format(Config.URLPrintLabel, [Stregkode] ); + + httpClient := TIdHTTP.Create(); + httpClient.ReadTimeout := 1000;//max 1 secound + httpClient.ConnectTimeout := 1000; + + response := httpClient.Get(url); + httpClient.Free(); + + + XMLDocument1 := parentForm.GetXMLDocument(); + + XMLDocument1.LoadFromXML(response); + + LabelData := TLabelData.Create(XMLDocument1); + PrintLabelData(LabelData); + LabelData.Free(); + + +end; + +procedure TLabelPrint.PrintTestLabel( Linie1, Linie2, Linie3 : String); +var + LabelData : TLabelData; +begin + LabelData := TLabelData.Create(nil); + LabelData.LabelType := 'simpel'; + LabelData.SimpelLinie1 := Linie1; + LabelData.SimpelLinie2 := Linie2; + LabelData.SimpelLinie3 := Linie3; + + PrintLabelData(Labeldata); + + LabelData.Free(); +end; + +procedure TLabelPrint.PrintLabelData( LabelData : TLabelData); +begin + if LabelData.LabelType = 'zpl' then + begin + PrintZPL(LabelData.ZPL); + end + else if (LabelData.LabelType = 'simpel') then + begin + PrintSimpelLabel(LabelData); + end + else + begin + PrintFuldPakkeLabel(LabelData); + end; +end; + + + +procedure TLabelPrint.SendTilPrinter_old(kontrolKoreliste, RuteNummer, Kommentar, BoghandlerNavn, Koreliste, SmsKode, DBKbane, Leveringssted : String; var PrintNyLabel : Boolean; BoghandlerNummer : string = ''); begin with Printer do begin @@ -262,12 +364,30 @@ EndDoc; end; + + + Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725 + end; +procedure TLabelPrint.PrintFuldPakkeLabel( PakkeshopLabel : TLabelData); +begin + if (Config.LabelStor = 1) then + begin + PrintFuldPakkeLabelStor( PakkeshopLabel ); + + end + else + begin + PrintFuldPakkeLabelLille( PakkeshopLabel ); + + end; -// ToDo: PrintPakkeshopLabel() -procedure TLabelPrint.PrintPakkeshopLabel( PakkeshopLabel : TPakkeshopLabel); +end; + +// Bruges til label der passer til 60x100 +procedure TLabelPrint.PrintFuldPakkeLabelLille( PakkeshopLabel : TLabelData); var XForm, XFormOld: TXForm; //Bruges til rotate X-formation Angle: integer; @@ -280,29 +400,30 @@ BeginDoc(); - Canvas.Font.Size := 16; + Canvas.Font.Size := 15; Canvas.TextOut(15,10, 'Code: ' + PakkeshopLabel.Tjekkode + ' ' + PakkeshopLabel.Overskrift); Canvas.TextOut(25, 90, PakkeshopLabel.Navn ); - Canvas.TextOut(25, 135, PakkeshopLabel.Vejnavn ); - Canvas.TextOut(25, 180, PakkeshopLabel.Postnr ); + Canvas.TextOut(25, 140, PakkeshopLabel.Vejnavn ); + Canvas.TextOut(25, 190, PakkeshopLabel.Postnr ); Canvas.Font.Size := 9; // Skriv ikke 'Pakkeshop' overskrift hvis det er en shop2direkte - if ( (PakkeshopLabel.Shop2Direkte = '') OR (PakkeshopLabel.Shop2Direkte = '0') ) then + if ( PakkeshopLabel.PakkeshopNavn <> '' ) then begin Canvas.TextOut(110, 240, 'Pakkeshop:'); + Canvas.TextOut(110, 270, PakkeshopLabel.PakkeshopNavn); + Canvas.TextOut(110, 300, PakkeshopLabel.PakkeshopAddr); + Canvas.TextOut(110, 330, PakkeshopLabel.PakkeshopPostnr); + end; - Canvas.TextOut(110, 270, PakkeshopLabel.PakkeshopNavn); - Canvas.TextOut(110, 300, PakkeshopLabel.PakkeshopAddr); - Canvas.TextOut(110, 330, PakkeshopLabel.PakkeshopPostnr); Canvas.TextOut(350, 240, 'Afsender:'); Canvas.TextOut(350, 270, PakkeshopLabel.AfsenderNavn); @@ -384,9 +505,148 @@ end; + Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725 + end; +// Bruges til label der passer til 100x150 +procedure TLabelPrint.PrintFuldPakkeLabelStor( PakkeshopLabel : TLabelData); +var + XForm, XFormOld: TXForm; //Bruges til rotate X-formation + Angle: integer; + gMode: integer; + Dirigering: string; + BarcodeRect : TRect; + +begin + with Printer do + begin + BeginDoc(); + + + + Canvas.Font.Style := [TFontStyle.fsBold]; + Canvas.Font.Size := 16; + Canvas.TextOut(25,25, 'Code: ' + PakkeshopLabel.Tjekkode + ' ' + PakkeshopLabel.Overskrift); + + + + Canvas.TextOut(80, 220, PakkeshopLabel.Navn ); + Canvas.TextOut(80, 270, PakkeshopLabel.Vejnavn ); + Canvas.TextOut(80, 320, PakkeshopLabel.Postnr ); + + + Canvas.Font.Size := 9; + + + // Skriv ikke 'Pakkeshop' overskrift hvis det er en shop2direkte + if ( PakkeshopLabel.PakkeshopNavn <> '' ) then + begin + Canvas.TextOut(170, 460, 'Pakkeshop:'); + Canvas.TextOut(170, 490, PakkeshopLabel.PakkeshopNavn); + Canvas.TextOut(170, 520, PakkeshopLabel.PakkeshopAddr); + Canvas.TextOut(170, 550, PakkeshopLabel.PakkeshopPostnr); + + end; + + + + Canvas.TextOut(550, 460, 'Afsender:'); + Canvas.TextOut(550, 490, PakkeshopLabel.AfsenderNavn); + Canvas.TextOut(550, 520, PakkeshopLabel.AfsenderAdresse); + Canvas.TextOut(550, 550, PakkeshopLabel.AfsenderPostnr); + + Dirigering := PakkeshopLabel.PakkeshopSted + ' | ' + PakkeshopLabel.PakkeshopTurid + ' | ' + PakkeshopLabel.PakkeshopNr; + if ( PakkeshopLabel.Koreliste <> '') then + begin + Dirigering := Dirigering + ' > ' + PakkeshopLabel.Koreliste; + end; + + + Canvas.Font.Size := 12; + Canvas.TextOut(40, 680, Dirigering); + + + + + + //Tegn adskillelses linier + Canvas.Pen.Width := 2; + //Øverste linie + Canvas.MoveTo( 40, 180); + Canvas.LineTo(900, 180); + + // Midterste linie + Canvas.MoveTo( 40, 440); + Canvas.LineTo(900, 440); + + //Nederste linie + Canvas.MoveTo( 40, 640); + Canvas.LineTo(900, 640); + + + //Tegn skrå streger over afsender + Canvas.Pen.Width := 1; + Canvas.MoveTo(840, 450); + Canvas.LineTo(540, 590); + Canvas.MoveTo(840, 590); + Canvas.LineTo(540, 450); + + + + // Resten af rutinen vedr genering og placering af Barcode + + Barcode.Font.Size := 9; + Barcode.BarToSpaceRatio := 0.9; + + + BarCode.BarCodeType := bcCode128; + BarCode.Code128Subset := csCodeC; + BarCode.Code := PakkeshopLabel.Stregkode; + BarCode.Validate(True); + + +// parentForm.Msg( inttostr( Barcode.Font.Size) );//Default 8 +// parentForm.Msg( Double.ToString( Barcode.BarNarrowToWideRatio) );//Default 2 +// parentForm.Msg( Double.ToString( Barcode.BarToSpaceRatio) );//Default 1 +// parentForm.Msg( Double.ToString(BarCode.Width ) );//default 200 + + + //Start X-formation + //ShowMessage( Format('%d %d', [PageWidth, PageHeight]) ); + GetWorldTransform(Canvas.Handle, XFormOld); + + Angle := 270; + XForm.eM11 := Cos(DegToRad(Angle)); + XForm.eM12 := Sin(DegToRad(Angle)); + XForm.eM21 := -Sin(DegToRad(Angle)); + XForm.eM22 := Cos(DegToRad(Angle)); + XForm.eDx := 0; + XForm.eDy := 0; + + gMode := SetGraphicsMode(Canvas.Handle, GM_ADVANCED); + SetWorldTransform(Canvas.Handle, XForm); + + // PaintToCanvasSize arbejder i Inches + // Første pos argument bliver nu Y og skal være negativ for at rykke den ned + //Anden pos er X og skal være positiv for at justere ind fra venstre mod højre + + BarCode.PaintToCanvasSize(Printer.Canvas, -2.7, 4.8, 0.5); + + + + + SetWorldTransform(Canvas.Handle, XFormOld); + SetGraphicsMode(Canvas.Handle, gMode); + + EndDoc(); + end; + + + Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725 +end; + function TLabelPrint.SavePChar(p: PChar): PChar; const error: PChar = 'Nil'; @@ -397,6 +657,101 @@ Result := p; end; +// Online zpl viewer + + +procedure TLabelPrint.PrintZPL( ZplData : string); +var + ADevice, ADeviceName, ADevicePort: array[0..255]of Char; + PrinterHandle: THandle; + DocInfo: TDocInfo1; + dwJob: cardinal; + dwBytesWritten: cardinal; + AUtf8: UTF8string; + ADeviceMode: THandle; + +begin + + + Printer.GetPrinter(ADevice, ADeviceName, ADevicePort, ADeviceMode); + + if not OpenPrinter(ADevice, PrinterHandle, nil) then + begin + Exit; + parentForm.Msg('error on openprinter'); + end; + + //Fill in the structure with info about this "document" + DocInfo.pDocName := PChar('Spooler Document Name'); + DocInfo.pOutputFile := nil; + DocInfo.pDatatype := 'RAW'; + + //Inform the spooler the document is beginning + dwJob := StartDocPrinter(PrinterHandle, 1, @DocInfo); + if dwJob = 0 then + begin + ClosePrinter(PrinterHandle); + PrinterHandle := 0; + Exit; + end; + + //Start a page + if not StartPagePrinter(PrinterHandle) then + begin + EndDocPrinter(PrinterHandle); + ClosePrinter(PrinterHandle); + PrinterHandle := 0; + Exit; + end; + + //your zebra code... + AUtf8 := UTF8string(ZplData); + WritePrinter(PrinterHandle, @AUtf8[1], Length(AUtf8), dwBytesWritten); + + //End the page + if not EndPagePrinter(PrinterHandle) then + begin + EndDocPrinter(PrinterHandle); + ClosePrinter(PrinterHandle); + PrinterHandle := 0; + Exit; + end; + + //Inform the spooler that the document is ending + if not EndDocPrinter(PrinterHandle) then + begin + ClosePrinter(PrinterHandle); + PrinterHandle := 0; + Exit; + end; + + //Tidy up the printer handle + ClosePrinter(PrinterHandle); + PrinterHandle := 0; + +end; + +procedure TLabelPrint.PrintSimpelLabel( LabelData : TLabelData) ; +begin + with Printer do + begin + BeginDoc; + + Canvas.Font.Size := 20; + Canvas.TextOut(10, 20, LabelData.SimpelLinie1); + Canvas.TextOut(10, 120, LabelData.SimpelLinie2); + Canvas.TextOut(10, 220, LabelData.SimpelLinie3); + + EndDoc; + end; + + + + Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725 + +end; + + function TLabelPrint.GetPrinterCount() : Integer; begin