Sebastian Biały
unread,Aug 10, 2018, 4:42:32 PM8/10/18You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
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.