用Java打印具有一定字体大小的收据
我试着用我从银行得到的代码打印POS收据。它的作品很好,但我想有一些不同的字体大小的收据。在论坛中搜索后,我发现一个JTextArea只能有一种字体。那么,如何做到这一点呢?我是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
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实例(假设您不需要在一行内更改字体),如果此代码块正常工作,这将是最简单的。。。但是,代码似乎很容易出错,我更希望了解库的工作原理,并寻找更健壮的解决方案……:)