🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.java
2 messages
2 total messages Started by =?UTF-8?Q?Jaros Fri, 06 Jul 2018 03:21
Drukarka zebra ZQ520 - drukowanie bitmapy - problem
#152118
Author: =?UTF-8?Q?Jaros
Date: Fri, 06 Jul 2018 03:21
58 lines
2452 bytes
Witam, po raz pierwszy na grupie.
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.
Pisałem do Zebry ale stwierdzili, że pomoc na poziomie kodu źródłowego 
jest poza ich zakresem :)
W google znalazłem mnóstwo niedziałających przykładów, które kosztowały mnie
rolkę papieru.
Jak zrobić aby drukarka wydrukowała i zatrzymała się nie marnując papieru ?

Poniżej kod źródłowy procedury drukującej bitmapę, byłbym wdzięczny za sugestie.

Jarek.

public void printPhotoFromExternal(final Bitmap bitmap, final Integer heigth, final Integer width) {
        new Thread(new Runnable() {
            public void run() {
                try {
                    Looper.prepare();
                    Connection connection = new BluetoothConnectionInsecure(WartosciGlobalne.ZebraMAC);
                    connection.open();
             ZebraPrinter printer = ZebraPrinterFactory.getInstance(connection);
             //connection.write("! DF CONFIG.SYS\r\n! UTILITIES\r\nGAP-SENSE\r\nPRINT\r\n".getBytes());
             //connection.write("~jc^xa^jus^xz".getBytes());
             printer.printImage(new ZebraImageAndroid(bitmap), 0, 0, width, heigth, false);

             connection.close();

                } catch (ConnectionException e) {
                    Log.e("BT", "Blad podlaczenia " + e.getMessage());
//                    helper.showErrorDialogOnGuiThread(e.getMessage());
                } catch (ZebraPrinterLanguageUnknownException e) {
                    Log.e("BT", "Blad podlaczenia " + e.getMessage());
//                    helper.showErrorDialogOnGuiThread(e.getMessage());
                } finally {
                    bitmap.recycle();
//                    helper.dismissLoadingDialog();
                    Looper.myLooper().quit();
                }
            }
        }).start();

    }
Re: Drukarka zebra ZQ520 - drukowanie bitmapy - problem
#152119
Author: =?UTF-8?Q?Sebast
Date: Fri, 10 Aug 2018 22:42
348 lines
11548 bytes
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.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads