上一篇中,我们已经通过iText生成了共打印的pdf文档,如果没有特别的要求,利用浏览器的pdf插件来预览和打印已经能供满足我们Web应用在浏览器端实现票据套打的要求了。但在我们的项目中,客户要求一次操作之后连续进行打印,即使用不同的数据填充模板,连续套打上百张的票据。
当时考虑的实现方式有两种:
- 生成一个多页的pdf文档,还是利用浏览器的pdf插件来进行打印
- 生成多个pdf文档,使用applet利用java print service来进行浏览器端的连续打印
最终我们选择了第二种方案,好处是浏览器不用打开新的tab来显示pdf文档,用户的注意力可以始终停留在同一页面。此外打印选项可以直接显示在页面中,比较直观。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFPrintPage;
public class PDFPrintApplet extends JApplet implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 6293078385198700265L;
private PrintService[] services;
private boolean degugFlg = true;
private PrinterJob pjob = PrinterJob.getPrinterJob();
private JComboBox printerList;
private JButton printBtn;
public void init() {
// 创建applet的GUI,由event dispatching thread运行
try {
SwingUtilities.invokeAndWait(new Runnable() {
pu