Path: csiph.com!news.mixmin.net!news.unit0.net!news.nask.pl!news.nask.org.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail From: =?UTF-8?Q?Sebastian_Bia=c5=82y?= Newsgroups: pl.comp.lang.java Subject: Re: Drukarka zebra ZQ520 - drukowanie bitmapy - problem Date: Fri, 10 Aug 2018 22:42:24 +0200 Organization: ATMAN - ATM S.A. Lines: 349 Message-ID: References: <27f19be6-f6d3-45c4-8403-01869f009208@googlegroups.com> NNTP-Posting-Host: 176.115.87.234 Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: node2.news.atman.pl 1533933751 490 176.115.87.234 (10 Aug 2018 20:42:31 GMT) X-Complaints-To: usenet@atman.pl NNTP-Posting-Date: Fri, 10 Aug 2018 20:42:31 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 In-Reply-To: <27f19be6-f6d3-45c4-8403-01869f009208@googlegroups.com> Content-Language: en-US Xref: csiph.com pl.comp.lang.java:10845 On 7/6/2018 12:21 PM, Jarosław Ostrowski wrote: > Od niespełna roku posługuje się językiem java, więc jeśli postać kodu źródłowego odbiega od prawideł to proszę o wyrozumiałość. > Piszę aplikację dla Android i chciałbym na drukarce > Zebra ZQ520 drukować bitmapy o zmiennej wysokości, > które generuję programowo. > > Problem polega na tym, że drukarka owszem drukuje poprawnie > obrazek ale potem wysuwa 20cm papieru, coś tak jakby równała do A4. Mialem podobne problemy (na PC) z drukowaniem na Zebrze TPL2824, "strona" była domyslnie A4 i nijak nie bylem w stanie ustawic prawidłowo rozmiaru papieru naklejki, drukowało się coś na pierwszej a potem wylatywało 12 nastepnych, pustych. Przyszlo olsnienie kiedy okazało się że należalo wywołać metodę ustawiająca defaulowy rozmiar papieru i nagle wszystko drukowało się na naklejce perfekcyjnie (tutaj nie pamiętam na 100%, więc powiedzmy że na 90% trzeba było ustawić default ;) bo domyslny default był mało default. Moglem sobie ustwiać obszar wydruku nawet 1mm x 1mm i działało. Teraz Cie zmartwie, mialem z tym przeboje z 10 lat temu i nie pamiętam. Ale znalazlem fragment kodu, może ci się przyda: public class PrinterTest implements java.awt.print.Printable { /** * @param args the command line arguments */ public PrinterTest() { java.awt.print.PrinterJob job = java.awt.print.PrinterJob.getPrinterJob(); if ( !job.printDialog() ) return; try { java.awt.print.PageFormat format = job.defaultPage(); java.awt.print.Paper paper = format.getPaper(); paper.setSize( 1.75 * 75, 3 * 75 ); paper.setImageableArea( 0 , 0 , paper.getWidth() , paper.getHeight() ); format.setPaper( paper ); format = job.validatePage( format ); job.setPrintable( this, format ); job.print(); } catch ( java.awt.print.PrinterException _e ) { } } public int print ( java.awt.Graphics g , java.awt.print.PageFormat pageFormat , int page) { if ( page != 0 ) return (NO_SUCH_PAGE); java.awt.Graphics2D g2d = (java.awt.Graphics2D) g; g2d.translate (pageFormat.getImageableX (), pageFormat.getImageableY ()); java.lang.String parser = org.apache.batik.util.XMLResourceDescriptor.getXMLParserClassName(); org.apache.batik.dom.svg.SAXSVGDocumentFactory factory = new org.apache.batik.dom.svg.SAXSVGDocumentFactory(parser); try { java.lang.String uri = "file:///d:/y.svg"; org.w3c.dom.Document doc = factory.createDocument( uri ); org.w3c.dom.svg.SVGDocument document = ( org.w3c.dom.svg.SVGDocument ) doc; org.apache.batik.svggen.SVGGraphics2D graphics = new org.apache.batik.svggen.SVGGraphics2D( doc ); } catch ( java.io.IOException _e ) { } return (PAGE_EXISTS); } public static void main(String args[]) { try { javax.swing.UIManager.setLookAndFeel( javax.swing.UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { } java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new PrinterTest(); } }); } } Drukarka slicznie drukowała barcody na naklejkach z dodatkowymi efektami w postaci grafiki SVG. Ale co do kodu nie wiem czy to ten co dzialał czy to ten co nie działał. Dawno to bylo a TPL odeszła do krainy wiecznie zimnej głowicy i nie mam jak sprawdzić. W razie czego tu masz inny, też nie wiem czy sprawny, ale bardziej wypasiony ;): public class SVGLabelPrinter { public SVGLabelPrinter( int _num ) { m_num = _num; } public void print( java.io.InputStream _stream ) { org.apache.batik.transcoder.TranscoderInput inputTranscoder = new org.apache.batik.transcoder.TranscoderInput( _stream ); print( inputTranscoder ); } public void print( org.w3c.dom.Document _document ) { org.apache.batik.transcoder.TranscoderInput inputTranscoder = new org.apache.batik.transcoder.TranscoderInput( _document ); print( inputTranscoder ); } public void print( org.apache.batik.transcoder.TranscoderInput _inputTranscoder ) { org.apache.batik.transcoder.print.PrintTranscoder printTranscoder = new org.apache.batik.transcoder.print.PrintTranscoder(); printTranscoder.transcode( _inputTranscoder, null ); javax.print.PrintService[] services = javax.print.PrintServiceLookup.lookupPrintServices(null, null); int i; net.sebobialy.utilities.configreader.ConfigReader configReader = new net.sebobialy.utilities.configreader.ConfigReader( "printer-config" + m_num + ".txt" ); System.out.println( "printer-config" + m_num + ".txt" ); java.lang.String device = configReader.getAsString( "LabelPrinter", "TLP2824"); for ( i = 0; i < services.length; i++ ) { System.out.println( "Printer: " + services[i].getName() ); if ( services[i].getName().contains( device ) ) break; } if ( i == services.length ) { javax.swing.JOptionPane.showMessageDialog( null , "Unable to find label printer: " + device + " please check printer-config.txt file" , "Error" , javax.swing.JOptionPane.ERROR_MESSAGE ); return; } try { java.awt.print.PageFormat pFormat = new java.awt.print.PageFormat(); double configHeight = configReader.getAsDouble( "LabelHeight", 3.34 ); double configWidth = configReader.getAsDouble( "LabelWidth", 1.77 ); double configMargin = configReader.getAsDouble( "LabelMargin", 0.2 ); double margin = configMargin * 72; double sizex = configWidth * 72; double sizey = configHeight * 72; java.awt.print.Paper paper = pFormat.getPaper(); paper.setSize(sizex, sizey); paper.setImageableArea( margin, margin, sizex-margin*2, sizey-margin*2); pFormat.setPaper( paper ); double width = pFormat.getWidth(); double height = pFormat.getHeight(); double movex = pFormat.getImageableX(); double movey = pFormat.getImageableY(); if ( configReader.getAsBoolean( "Horizontal", true ) ) pFormat.setOrientation( java.awt.print.PageFormat.PORTRAIT); else pFormat.setOrientation( java.awt.print.PageFormat.LANDSCAPE); java.awt.print.PrinterJob pJob = java.awt.print.PrinterJob.getPrinterJob(); pJob.setPrintable( printTranscoder, pFormat); pJob.setPrintService( services[i] ); printTranscoder.setTranscoderBooleanHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_SCALE_TO_PAGE_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_SCALE_TO_PAGE); org.apache.batik.transcoder.print.PrintTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_LANGUAGE_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_LANGUAGE); // User stylesheet printTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_USER_STYLESHEET_URI_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_USER_STYLESHEET_URI); // XML parser printTranscoder.setTranscoderStringHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_XML_PARSER_CLASSNAME_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_XML_PARSER_CLASSNAME); // Scale to page printTranscoder.setTranscoderBooleanHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_SCALE_TO_PAGE_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_SCALE_TO_PAGE); // AOI printTranscoder.setTranscoderRectangleHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_AOI_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_AOI); // Image size printTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_WIDTH_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_WIDTH); printTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_HEIGHT_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_HEIGHT); // Pixel to millimeter printTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_PIXEL_TO_MM_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER); // Page orientation printTranscoder.setTranscoderStringHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_PAGE_ORIENTATION_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_PAGE_ORIENTATION); // Page size printTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_PAGE_WIDTH_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_PAGE_WIDTH); printTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_PAGE_HEIGHT_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_PAGE_HEIGHT); // Margins printTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_MARGIN_TOP_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_MARGIN_TOP); printTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_MARGIN_RIGHT_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_MARGIN_RIGHT); printTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_MARGIN_BOTTOM_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_MARGIN_BOTTOM); printTranscoder.setTranscoderFloatHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_MARGIN_LEFT_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_MARGIN_LEFT); // Dialog options printTranscoder.setTranscoderBooleanHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_SHOW_PAGE_DIALOG_STR, org.apache.batik.transcoder.print.PrintTranscoder.KEY_SHOW_PAGE_DIALOG); printTranscoder.setTranscoderBooleanHint(printTranscoder, org.apache.batik.transcoder.print.PrintTranscoder.KEY_SHOW_PRINTER_DIALOG_STR, org.apache.batik.transcoder.print.PrintTranscoder. KEY_SHOW_PRINTER_DIALOG); // printTranscoder.addTranscodingHint( // org.apache.batik.transcoder.print.PrintTranscoder.KEY_SCALE_TO_PAGE, new java.lang.Boolean( true ) ); javax.print.attribute.PrintRequestAttributeSet set = new javax.print.attribute.HashPrintRequestAttributeSet(); pJob.print( set ); } catch (java.awt.print.PrinterException e) { } } private void dumpSet(javax.print.attribute.PrintRequestAttributeSet _set ) { javax.print.attribute.Attribute attributes[] = _set.toArray(); for ( int i = 0 ; i < attributes.length ; i++) System.out.println( attributes[0].getName() ); } int m_num; } Ogólnie problem jak pamiętam sprowadzał się do ustawienia domyslnej strony (pageFormat? a może HashPrintRequestAttributeSet? Nie pamiętam.). Bez tego drukowało, ale miało absurdalny rozmiar.