用Java打印具有一定字体大小的收据

用Java打印具有一定字体大小的收据,java,printing,fonts,textarea,Java,Printing,Fonts,Textarea,我试着用我从银行得到的代码打印POS收据。它的作品很好,但我想有一些不同的字体大小的收据。在论坛中搜索后,我发现一个JTextArea只能有一种字体。那么,如何做到这一点呢?我是Java新手,所以我更喜欢一个简单的解决方案,谢谢 public class NewClass { public void a() { PageFormat format = new PageFormat(); Paper paper = new Paper(); double paperWi

我试着用我从银行得到的代码打印POS收据。它的作品很好,但我想有一些不同的字体大小的收据。在论坛中搜索后,我发现一个JTextArea只能有一种字体。那么,如何做到这一点呢?我是Java新手,所以我更喜欢一个简单的解决方案,谢谢

public class NewClass {

public void a() {
    PageFormat format = new PageFormat();
    Paper paper = new Paper();

    double paperWidth = 3;//3.25
    double paperHeight = 3.69;//11.69
    double leftMargin = 0.12;
    double rightMargin = 0.10;
    double topMargin = 0;
    double bottomMargin = 0.01;

    paper.setSize(paperWidth * 200, paperHeight * 200);
    paper.setImageableArea(leftMargin * 200, topMargin * 200,
            (paperWidth - leftMargin - rightMargin) * 200,
            (paperHeight - topMargin - bottomMargin) * 200);

    format.setPaper(paper);

    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
    aset.add(OrientationRequested.PORTRAIT);


    PrinterJob printerJob = PrinterJob.getPrinterJob();
    Printable printable = new ReceiptPrint();

    format = printerJob.validatePage(format);
    boolean don = printerJob.printDialog();
    printerJob.setPrintable(printable, format);
    try {
        printerJob.print(aset);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

class ReceiptPrint implements Printable {

SimpleDateFormat df = new SimpleDateFormat();
String receiptDetailLine;
public static final String pspace = "               ";//15-spaces

public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
        throws PrinterException {

    df.applyPattern("dd/MM/yyyy HH:mm:ss");
    String strText = null;
    final String LF = "\n";// text string to output
    int lineStart;           // start index of line in textarea
    int lineEnd;             // end index of line in textarea
    int lineNumber;
    int lineCount;
    final String SPACE = "          ";//10 spaces
    final String SPACES = "         ";//9
    final String uline = "________________________________________";
    final String dline = "----------------------------------------";
    String greetings = "THANKS FOR YOUR VISIT";
    receiptDetailLine = "asdasdasda";

    Graphics2D g2d = (Graphics2D) graphics;
    Font font = new Font("MONOSPACED", Font.BOLD, 9);

    if (pageIndex < 0 || pageIndex >= 1) {
        return Printable.NO_SUCH_PAGE;
    }
    JTextArea textarea = new JTextArea(10, 40);


    textarea.append(SPACES + "sadasdsad" + "\n");

    textarea.append(" " + SPACES + "sadasdsad" + "\n");

    textarea.append(SPACES + "sadasdsad" + "\n");

    textarea.append("" + SPACES + "sadasdsad" + "\n");

    textarea.append(SPACES + "sadasdsad" + "\n");

    textarea.append(uline + "\n");
    textarea.append("Order Ref:" + "   " + receiptDetailLine + "\n");
    textarea.append(dline + "\n");
    textarea.append(" Qty     Description" + SPACES + "  Price" + LF);
    textarea.append(dline + "\n");

    System.out.println(2);

    String printedLine = "       Service Charge Complimentary";
    textarea.append(printedLine + LF);

    textarea.append(LF + SPACES + "   Your Reciept\n" + SPACE + greetings + LF);
    textarea.append(df.format(new Date()) + LF);
    textarea.setEditable(false);

    g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

    g2d.setFont(font);
    lineNumber = 0;
    lineCount = textarea.getLineCount();
    strText = textarea.getText();
    /*MediaTracker mt = new MediaTracker(textarea);
     URL imageURL = null;
     try {

     imageURL = new URL(mainDirectory+"quindell.png");
     } catch (MalformedURLException me) {
     me.printStackTrace();
     }

     //--- Load the image and wait for it to load
     Image image = Toolkit.getDefaultToolkit().getImage(imageURL);
     mt.addImage(image, 0);
     */

    while (lineCount != 0) {
        try {

            lineStart = textarea.getLineStartOffset(lineNumber);
            lineEnd = textarea.getLineEndOffset(lineNumber);
            strText = textarea.getText(lineStart, lineEnd - lineStart);
        } catch (Exception exception) {
            System.out.println("Printing error:" + exception);                  // have to catch BadLocationException
        }

        g2d.drawString(strText, 1, (lineNumber + 1) * 18);
        //spacing    between lines
        lineNumber = lineNumber + 1;
        lineCount--;
    }
    return Printable.PAGE_EXISTS;
}
}
公共类NewClass{
公共图书馆a(){
PageFormat format=新的PageFormat();
纸张=新纸张();
双纸张宽度=3;//3.25
双纸高=3.69;//11.69
双左边距=0.12;
双右页边距=0.10;
双上缘=0;
双底边距=0.01;
纸张设置尺寸(纸张宽度*200,纸张高度*200);
纸张.可设置图像区域(左页边距*200,上页边距*200,
(纸张宽度-左边距-右边距)*200,
(纸张高度-上页边距-下页边距)*200);
格式.固定纸(纸);
PrintRequestAttributeSet aset=新的HashPrintRequestAttributeSet();
aset.add(要求方向。纵向);
PrinterJob PrinterJob=PrinterJob.getPrinterJob();
可打印可打印=新接收打印();
format=printerJob.validatePage(格式);
布尔don=printerJob.printDialog();
printerJob.setPrintable(可打印,格式);
试一试{
printerJob.print(aset);
}捕获(例外e){
e、 printStackTrace();
}
}
}
类ReceiptPrint实现可打印{
SimpleDataFormat df=新SimpleDataFormat();
字符串接收行;
公共静态最终字符串pspace=”“;//15个空格
公共整型打印(图形、页面格式、页面格式、整型页面索引)
抛出PrinterException{
df.applyPattern(“dd/MM/yyyy HH:MM:ss”);
字符串strText=null;
final String LF=“\n”//要输出的文本字符串
int lineStart;//文本区域中行的开始索引
int lineEnd;//text区域中行的结束索引
整数行号;
整数行数;
最终字符串空格=”;//10个空格
最终字符串空格=”;//9
最后一个字符串uline=“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
最后一个字符串dline=“---------------------------------------”;
String问候语=“感谢您的访问”;
receiptDetailLine=“asdasda”;
Graphics2D g2d=(Graphics2D)图形;
Font Font=新字体(“等距”,Font.BOLD,9);
如果(页面索引<0 | |页面索引>=1){
返回可打印的。无此页面;
}
JTextArea textarea=新的JTextArea(10,40);
textarea.append(空格+“sadasdsad”+“\n”);
textarea.append(“+SPACES+”sadasdsad“+”\n”);
textarea.append(空格+“sadasdsad”+“\n”);
textarea.append(“+SPACES+”sadasdsad“+”\n”);
textarea.append(空格+“sadasdsad”+“\n”);
textarea.append(uline+“\n”);
textarea.append(“订单参考:”+“+receiptDetailLine+”\n”);
textarea.append(dline+“\n”);
textarea.append(“数量描述”+空格+“价格”+LF);
textarea.append(dline+“\n”);
系统输出打印ln(2);
字符串printedLine=“免费服务费”;
textarea.append(printedLine+LF);
textarea.append(LF+SPACES+“Your receipt\n”+空格+问候语+LF);
textarea.append(df.format(newdate())+LF);
textarea.setEditable(false);
translate(pageFormat.getImageableX(),pageFormat.getImageableY());
g2d.setFont(字体);
行号=0;
lineCount=textarea.getLineCount();
strText=textarea.getText();
/*MediaTracker mt=新的MediaTracker(textarea);
URL imageURL=null;
试一试{
imageURL=新URL(mainDirectory+“quindell.png”);
}catch(格式错误的durlexception me){
me.printStackTrace();
}
//---加载图像并等待其加载
Image Image=Toolkit.getDefaultToolkit().getImage(imageURL);
mt.ADIMAGE(图像,0);
*/
while(行数!=0){
试一试{
lineStart=textarea.getLineStartOffset(行号);
lineEnd=textarea.getLineEndOffset(行号);
strText=textarea.getText(lineStart,lineEnd-lineStart);
}捕获(异常){
System.out.println(“打印错误:+异常);//必须捕获BadLocationException
}
g2d.抽绳(strText,1,(行号+1)*18);
//行距
行号=行号+1;
行数--;
}
返回Printable.PAGE_存在;
}
}

这对我很有用。希望这对你有帮助

首先,JTextArea的文本从N到0打印

您可以根据行号指定条件来更改字体,如下所示

    while (lineCount != 0) {
        try {
            lineStart = textarea.getLineStartOffset(lineNumber);
            lineEnd = textarea.getLineEndOffset(lineNumber);
            strText = textarea.getText(lineStart, lineEnd - lineStart);
            System.out.println("To be Print is : " + strText + " :" + lineCount);
        } catch (Exception ex) {
            loger.error(ex);
        }
        **if(lineNumber==3) {
            g2d.setFont(new Font("MONOSPACED", Font.ITALIC, 13));
        }**
        g2d.drawString(strText, 1, (lineNumber + 1) * 18);
        lineNumber = lineNumber + 1;
        lineCount--;
    }

其中条件lineNumber==3更改字体。您可以在其他部分设置旧字体。

嗯,代码似乎很奇怪。似乎创建TextArea只是为了设置布局,但字体直接发送到
g2d
实例。。。可能对每个字体大小使用不同的TextArea实例(假设您不需要在一行内更改字体),如果此代码块正常工作,这将是最简单的。。。但是,代码似乎很容易出错,我更希望了解库的工作原理,并寻找更健壮的解决方案……:)