Java調(diào)用打印機(jī)打印圖片和文本的多種方法
在Java中調(diào)用打印機(jī)打印文本和圖片有多種方法,以下是幾種常用的實(shí)現(xiàn)方式:
一、使用Java內(nèi)置的打印API
1.基本打印框架
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.awt.*;
import java.awt.print.*;
import java.io.*;
import javax.imageio.ImageIO;
public class JavaPrinter {
// 打印文本
public static void printText(String text) {
PrinterJob job = PrinterJob.getPrinterJob();
// 設(shè)置打印內(nèi)容
job.setPrintable(new Printable() {
@Override
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
}
Graphics2D g2d = (Graphics2D) g;
g2d.translate(pf.getImageableX(), pf.getImageableY());
// 設(shè)置字體
Font font = new Font("宋體", Font.PLAIN, 12);
g2d.setFont(font);
// 繪制文本
g2d.drawString(text, 100, 100);
return Printable.PAGE_EXISTS;
}
});
try {
// 顯示打印對(duì)話框
if (job.printDialog()) {
job.print();
}
} catch (PrinterException e) {
e.printStackTrace();
}
}
}
2.完整打印類(支持文本和圖片)
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.awt.*;
import java.awt.print.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
public class DocumentPrinter implements Printable {
private String text;
private BufferedImage image;
private boolean hasImage;
public DocumentPrinter(String text) {
this.text = text;
this.hasImage = false;
}
public DocumentPrinter(String text, BufferedImage image) {
this.text = text;
this.image = image;
this.hasImage = true;
}
public void printDocument() {
PrinterJob printerJob = PrinterJob.getPrinterJob();
printerJob.setPrintable(this);
// 設(shè)置打印屬性
PageFormat pageFormat = printerJob.defaultPage();
// 自定義頁(yè)面設(shè)置
Paper paper = new Paper();
paper.setSize(595, 842); // A4 size in points (1/72 inch)
paper.setImageableArea(72, 72, 451, 698); // 1 inch margins
pageFormat.setPaper(paper);
// 顯示打印對(duì)話框
if (printerJob.printDialog()) {
try {
printerJob.print();
} catch (PrinterException e) {
System.err.println("打印失敗: " + e.getMessage());
}
}
}
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
if (pageIndex > 0) {
return NO_SUCH_PAGE;
}
Graphics2D g2d = (Graphics2D) graphics;
// 設(shè)置高質(zhì)量渲染
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// 轉(zhuǎn)換坐標(biāo)到可打印區(qū)域
double pageWidth = pageFormat.getImageableWidth();
double pageHeight = pageFormat.getImageableHeight();
int x = (int) pageFormat.getImageableX();
int y = (int) pageFormat.getImageableY();
// 打印文本
if (text != null && !text.isEmpty()) {
printText(g2d, x, y, pageWidth);
}
// 打印圖片
if (hasImage && image != null) {
printImage(g2d, x, y, pageWidth, pageHeight);
}
return PAGE_EXISTS;
}
private void printText(Graphics2D g2d, int x, int y, double pageWidth) {
// 設(shè)置字體
Font font = new Font("宋體", Font.PLAIN, 12);
g2d.setFont(font);
g2d.setColor(Color.BLACK);
// 計(jì)算文本布局
FontMetrics metrics = g2d.getFontMetrics();
int lineHeight = metrics.getHeight();
int currentY = y + lineHeight;
// 處理?yè)Q行
String[] lines = text.split("\n");
for (String line : lines) {
// 如果一行太長(zhǎng),進(jìn)行換行處理
if (metrics.stringWidth(line) > pageWidth - 100) {
printWrappedLine(g2d, line, x + 50, currentY,
(int)pageWidth - 100, metrics);
} else {
g2d.drawString(line, x + 50, currentY);
}
currentY += lineHeight;
}
}
private void printWrappedLine(Graphics2D g2d, String line,
int x, int y, int maxWidth, FontMetrics metrics) {
String[] words = line.split(" ");
StringBuilder currentLine = new StringBuilder();
for (String word : words) {
String testLine = currentLine + word + " ";
if (metrics.stringWidth(testLine) <= maxWidth) {
currentLine.append(word).append(" ");
} else {
if (currentLine.length() > 0) {
g2d.drawString(currentLine.toString(), x, y);
y += metrics.getHeight();
}
currentLine = new StringBuilder(word + " ");
}
}
if (currentLine.length() > 0) {
g2d.drawString(currentLine.toString(), x, y);
}
}
private void printImage(Graphics2D g2d, int x, int y,
double pageWidth, double pageHeight) {
if (image == null) return;
// 計(jì)算圖片尺寸和位置
int imgWidth = image.getWidth();
int imgHeight = image.getHeight();
// 調(diào)整圖片大小以適應(yīng)頁(yè)面
double scale = Math.min(
(pageWidth - 100) / imgWidth,
(pageHeight - 200) / imgHeight
);
int scaledWidth = (int) (imgWidth * scale);
int scaledHeight = (int) (imgHeight * scale);
// 居中顯示圖片
int imgX = x + (int)((pageWidth - scaledWidth) / 2);
int imgY = y + (int)((pageHeight - scaledHeight) / 2) + 100;
// 繪制圖片
g2d.drawImage(image, imgX, imgY, scaledWidth, scaledHeight, null);
// 添加圖片邊框
g2d.setColor(Color.LIGHT_GRAY);
g2d.drawRect(imgX - 1, imgY - 1, scaledWidth + 2, scaledHeight + 2);
}
public static void main(String[] args) {
try {
// 示例1:打印文本
String text = "這是一個(gè)打印測(cè)試文檔。\n" +
"第二行文本內(nèi)容。\n" +
"第三行文本內(nèi)容,這一行比較長(zhǎng),用于測(cè)試自動(dòng)換行功能。";
DocumentPrinter textPrinter = new DocumentPrinter(text);
textPrinter.printDocument();
// 示例2:打印文本和圖片
BufferedImage image = ImageIO.read(new File("image.jpg"));
DocumentPrinter imagePrinter = new DocumentPrinter(text, image);
imagePrinter.printDocument();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、使用Java Print Service API(更現(xiàn)代的方式)
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.awt.print.*;
import java.io.*;
import java.util.Locale;
public class PrintServiceExample {
// 獲取所有打印機(jī)
public static void listPrinters() {
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
System.out.println("可用的打印機(jī):");
for (PrintService service : services) {
System.out.println(" - " + service.getName());
}
}
// 使用指定打印機(jī)打印文本
public static void printToSpecificPrinter(String text, String printerName) {
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
PrintService selectedService = null;
// 查找指定打印機(jī)
for (PrintService service : services) {
if (service.getName().equals(printerName)) {
selectedService = service;
break;
}
}
if (selectedService == null) {
System.err.println("未找到打印機(jī): " + printerName);
return;
}
// 創(chuàng)建打印作業(yè)
DocPrintJob job = selectedService.createPrintJob();
// 創(chuàng)建打印屬性集
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(MediaSizeName.ISO_A4);
attributes.add(OrientationRequested.PORTRAIT);
attributes.add(new Copies(1));
// 創(chuàng)建打印文檔
byte[] bytes = text.getBytes();
Doc doc = new SimpleDoc(bytes, DocFlavor.BYTE_ARRAY.AUTOSENSE, null);
try {
job.print(doc, attributes);
System.out.println("打印任務(wù)已發(fā)送到: " + printerName);
} catch (PrintException e) {
System.err.println("打印失敗: " + e.getMessage());
}
}
// 打印HTML內(nèi)容
public static void printHTML(String htmlContent) {
try {
// 創(chuàng)建臨時(shí)HTML文件
File tempFile = File.createTempFile("print", ".html");
try (FileWriter writer = new FileWriter(tempFile)) {
writer.write(htmlContent);
}
// 使用默認(rèn)程序打開(kāi)并打印(Windows)
if (System.getProperty("os.name").toLowerCase().contains("win")) {
Runtime.getRuntime().exec(
"rundll32 url.dll,FileProtocolHandler " +
tempFile.getAbsolutePath()
);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、使用Apache PDFBox庫(kù)打印PDF
首先添加Maven依賴:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.printing.PDFPrintable;
import org.apache.pdfbox.printing.Scaling;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.awt.print.*;
import java.io.*;
public class PDFPrinter {
// 創(chuàng)建PDF并打印
public static void createAndPrintPDF(String text, String imagePath) {
try (PDDocument document = new PDDocument()) {
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(
document, page);
// 添加文本
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
contentStream.newLineAtOffset(50, 750);
contentStream.showText(text);
contentStream.endText();
// 添加圖片
if (imagePath != null) {
PDImageXObject image = PDImageXObject.createFromFile(
imagePath, document);
contentStream.drawImage(image, 100, 400, 300, 300);
}
contentStream.close();
// 保存PDF
document.save("document.pdf");
// 打印PDF
printPDF("document.pdf");
} catch (IOException e) {
e.printStackTrace();
}
}
// 打印PDF文件
public static void printPDF(String pdfPath) throws IOException {
try (PDDocument document = PDDocument.load(new File(pdfPath))) {
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(new PDFPrintable(document, Scaling.SCALE_TO_FIT));
if (job.printDialog()) {
job.print();
}
} catch (PrinterException e) {
e.printStackTrace();
}
}
// 直接打印PDF(無(wú)對(duì)話框)
public static void silentPrintPDF(String pdfPath) throws IOException {
try (PDDocument document = PDDocument.load(new File(pdfPath))) {
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(new PDFPrintable(document, Scaling.SCALE_TO_FIT));
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}
}
四、使用iText庫(kù)打印
首先添加Maven依賴:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.*;
import java.awt.print.*;
public class ITextPrinter {
public static void createPdfAndPrint(String text, String imagePath) {
Document document = new Document();
try {
// 創(chuàng)建PDF文件
PdfWriter writer = PdfWriter.getInstance(
document, new FileOutputStream("output.pdf"));
document.open();
// 添加文本
Font font = FontFactory.getFont(FontFactory.HELVETICA, 12);
Paragraph paragraph = new Paragraph(text, font);
document.add(paragraph);
// 添加圖片
if (imagePath != null) {
Image image = Image.getInstance(imagePath);
image.scaleToFit(300, 300);
document.add(image);
}
document.close();
// 打印PDF
printDocument("output.pdf");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void printDocument(String filePath) {
try {
// 使用系統(tǒng)命令打?。╓indows)
if (System.getProperty("os.name").toLowerCase().contains("win")) {
Runtime.getRuntime().exec(
"rundll32 SHELL32.DLL,ShellExec_RunDLL " +
"msprint2.dll,MyPrint " + filePath
);
} else {
// Linux/Mac
Runtime.getRuntime().exec("lpr " + filePath);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
五、Web應(yīng)用中的打印(Java Servlet)
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.awt.print.*;
public class WebPrinterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String content = request.getParameter("content");
String printerName = request.getParameter("printer");
// 在服務(wù)器端打印
if (printOnServer(content, printerName)) {
response.getWriter().write("打印任務(wù)已提交");
} else {
response.getWriter().write("打印失敗");
}
}
private boolean printOnServer(String content, String printerName) {
try {
PrinterJob job = PrinterJob.getPrinterJob();
// 設(shè)置打印機(jī)(如果指定)
if (printerName != null && !printerName.isEmpty()) {
PrintService[] services = PrinterJob.lookupPrintServices();
for (PrintService service : services) {
if (service.getName().equals(printerName)) {
job.setPrintService(service);
break;
}
}
}
job.setPrintable(new Printable() {
@Override
public int print(Graphics g, PageFormat pf, int page) {
if (page > 0) return NO_SUCH_PAGE;
Graphics2D g2d = (Graphics2D) g;
g2d.setFont(new Font("宋體", Font.PLAIN, 12));
g2d.drawString(content, 100, 100);
return PAGE_EXISTS;
}
});
job.print();
return true;
} catch (PrinterException e) {
e.printStackTrace();
return false;
}
}
// 生成HTML頁(yè)面,包含打印按鈕
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>打印測(cè)試</title>");
out.println("<script>");
out.println("function printContent() {");
out.println(" var content = document.getElementById('content').value;");
out.println(" var printWindow = window.open('', '', 'width=800,height=600');");
out.println(" printWindow.document.write('<html><head><title>打印</title></head><body>');");
out.println(" printWindow.document.write('<pre>' + content + '</pre>');");
out.println(" printWindow.document.write('</body></html>');");
out.println(" printWindow.document.close();");
out.println(" printWindow.print();");
out.println("}");
out.println("</script>");
out.println("</head>");
out.println("<body>");
out.println("<h2>打印測(cè)試</h2>");
out.println("<textarea id='content' rows='10' cols='50'></textarea><br>");
out.println("<button onclick='printContent()'>打印</button>");
out.println("</body>");
out.println("</html>");
}
}
六、高級(jí)打印功能
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.util.*;
public class AdvancedPrinter {
// 批量打印
public static void batchPrint(List<String> documents, String printerName) {
PrintService printer = findPrinter(printerName);
if (printer == null) {
System.err.println("打印機(jī)未找到: " + printerName);
return;
}
DocPrintJob job = printer.createPrintJob();
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
for (String doc : documents) {
byte[] bytes = doc.getBytes();
Doc document = new SimpleDoc(bytes,
DocFlavor.BYTE_ARRAY.AUTOSENSE, null);
try {
job.print(document, attributes);
System.out.println("已打印文檔: " + doc.substring(0, Math.min(50, doc.length())));
// 延遲一下,避免打印機(jī)過(guò)載
Thread.sleep(1000);
} catch (Exception e) {
System.err.println("打印失敗: " + e.getMessage());
}
}
}
// 查找打印機(jī)
private static PrintService findPrinter(String printerName) {
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
for (PrintService service : services) {
if (service.getName().contains(printerName)) {
return service;
}
}
return null;
}
// 獲取打印機(jī)狀態(tài)
public static void checkPrinterStatus(String printerName) {
PrintService printer = findPrinter(printerName);
if (printer == null) {
System.out.println("打印機(jī)未找到");
return;
}
Attribute[] attributes = printer.getAttributes().toArray();
System.out.println("打印機(jī)狀態(tài): " + printer.getName());
for (Attribute attr : attributes) {
System.out.println(" " + attr.getName() + ": " + attr);
}
}
// 打印設(shè)置類
public static class PrintSettings {
private String printerName;
private int copies = 1;
private boolean duplex = false;
private MediaSizeName paperSize = MediaSizeName.ISO_A4;
private OrientationRequested orientation = OrientationRequested.PORTRAIT;
// getters and setters
public String getPrinterName() { return printerName; }
public void setPrinterName(String printerName) { this.printerName = printerName; }
public int getCopies() { return copies; }
public void setCopies(int copies) { this.copies = copies; }
public boolean isDuplex() { return duplex; }
public void setDuplex(boolean duplex) { this.duplex = duplex; }
public MediaSizeName getPaperSize() { return paperSize; }
public void setPaperSize(MediaSizeName paperSize) { this.paperSize = paperSize; }
public OrientationRequested getOrientation() { return orientation; }
public void setOrientation(OrientationRequested orientation) { this.orientation = orientation; }
}
}
七、實(shí)用工具類
import java.awt.*;
import java.awt.print.*;
import javax.print.*;
import javax.print.attribute.*;
import java.io.*;
import java.util.*;
public class PrintUtility {
// 打印圖片文件
public static boolean printImageFile(File imageFile) {
try {
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(new Printable() {
@Override
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (pageIndex > 0) return NO_SUCH_PAGE;
Graphics2D g2d = (Graphics2D) g;
Image image = Toolkit.getDefaultToolkit().getImage(
imageFile.getAbsolutePath());
// 等待圖片加載
MediaTracker tracker = new MediaTracker(new Component() {});
tracker.addImage(image, 0);
try {
tracker.waitForID(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 計(jì)算縮放比例
double pageWidth = pf.getImageableWidth();
double pageHeight = pf.getImageableHeight();
double imageWidth = image.getWidth(null);
double imageHeight = image.getHeight(null);
double scale = Math.min(
pageWidth / imageWidth,
pageHeight / imageHeight
);
int scaledWidth = (int) (imageWidth * scale);
int scaledHeight = (int) (imageHeight * scale);
// 居中繪制
int x = (int) pf.getImageableX() +
(int) ((pageWidth - scaledWidth) / 2);
int y = (int) pf.getImageableY() +
(int) ((pageHeight - scaledHeight) / 2);
g2d.drawImage(image, x, y, scaledWidth, scaledHeight, null);
return PAGE_EXISTS;
}
});
if (job.printDialog()) {
job.print();
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 打印HTML到PDF再打印
public static void printHTMLAsPDF(String htmlContent) {
try {
// 創(chuàng)建臨時(shí)HTML文件
File htmlFile = File.createTempFile("print", ".html");
try (FileWriter writer = new FileWriter(htmlFile)) {
writer.write(htmlContent);
}
// 使用wkhtmltopdf轉(zhuǎn)換為PDF(需要安裝wkhtmltopdf)
File pdfFile = File.createTempFile("print", ".pdf");
String command = String.format("wkhtmltopdf %s %s",
htmlFile.getAbsolutePath(), pdfFile.getAbsolutePath());
Process process = Runtime.getRuntime().exec(command);
process.waitFor();
// 打印PDF
printPDF(pdfFile);
// 清理臨時(shí)文件
htmlFile.delete();
pdfFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void printPDF(File pdfFile) {
// 使用系統(tǒng)打印命令
try {
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("win")) {
// Windows
Runtime.getRuntime().exec(
"rundll32 SHELL32.DLL,ShellExec_RunDLL " +
"msprint2.dll,MyPrint " + pdfFile.getAbsolutePath()
);
} else if (os.contains("mac")) {
// Mac
Runtime.getRuntime().exec(
"lp " + pdfFile.getAbsolutePath()
);
} else {
// Linux
Runtime.getRuntime().exec(
"lp " + pdfFile.getAbsolutePath()
);
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 測(cè)試方法
public static void main(String[] args) {
// 測(cè)試打印文本
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(new Printable() {
@Override
public int print(Graphics g, PageFormat pf, int page) {
if (page > 0) return NO_SUCH_PAGE;
Graphics2D g2d = (Graphics2D) g;
g2d.setFont(new Font("Arial", Font.BOLD, 16));
g2d.drawString("測(cè)試打印", 100, 100);
g2d.setFont(new Font("Arial", Font.PLAIN, 12));
g2d.drawString("當(dāng)前時(shí)間: " + new Date(), 100, 150);
// 繪制表格
int startY = 200;
g2d.drawLine(100, startY, 300, startY);
g2d.drawString("項(xiàng)目", 110, startY - 5);
g2d.drawString("數(shù)量", 210, startY - 5);
startY += 30;
g2d.drawString("商品A", 110, startY);
g2d.drawString("10", 210, startY);
return PAGE_EXISTS;
}
});
try {
if (job.printDialog()) {
job.print();
}
} catch (PrinterException e) {
e.printStackTrace();
}
}
}
八、使用注意事項(xiàng)
1.依賴管理(Maven)
<!-- PDFBox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
<!-- iText -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
<!-- 圖形處理 -->
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-core</artifactId>
<version>3.8.2</version>
</dependency>
2.錯(cuò)誤處理
public class SafePrinter {
public static boolean safePrint(Runnable printTask) {
try {
printTask.run();
return true;
} catch (PrinterException e) {
System.err.println("打印機(jī)錯(cuò)誤: " + e.getMessage());
return false;
} catch (SecurityException e) {
System.err.println("安全權(quán)限錯(cuò)誤: " + e.getMessage());
return false;
} catch (Exception e) {
System.err.println("未知錯(cuò)誤: " + e.getMessage());
return false;
}
}
}
3.異步打印
public class AsyncPrinter {
public static void printAsync(String content) {
new Thread(() -> {
try {
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable((g, pf, page) -> {
// 打印邏輯
return PAGE_EXISTS;
});
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}).start();
}
}
總結(jié)
選擇打印方法:
- 簡(jiǎn)單文本打印:使用
PrinterJob和Printable接口 - 復(fù)雜文檔打印:使用PDFBox或iText生成PDF后打印
- Web應(yīng)用打印:使用Servlet或生成HTML/PDF
- 跨平臺(tái)需求:使用Java內(nèi)置API,或調(diào)用系統(tǒng)命令
注意事項(xiàng):
- Java的打印API在不同操作系統(tǒng)上可能有差異
- 處理大圖片時(shí)注意內(nèi)存使用
- 生產(chǎn)環(huán)境中應(yīng)添加完善的錯(cuò)誤處理
- 考慮使用異步打印避免阻塞主線程
- 注意字體和編碼問(wèn)題(特別是中文)
以上就是Java調(diào)用打印機(jī)打印圖片和文本的多種方法的詳細(xì)內(nèi)容,更多關(guān)于Java打印機(jī)打印圖片和文本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java隨機(jī)數(shù)生產(chǎn)算法實(shí)例
下面小編就為大家?guī)?lái)一篇java隨機(jī)數(shù)生產(chǎn)算法實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
SpringBoot項(xiàng)目yml配置文件不自動(dòng)提示解決方案
這篇文章主要介紹了SpringBoot項(xiàng)目配置文件.yaml/.yml文件編寫(xiě)時(shí)沒(méi)有自動(dòng)提示的解決方案,文章通過(guò)圖文結(jié)合的方式給大家講解的非常詳細(xì),需要的朋友可以參考下2024-06-06
JDBC使用游標(biāo)實(shí)現(xiàn)分頁(yè)查詢的方法
這篇文章主要介紹了JDBC使用游標(biāo)實(shí)現(xiàn)分頁(yè)查詢的方法,實(shí)例分析了jdbc查詢過(guò)程中游標(biāo)的使用及查詢分頁(yè)相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-08-08
為zookeeper配置相應(yīng)的acl權(quán)限
這篇文章主要介紹了為zookeeper配置相應(yīng)的acl權(quán)限的相關(guān)實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-09-09
JAVA中Spring Security示例及常見(jiàn)問(wèn)題
文章概述Spring Security OAuth2與JWT模塊的版本兼容性及遷移建議,強(qiáng)調(diào)2.5.x支持JDK8但已棄用,推薦新項(xiàng)目使用SpringAuthorizationServer(Spring Boot3.x+),并指出依賴沖突、配置示例及密鑰安全注意事項(xiàng),感興趣的朋友一起看看吧2025-07-07

