znaczacy > comp.lang.* > comp.lang.java

Jaroslaw Ostrowski (06.07.2018, 12:21)
Witam, po raz pierwszy na grupie.
Od niespelna roku posluguje sie jezykiem java, wiec jesli postac kodu zródlowego odbiega od prawidel to prosze o wyrozumialosc.
Pisze aplikacje dla Android i chcialbym na drukarce
Zebra ZQ520 drukowac bitmapy o zmiennej wysokosci,
które generuje programowo.

Problem polega na tym, ze drukarka owszem drukuje poprawnie
obrazek ale potem wysuwa 20cm papieru, cos tak jakby równalado A4.
Pisalem do Zebry ale stwierdzili, ze pomoc na poziomie kodu zródlowego
jest poza ich zakresem :)
W google znalazlem mnóstwo niedzialajacych przykladów, które kosztowaly mnie
rolke papieru.
Jak zrobic aby drukarka wydrukowala i zatrzymala sie nie marnujac papieru ?

Ponizej kod zródlowy procedury drukujacej bitmape, bylbym wdzieczny 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.Zebra MAC);
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();

}
Sebastian Bialy (10.08.2018, 22:42)
On 7/6/2018 12:21 PM, Jaroslaw Ostrowski wrote:
> Od niespelna roku posluguje sie jezykiem java, wiec jesli postac kodu zródlowego odbiega od prawidel to prosze o wyrozumialosc.
> Pisze aplikacje dla Android i chcialbym na drukarce
> Zebra ZQ520 drukowac bitmapy o zmiennej wysokosci,
> które generuje programowo.
> Problem polega na tym, ze drukarka owszem drukuje poprawnie
> obrazek ale potem wysuwa 20cm papieru, cos tak jakby równala do A4.


Mialem podobne problemy (na PC) z drukowaniem na Zebrze TPL2824,
"strona" byla domyslnie A4 i nijak nie bylem w stanie ustawic prawidlowo
rozmiaru papieru naklejki, drukowalo sie cos na pierwszej a potem
wylatywalo 12 nastepnych, pustych.

Przyszlo olsnienie kiedy okazalo sie ze nalezalo wywolac metode
ustawiajaca defaulowy rozmiar papieru i nagle wszystko drukowalo sie na
naklejce perfekcyjnie (tutaj nie pamietam na 100%, wiec powiedzmy ze na
90% trzeba bylo ustawic default ;) bo domyslny default byl malo default.
Moglem sobie ustwiac obszar wydruku nawet 1mm x 1mm i dzialalo.

Teraz Cie zmartwie, mialem z tym przeboje z 10 lat temu i nie pamietam.
Ale znalazlem fragment kodu, moze ci sie 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.getXML ParserClassName();

org.apache.batik.dom.svg.SAXSVGDocumentFactory factory =
new org.apache.batik.dom.svg.SAXSVGDocumentFactory(par ser);

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.getSystemLookAndFeelClassNam e());
} catch (Exception e) { }

java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new PrinterTest();
}
});
}
}

Drukarka slicznie drukowala barcody na naklejkach z dodatkowymi efektami
w postaci grafiki SVG. Ale co do kodu nie wiem czy to ten co dzialal czy
to ten co nie dzialal. Dawno to bylo a TPL odeszla do krainy wiecznie
zimnej glowicy i nie mam jak sprawdzic.

W razie czego tu masz inny, tez 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(printTran scoder,

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(printTransc oder,

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(printTrans coder,

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(printTran scoder,

org.apache.batik.transcoder.print.PrintTranscoder. KEY_SCALE_TO_PAGE_STR,

org.apache.batik.transcoder.print.PrintTranscoder. KEY_SCALE_TO_PAGE);

// AOI
printTranscoder.setTranscoderRectangleHint(printTr anscoder,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_AOI_STR,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_AOI);

// Image size
printTranscoder.setTranscoderFloatHint(printTransc oder,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_WIDTH_STR,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_WIDTH);
printTranscoder.setTranscoderFloatHint(printTransc oder,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_HEIGHT_STR,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_HEIGHT);

// Pixel to millimeter
printTranscoder.setTranscoderFloatHint(printTransc oder,
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(printTrans coder,

org.apache.batik.transcoder.print.PrintTranscoder. KEY_PAGE_ORIENTATION_STR,

org.apache.batik.transcoder.print.PrintTranscoder. KEY_PAGE_ORIENTATION);

// Page size
printTranscoder.setTranscoderFloatHint(printTransc oder,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_PAGE_WIDTH_STR,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_PAGE_WIDTH);
printTranscoder.setTranscoderFloatHint(printTransc oder,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_PAGE_HEIGHT_STR,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_PAGE_HEIGHT);

// Margins
printTranscoder.setTranscoderFloatHint(printTransc oder,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_MARGIN_TOP_STR,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_MARGIN_TOP);
printTranscoder.setTranscoderFloatHint(printTransc oder,

org.apache.batik.transcoder.print.PrintTranscoder. KEY_MARGIN_RIGHT_STR,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_MARGIN_RIGHT);
printTranscoder.setTranscoderFloatHint(printTransc oder,

org.apache.batik.transcoder.print.PrintTranscoder. KEY_MARGIN_BOTTOM_STR,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_MARGIN_BOTTOM);
printTranscoder.setTranscoderFloatHint(printTransc oder,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_MARGIN_LEFT_STR,
org.apache.batik.transcoder.print.PrintTranscoder. KEY_MARGIN_LEFT);

// Dialog options
printTranscoder.setTranscoderBooleanHint(printTran scoder,

org.apache.batik.transcoder.print.PrintTranscoder. KEY_SHOW_PAGE_DIALOG_STR,

org.apache.batik.transcoder.print.PrintTranscoder. KEY_SHOW_PAGE_DIALOG);

printTranscoder.setTranscoderBooleanHint(printTran scoder,

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.PrintRequestAttribut eSet
_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 pamietam sprowadzal sie do ustawienia domyslnej
strony (pageFormat? a moze HashPrintRequestAttributeSet? Nie pamietam.).
Bez tego drukowalo, ale mialo absurdalny rozmiar.
Podobne wątki