如何使用打印机api格式化在JAVA中打印的文本?

时间:2012-05-27 14:46:32

标签: java printing graphics2d thermal-printer

我需要在热敏打印机中逐行打印。在%n处断线 我想在打印时坚持字符串模式.. 我不熟悉打印机api和图形2d api ..我需要修复这个1小时的时间.. 希望快速回答​​.. 提前致谢 我的String格式是这样的:

String printStat = 
                        "              *****                  %n"
                      + "       W*** OF ** AND *****        %n"
                      + "      4/400 kfjkasjfdkas ajdksa        %n"
                      + "  aksdka ajke ajeklaje  kajke ka  a   %n"
                      + " Date: "+now.get(Calendar.DAY_OF_MONTH)+"/"+(now.get(Calendar.MONTH)+1)+"/"+now.get(Calendar.YEAR)+"             Time: "+now.get(Calendar.HOUR_OF_DAY)+":"+now.get(Calendar.MINUTE)+"%n"
                      + "--------------------------------------%n"
                      + "    Name            Qty     Price    %n"
                      + "--------------------------------------%n";

打印方法:

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
       /* We'll assume that Jav2D is available. Create a copy
        * of it so that we can pass the original Graphics
        * instance to the PageFormat instance.
        */
        Graphics2D g2d = (Graphics2D) graphics.create();
        /* Move the origin from the corner of the Paper to the corner
        * of the imageable area.
        */
        g2d.translate(format.getImageableX(), format.getImageableY());
        /* Set the text color.
        */
        g2d.setPaint(Color.black);
        g2d.setFont(new Font("Arial", Font.BOLD, 10));
        /* Use a LineBreakMeasurer instance to break our text into
        * lines that fit the imageable area of the page.
        */
        Point2D.Float pen = new Point2D.Float();
        AttributedCharacterIterator charIterator = mStyledText.getIterator();
        //LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
        LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
        float wrappingWidth = (float) format.getImageableWidth();
        while (measurer.getPosition() < charIterator.getEndIndex()) {

        TextLayout layout = measurer.nextLayout(wrappingWidth);
        pen.y += layout.getAscent();
        float dx = layout.isLeftToRight() ? 0 : (wrappingWidth - layout.getAdvance());
        layout.draw(g2d, pen.x + dx, pen.y);
        pen.y += layout.getDescent() + layout.getLeading();
        }
        g2d.dispose();
        g2d = null;
        /* Calling the PageFormat is not part of the printing API, 
        * but it is a useful convention. In this example PageFormat 
        * does not implement Printable and so it is not invoked here. 
        * In later examples, PageFormat will implement Printable. 
        */
        try {
        Printable formatPainter = (Printable) format;
        formatPainter.print(graphics, format, pageIndex);
        /* Nothing to do here. The PageFormat has nothing to print.
        */
        } catch (ClassCastException exception) {
        }
        return Printable.PAGE_EXISTS;
       }   

1 个答案:

答案 0 :(得分:1)

使用固定宽度字体,将Arial替换为“Monospaced”或“Courier”。