添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
谦逊的小熊猫  ·  屏蔽 ...·  4 月前    · 
个性的树叶  ·  ffmpeg ...·  1 年前    · 
独立的灭火器  ·  overflow:auto ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

Currently retrieving the default printer installed on my machine for printing. I want to be able to pick which printer the documents go to. What is the best method of doing this ?

Code:

 PrintService[] services =
                PrintServiceLookup.lookupPrintServices(psInFormat, null);
        System.out.println("Printer Selected " + services[Printerinx]);
        //PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
        DocFlavor[] docFalvor = services[Printerinx].getSupportedDocFlavors();
        for (int i = 0; i < docFalvor.length; i++) {
            System.out.println(docFalvor[i].getMimeType());

The PrintServiceLookup.lookupPrintService() method provides a way to lookup a printer by name. Prepare a HashAttributeSet with a PrinterName attribute object and pass it to the lookup method.

Use code like below:

AttributeSet aset = new HashAttributeSet();
aset.add(new PrinterName("MyPrinter", null));
PrintService[] pservices = 
    PrintServiceLookup.lookupPrintServices(null, aset);

Works on Linux with CUPS.

Create the PrintUtility class below, import it and try calling PrintUtility.findPrintService("name_of_my_printer"); if you know your printer name; if you don't know what printers you have access to, call PrintUtility.getPrinterServiceNameList(); for a List containing all viable registered printer names.

Alternately see my answer to this SO question for more details:

package com.stackoverflow.print;
import java.awt.print.PrinterJob;
import javax.print.PrintService;
import java.util.List;
import java.util.ArrayList;
public final class PrintUtility {
     * Retrieve a Print Service with a name containing the specified PrinterName; will return null if not found.
     * @return
    public static PrintService findPrintService(String printerName) {
        printerName = printerName.toLowerCase();
        PrintService service = null;
        // Get array of all print services
        PrintService[] services = PrinterJob.lookupPrintServices();
        // Retrieve a print service from the array
        for (int index = 0; service == null && index < services.length; index++) {
            if (services[index].getName().toLowerCase().indexOf(printerName) >= 0) {
                service = services[index];
        // Return the print service
        return service;
     * Retrieves a List of Printer Service Names.
     * @return List
    public static List<String> getPrinterServiceNameList() {
        // get list of all print services
        PrintService[] services = PrinterJob.lookupPrintServices();
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < services.length; i++) {
            list.add(services[i].getName());
        return list;
     * Utility class; no construction!
     private PrintUtility() {}
                yeah, your answer is correct! But what if the printer name is using '\\name of the printer' using that notion. Is it can be used ? or should we remove the double slash more as escaped character or something else?
– gumuruh
                Oct 30, 2021 at 0:50
                @gumuruh The printer should be referenced as "\\name of the printer", however if you providing this value to your application as String data from a configuration file, double-check whether the "\\" needs to be properly escaped as "\\\\".  I currently have an application that references a printer in this same fashion and it works fine.  Make sure the value is used exactly as it appears in  the output from getPrinterServiceNameList() ; print out your String variable to log before you use it to ensure it is identical.
– JoshDM
                Nov 2, 2021 at 2:56
DocFlavor fl= null;
PrintService printService[]= PrintServiceLookup.lookupPrintServices(fl,null); 
for(i=0;i<printService.length;i++)
    System.out.println(printService[i]);
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.