使用java打印pdf文件

使用java打印pdf文件,java,pdf,printing,Java,Pdf,Printing,我想用java打印文档,但是程序成功了,但是我的打印机没有打印任何东西。为什么会这样?你有什么解决办法吗?如果我的打印机不支持pdf格式,有没有办法打印pdf文件甚至docx文件 package useprintingserviceinjava; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import javax.print.Doc; impor

我想用java打印文档,但是程序成功了,但是我的打印机没有打印任何东西。为什么会这样?你有什么解决办法吗?如果我的打印机不支持pdf格式,有没有办法打印pdf文件甚至docx文件

package useprintingserviceinjava;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.event.PrintJobAdapter;
import javax.print.event.PrintJobEvent;
public class UsePrintingServiceInJava {

    private static boolean jobRunning = true;

    public static void main(String[] args) throws Exception {


  InputStream is;
   is = new BufferedInputStream(new FileInputStream("PAPER_SENSOR.pdf"));

  DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;

  PrintService service = PrintServiceLookup.lookupDefaultPrintService();

  DocPrintJob printJob = service.createPrintJob();

  printJob.addPrintJobListener(new JobCompleteMonitor());

  Doc doc = new SimpleDoc(is, DocFlavor.INPUT_STREAM.AUTOSENSE, null);

  printJob.print(doc, null);

  while (jobRunning) {
        Thread.sleep(1000);
  }

  System.out.println("Exiting app");

  is.close();

    }

    private static class JobCompleteMonitor extends PrintJobAdapter {
        @Override
        public void printJobCompleted(PrintJobEvent jobEvent) {
            System.out.println("Job completed");
            jobRunning = false;
        }
    }

}
这是我研究过的代码,但仍然没有打印出来。以下是基于我的研究的另一个代码:

package javaapplication24;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;
public class HandlePrintJobEvents {

public static void main(String[] args) throws Exception {

        // create a PDF doc flavor
        try ( // Open the image file
                InputStream is = new BufferedInputStream(new FileInputStream("C:\\Users\\JUSTINE\\Documents\\thesis document\\PAPER_SENSOR.pdf"))) {
            // create a PDF doc flavor

            DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;

            // Locate the default print service for this environment.

            PrintService service = PrintServiceLookup.lookupDefaultPrintService();

            // Create and return a PrintJob capable of handling data from

            // any of the supported document flavors.

            DocPrintJob printJob = service.createPrintJob();

            // register a listener to get notified when the job is complete

            printJob.addPrintJobListener(new PrintJobMonitor());

            // Construct a SimpleDoc with the specified

            // print data, doc flavor and doc attribute set.

            Doc doc = new SimpleDoc(is, DocFlavor.INPUT_STREAM.AUTOSENSE, null);

            // Print a document with the specified job attributes.

            printJob.print(doc, null);
        }

}

private static class PrintJobMonitor implements PrintJobListener {

    @Override
    public void printDataTransferCompleted(PrintJobEvent pje) {
        // Called to notify the client that data has been successfully
        // transferred to the print service, and the client may free
        // local resources allocated for that data.
    }

    @Override
    public void printJobCanceled(PrintJobEvent pje) {
        // Called to notify the client that the job was canceled
        // by a user or a program.
    }

    @Override
    public void printJobCompleted(PrintJobEvent pje) {
        // Called to notify the client that the job completed successfully.
    }

    @Override
    public void printJobFailed(PrintJobEvent pje) {
        // Called to notify the client that the job failed to complete
        // successfully and will have to be resubmitted.
    }

    @Override
    public void printJobNoMoreEvents(PrintJobEvent pje) {
        // Called to notify the client that no more events will be delivered.
    }

    @Override
    public void printJobRequiresAttention(PrintJobEvent pje) {
        // Called to notify the client that an error has occurred that the
        // user might be able to fix.
    }

}
}


谢谢:)*我已经试过2台打印机,但仍然无法打印。

我刚刚在我的位置检查了您的代码。我无法打印,因为我周围没有打印机,但是,我可以在不实际打印的情况下向打印机队列添加一些内容(它只是开始无限搜索打印机)

特别是因为您说您得到了异常
sun.print.printJobValveException
,所以您的打印机确实不支持PDF打印。要验证这种情况,请尝试以下操作:

    PrintService service = PrintServiceLookup.lookupDefaultPrintService();
    int count = 0;
    for (DocFlavor docFlavor : service.getSupportedDocFlavors()) {
        if (docFlavor.toString().contains("pdf")) {
            count++;
        }
    }
    if (count == 0) {
        System.err.println("PDF not supported by printer: " + service.getName());
        System.exit(1);
    } else {
        System.out.println("PDF is supported by printer: " + service.getName());
    }
编辑:

我用的是兄弟DCP-J552DW。下面的代码对我来说非常适合,除了一些页边距(当然可以调整):


打印机没有立即响应,设置连接花费了大约20秒。

您使用的是默认打印机。尝试并查看是否通过添加以下内容进行设置:
System.out.println(“默认打印机:”+PrintServiceLookup.lookupDefaultPrintService().getName())默认打印机:作为输出的Canon iP2700系列。添加
PrintRequestAttributeSet参数=新的HashPrintRequestAttributeSet();参数添加(新副本(1))帮助?这将设置
SimpleDoc
(因此将
null
替换为
params
)。线程“main”中的异常java.lang.ClassCastException:javax.print.attribute.HashPrintRequestAttributeSet无法在useprintingserviceinjava.useprintingserviceinjava.main处转换为javax.print.attribute.DocAttributeSet这是发生的错误。很抱歉,我的错误。我应该要求您保持
SimpleDoc
的参数参数不变,但将
print
方法的参数参数更改为
params
yes。打印机不支持PDF:Canon iP2700系列:(您对如何打印pdf文件或其他文件格式有何想法?TIFF可能是受支持的(检查方式与我检查pdf的方式相同).PDF很容易转换为TIFF,因此这不是问题。您现在的代码,根据我在您问题下方的评论进行编辑,将起作用。请确保首先清空打印队列。另一种可能是您的驱动程序已过时。请从您使用的打印机下载最新版本。顺便说一句,谢谢帮助:)它确实是“java文档”,“后台打印”取决于打印作业的实际状态。当需要查找打印机时,可能类似于“搜索打印机”,而当您连接到打印机时,可能是“正在连接”之类。
public static void main(String[] args) throws IOException {
    FileInputStream in = new FileInputStream("test.pdf");
    Doc doc = new SimpleDoc(in, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
    PrintService service = PrintServiceLookup.lookupDefaultPrintService();

    try {
        service.createPrintJob().print(doc, null);
    } catch (PrintException e) {
        e.printStackTrace();
    }
}