These two days in the study of Java Call printer print PDF file method, learned a lot of things, especially to record.
On the Java print Web The most and also Java-Orthodox printing method is to use Printservice, a set of standard printed code such as the following:
public class Printdemo {public static void main (string[] args) {JFileChooser filechooser = new JFileChooser ();//create print job in T state = Filechooser.showopendialog (null), if (state = = jfilechooser.approve_option) {File File = Filechooser.getselectedfile (); Gets the selected file//Build Print Request Property Set Hashprintrequestattributeset Pras = new Hashprintrequestattributeset ();//sets the print format, because the type is not determined. So choose autosensedocflavor Flavor = Docflavor.input_stream. autosense;//Find all available Print Services Printservice printservice[] = printservicelookup.lookupprintservices (flavor, Pras);// Locate the default print service Printservice Defaultservice = Printservicelookup.lookupdefaultprintservice ();//Display the Print dialog box Printservice Service = Serviceui.printdialog (null, $, 200,printservice, Defaultservice, Flavor, Pras); if (service! = null) {try {DOCP Rintjob job = Service.createprintjob (); Create a print job FileInputStream fis = new FileInputStream (file); Construct the file stream to be printed docattributeset das = new Hashdocattributeset ();D oc Doc = new Simpledoc (FIS, Flavor, das); Job.print (Doc, Pras) ;} catch (Exception E{E.printstacktrace ();}}}}}
But after trying to find that the PDF file is not printed in PDF format, but print out garbled (that is, the file binary code)
The initial conjecture is that the printer is not recognized. So the above Docflavor changed to Docflavor.input_stream. PDF;
Then printservice[] will be null, why? Because the Lookupdefaultprintservice () method only returns printers that support Docflavor ~
If the printer is not filtered by Docflavor. While printing directly. Will error: Invalid flavor, that is, does not support the type ~
In fact, we look at Docflavor. It is actually the content-type of the data stream sent to the printer, similar to the web, which is not supported by the Content-type. Then it's easier to understand.
The explanations later found on the Internet are:
The Java Print Service API natively supports printing, but it does not have the ability to interpret PDF files, which means that PDF files can be printed with the standard Java Print API, but the printers used must support the PDF printing standard, i.e. the printer supports post Script standard, and such printers are often expensive, and inexpensive printers circulating on the market today (using host-based drivers) are not supported
What about that? Don't we have a way to print a PDF file from a Java program? Whether or not, at least to try it ~
There is no particularly good way to find a solution online.
Probably collected several kinds of:
1, the more lazy method, the plug-in program to achieve printing, the most typical is Adobe Reader
2, using Pdfrenderer and other third-party libraries to convert the PDF file into a picture, then you can call Printservice to print
Let's say the first way.
First, you have to install Adobe Reader on your computer and call Adobe Reader to print a command that relies on acrord32 .
We know that in Java to invoke the command line requires a runtime object, the detailed code such as the following:
public static Boolean printpdf (String pdfpath) {try{runtime.getruntime (). EXEC ("cmd.exe/c start acrord32/p/h" + Pdfpath) ; return true;} catch (Exception e) {e.printstacktrace (); return false;}}
The Acrord32.exe method of Adobe Reader is called here to describe the parameters of this command.
Acrord32.exe filename-run Adobe Reader, and browse PDF
Other supported references are:
acrord32.exe/p filename-run Adobe Reader and print a PDF file
acrord32.exe/t path PrinterName drivername portname
Initialize Adobe Reader without ejecting the Print dialog box. Then end printing
The four number of parameters required for the/t command is
Path-Print file paths
PrinterName-Printer Name
drivername-Printer driver name
PortName-Printer Port
Other references:
/n open a new Adobe Reader, although Adobe Reader is turned on (silent printing is not necessary)
/s Open an Adobe reader does not open splash screen
/o open an Adobe reader without opening the Open File dialog box
/h to minimize the opening of an Adobe Reader (silent print usage)
About the two days to study the Java Print PDF method record