精华内容
下载资源
问答
  • 通过后台Servlet打印jsp页面

    千次阅读 2018-03-01 09:59:15
    通过后台打印jsp画面的Servlet,通过后台访问jsp画面得到相应的画面html,然后转化为pdf,输出到打印机<p>通过ajax post,url为http://localhost/printJsp.do?jspName=FMBDRPDEMO1.jsp<p/&...

    通过后台打印jsp画面的Servlet,通过后台访问jsp画面得到相应的画面html,然后转化为pdf,输出到打印机

    <p>通过ajax post,url为http://localhost/printJsp.do?jspName=FMBDRPDEMO1.jsp<p/>

    web.xml:

    <servlet>
            <servlet-name>printJsp</servlet-name>
            <servlet-class>com.baosight.wms.common.beans.ServletPrintJsp</servlet-class>

        </servlet>

    <servlet-mapping>
            <servlet-name>printJsp</servlet-name>
            <url-pattern>/printJsp.do</url-pattern>
        </servlet-mapping>

    public class ServletPrintJsp extends HttpServlet{



    private static final long serialVersionUID = 1L;
    private static final Logger log = LoggerFactory.getLogger(ServletPrintJsp.class);


    @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }

    @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
            response.setHeader("content-type", "text/html;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            
            //获取参数
            String printReportId = request.getParameter(BM2PReportConstants.PARA_PRINT_REPORT_ID);//打印报表ID
            String keyword = request.getParameter(BM2PReportConstants.PARA_KEYWORD);//关键字
            String formEname = request.getParameter(BM2PReportConstants.PARA_FORM_ENAME);//调用画面英文名
            String buttonEname = request.getParameter(BM2PReportConstants.PARA_BUTTON_ENAME);//调用按钮英文名
            
            //根据打印报表ID查询对应的报表画面和打印机
            Tfmbdc0 printReportConfig = FMManagerFactory.getMgrPrintReportConfig().getPrintReportConfigByUI(printReportId);
            String reportFormEname = printReportConfig.getReportFormEname();
            String printerName = printReportConfig.getPrinterName();
            
            //通过后台访问的url地址
            String url = MessageFormat.format("/DispatchAction.do?efFormEname={0}&printReportId={1}&keyword={2}&previewFlag=0", reportFormEname, printReportId, keyword);
            
            final ByteArrayOutputStream os =new ByteArrayOutputStream();
            final ServletOutputStream stream =new ServletOutputStream() {
                public boolean isReady() {
                    return false;
                }
                public void setWriteListener(WriteListener writeListener) {
                }
                public void write(byte[] data, int offset, int length){
                    os.write(data, offset, length);
                }
                @Override
                public void write(int b) throws IOException {
                    os.write(b);
                }
            };


            final PrintWriter pw =new PrintWriter(new OutputStreamWriter(os,  "utf-8"));//保存html中文乱码
            HttpServletResponse rep =new HttpServletResponseWrapper(response){
                public ServletOutputStream getOutputStream(){
                    return stream;
                }
                public PrintWriter getWriter(){
                    return pw;
                }
            };
            rep.setHeader("content-type", "text/html;charset=UTF-8");
            rep.setCharacterEncoding("UTF-8");
            
            ServletContext sc = getServletContext();
            RequestDispatcher rd = sc.getRequestDispatcher(url);
            //include 最后的主导权仍保留在本servlet
            rd.include(request, rep);
            
            //获取当前服务器部署目录的物理路径
            String currentPath = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
            currentPath = new File(new File(currentPath).getParent()).getParent();
            
            String uuid = BM2PStringUtil.getUUID();
            // 这是生成的html文件名, uuid.html  (根目录下)
            String htmlName =currentPath + "//" +uuid + ".html";
            
            pw.flush();
            FileOutputStream fos =new FileOutputStream(htmlName);//把jsp输出的内容写到xxx.html
            os.writeTo(fos);
            fos.close();
            //生成的HTML文件
            File file = new File(currentPath + "//" +uuid + ".html");
            System.out.println("生成HTML文件:" + file.getAbsolutePath());


            //生成的pdf文件路径,uuid.pdf(根目录下)
            String pdfPath = currentPath + "\\" + uuid + ".pdf";
            Html2PdfUtil.convertHtmlToPdfCmd(file.getAbsolutePath(), pdfPath );
            System.out.println("生成PDF文件:" + pdfPath);


            //读取生成好的pdf文件,形成字节流
            //pdf file ->byte[]
            File pdfFile = new File(pdfPath);
            FileInputStream fis = null;
            ByteArrayOutputStream bos = null;
            byte[]  pdfBytes = null;
            try {
                fis = new FileInputStream(pdfFile);
                bos = new ByteArrayOutputStream();
                byte[] b = new byte[1024];
                int n;
                while ((n = fis.read(b)) != -1) {
                    bos.write(b, 0, n);
                }
                if(bos!=null) {
                    pdfBytes = bos.toByteArray();
                }
            } catch (Exception e1) {
            log.error(e1);
            }finally {
                if(bos!=null) {
                    try {
                        bos.close();
                    } catch (IOException e) {
                    log.error(e);
                    }
                }
                if(fis!=null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                    log.error(e);
                    }
                }
            }
            //调用打印机服务
            System.out.println("目标打印机名称:" + printerName);
            ServerPrintUtil.startPrintPdfThread(pdfBytes, printerName);        
            
            //记录打印履历及数据
            Tfmbdc1 his = new Tfmbdc1();
            his.setPrintReportId(printReportId);
            his.setKeyword(keyword);
            his.setFormEname(formEname);
            his.setButtonEname(buttonEname);
            //获取返回的打印ID
            his.setPrintId(request.getAttribute(BM2PReportConstants.COL_PRINT_ID).toString());
            his.setOperaId(BM2PStringUtil.getUUID());
            
            Tfmbdc2 data = new Tfmbdc2();
            //获取返回的业务数据json
            data.setDataJson(request.getAttribute(BM2PReportConstants.COL_DATA_JSON).toString());
            FMManagerFactory.getMgrPrintReportHistory().addPrintReportHistory(his, data);
        }

    }

    public class ServerPrintThread implements Runnable {
    private static final Logger log = LoggerFactory.getLogger(ServerPrintThread.class);

    private byte[] buffer;
    private PrintFileType fileType;
    private String printerName;


    /**
    * 服务端打印线程
    * @param buffer 待打印的字节流
    * @param fileType 待打印的文件类型
    */
        public ServerPrintThread(byte[] buffer, PrintFileType fileType) {
            this.buffer = buffer;
            this.fileType = fileType;
            this.printerName = BM2PConstants.STRING_EMPTY;
        }
        
        /**
    * 服务端打印线程
    * @param buffer 待打印的字节流
    * @param fileType 待打印的文件类型
    * @param printerName 服务端配置的打印机名称
    */
        public ServerPrintThread(byte[] buffer, PrintFileType fileType, String printerName) {
            this.buffer = buffer;
            this.fileType = fileType;
            this.printerName = printerName;
        }


        @Override
        public void run() {
            try {
            if(this.fileType == PrintFileType.PDF){
            printPDF(this.buffer, this.printerName);
            }
            } catch (PlatException e) {
            log.error(e);
                //e.printStackTrace();
            }
        }
        
        /**
         * 打印PDF
         * @param buffer 待打印的pdf文件字节流
         * @param printerName 服务端配置的打印机名称
         * @throws Exception
         */
        private void printPDF(byte[] buffer, String printerName) throws PlatException{
        try{
            InputStream stream = new ByteArrayInputStream(buffer);

            PDDocument document = PDDocument.load(stream);
            System.out.println("doc"+document.getDocumentInformation());
            PrinterJob job = PrinterJob.getPrinterJob();
            //job.setPageable(new PDFPageable(document, Orientation.LANDSCAPE, true));

    //        PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
            //attr.add()

            // define custom paper
            Paper paper = new Paper();
            /**
             * DPI:72px/inch,A4 size(598 * 842);
             DPI:96px/inch,A4 size(794* 1123);
             DPI:120px/inch,A4 size(1487* 2105);
             DPI:150px/inch,A4 size(1240* 1754);
             DPI:300px/inch,A4 size(2480* 3508);
             */
            //paper.setSize(3508, 2480);
            //paper.setImageableArea(20, 0, paper.getWidth()-20, paper.getHeight()); // no margins
            //目前 横板无法居中,且较小
            //        PDPage page = new PDPage(PDRectangle.A4);
            //        page.setRotation(90);
            //        document.addPage(page);

            // custom page format
            PageFormat pageFormat = new PageFormat();
            pageFormat.setPaper(paper);
            //pageFormat.setOrientation(PageFormat.LANDSCAPE);//landscape
            //pageFormat.

            // override the page format
            Book book = new Book();
            // append all pages
            book.append(new PDFPrintable(document, Scaling.SCALE_TO_FIT),//, true, 300.0F, true),
                    pageFormat, document.getNumberOfPages());
            job.setPageable(book);

            //如果设置了打印机名称,则按照打印机名称查询打印服务并使用
            //否则走默认打印机
            if(StringUtils.hasContent(printerName)){
            PrintService printService = this.getPrintService(printerName);
            if(printService != null){
            System.out.println("服务器存在打印机名称"+printerName);
            job.setPrintService(printService);
            }
            }
            
            //if(job.printDialog()) {//弹出打印机属性窗口
            job.print();
            //}

            document.close();
        }
        catch(Exception e){
        throw new PlatException(e.getMessage());
        }
        }
        
        
        /**
         * 根据打印机名称获取打印服务
         * @param printerName 打印机名称
         * @return 打印服务
         */
        private PrintService getPrintService(String printerName) {
            PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
            for (PrintService printService : printServices) {
                if (printService.getName().trim().equals(printerName)) {
                    return printService;
                }
            }
            return null;
        }
        
        /**
         * 后台打印支持的文件类型
         * 
         *
         */
        public enum PrintFileType{
        PDF
        }
    }

    //HTML转换PDF工具类(需要在客户端安装转换工具:wkhtmltox-0.12.4_msvc2015-win64:默认路径:c:/wkhtmltopdf)

    public class Html2PdfUtil {


    /**
    * 将html转成PDF
    * <p>该方法转出来的pdf格式上有瑕疵,暂未使用<p/>
    * @param inputHTMLFileName
    * @param outputPDFFile
    * @throws Exception
    */
    public static void convertHtmlToPdf(String inputHTMLFileName, String outputPDFFile) throws Exception {
    FileOutputStream fos = new FileOutputStream(outputPDFFile);
    PD4ML pd4ml = new PD4ML();
    pd4ml.setPageInsets(new Insets(20, 10, 10, 10));
    pd4ml.setHtmlWidth(950);
    pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
    pd4ml.useTTF("java:fonts", true);
    pd4ml.setDefaultTTFs("KaiTi_GB2312", "KaiTi_GB2312", "KaiTi_GB2312");
    pd4ml.enableDebugInfo();
    pd4ml.render("file:" + inputHTMLFileName, fos);
    }

    /**
    * 将html转成PDF
    * @param srcHtmlPath html路径
    * @param destPdfPath pdf生成路径
    */
    public static void convertHtmlToPdfCmd(String srcHtmlPath, String destPdfPath) {
    try {
    //wkhtmltopdf软件安装目录/bin/wkhtmltopdf.exe  完整路径
    //软件下载地址  https://wkhtmltopdf.org/downloads.html
    //服务器默认路径  "C:\\wkhtmltopdf\\bin\\wkhtmltopdf.exe"   在业务参数管理中配置

    //这里有点问题,理论上不应该引用FM相关方法,但这个安装路径也没有地方配置,借用业务参数配置
    IBizPara paraMgr = FMManagerFactory.getMgrBizPara();
    String configPath = paraMgr.getBizParaDataByModuleIdAndParaId(BizModuleId.FM, BizParaId.WKHTMLTOPDF_INSTALLATION_PATH);
    if (!StringUtils.hasContent(configPath)) {
    throw new PlatException("未配置wkhtmltopdf软件路径");
    }
    String command = configPath;
    command += "  --javascript-delay  2000 ";
    command +=  " " + srcHtmlPath + " " + destPdfPath;
    System.out.println("command:" + command);
    final Process p = Runtime.getRuntime().exec(command);
    final StringBuilder output = new StringBuilder();
    new Thread(new Runnable() {
    @Override
    public void run() {
    try {
    try {
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    String line = br.readLine();
    while (line != null) {
    if (line.trim().length() > 0) {
    output.append(line).append("\n");
    }
    line = br.readLine();
    }
    } finally {
    if (p.getErrorStream() != null) {
    p.getErrorStream().close();
    }
    }
    } catch (IOException ex) {
    ex.printStackTrace(System.err);
    }
    }
    }).start();


    new Thread(new Runnable() {
    @Override
    public void run() {
    try {
    try {
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = br.readLine();
    while (line != null) {
    if (line.trim().length() > 0) {
    output.append(line).append("\n");
    }
    line = br.readLine();
    }
    } finally {
    if (p.getInputStream() != null) {
    p.getInputStream().close();
    }
    }
    } catch (IOException ex) {
    ex.printStackTrace(System.err);
    }
    }
    }).start();
    p.waitFor();
    String result = command + "\n" + output.toString() + output.toString();
    System.out.print(result);//wkhtmltopdf程序运行时的软件输出,保存pdf的过程,可以选择不打印
    } catch (Exception e) {
    throw new PlatException(e.getMessage());
    }
    }

    }



    /**
     * 通过服务端打印工具类
     * 
     *
     */
    public class ServerPrintUtil {

    /**
    * 启动打印PDF
    * <p>不指定打印机,则为默认打印机<p/>
    * @param printByte 待打印的PDF文件字节流
    */
    public static void startPrintPdfThread(byte[] printByte){
    ServerPrintThread printThread = new ServerPrintThread(printByte, PrintFileType.PDF);
    Thread thread = new Thread(printThread);
            thread.start();
    }


    /**
    * 启动打印PDF
    * @param printByte 待打印的PDF文件字节流
    * @param printerName 服务端配置的打印机名称
    */
    public static void startPrintPdfThread(byte[] printByte, String printerName){
    ServerPrintThread printThread = new ServerPrintThread(printByte, PrintFileType.PDF, printerName);
    Thread thread = new Thread(printThread);
            thread.start();
    }
    }



    展开全文
  • 【利用WebBrowser彻底解决Web打印问题(包括后台打印) 】利用WebBrowser彻底解决Web打印问题(包括后台打印)BS架构下的打印大家是怎么解决的呢,我最近作了一个项目正好负责这一块,不仅要求打印页面的特定部分,...
  • 文章目录前端动态打印后台日志 前端动态打印后台日志

    前端动态打印后台日志

    websocket获取后台日志

    java WebSocket实现Java后台消息推送

    <div id="pageFormContent"
      style="margin-top: 10px; max-height: 600px;height: 600px;overflow-y: auto; border-style: solid;background: #304156; border: 1px solid #2e2e2e; color:#dbdbdb;">
      <div id="spider-message" class="profile_title" style="padding-left: 5px" v-html="hello"></div>
    </div>
    
    const ws = new WebSocket('ws://' + url + ':8082/websocket/log')
    ws.onopen = function() {
      // ws.send("发送数据")
      console.log('初始化完成!')
    }
    const that = this
    ws.onmessage = function(evt) {
      console.log(evt.data)
      if (evt.data.indexOf('升级完成') > -1) {
        that.download()
      }
      that.hello += '<p>' + evt.data + '</p>'
      const $dom = document.getElementById('pageFormContent')
      $dom.scrollTop = $dom.scrollHeight
    }
    ws.onclose = function() {
      // 关闭 websocket
      console.log('连接已关闭...')
    }
    

    ajax定时发送请求获取日志

    window.setTimeout(function () {},1000);
    

    iframe动态打印parent.postMessage

    postmessage解决iframe跨域嵌套,调用父页面方法【跨页面通信】

    <style type="text/css">
    .pageFormContent{
    	margin-top: 10px; 
    	max-height: 300px;
    	height: 300px;
    	overflow-y: auto; 
    	border-style: solid;
    	background: #1e1e1e; 
    	border: 1px solid #2e2e2e; 
    	color:#dbdbdb;
    }
    
    </style>
    
    <div style="display: flex; ">
       <form id="upgradeForm" action="/dbscript/upgrade" type="post" target="spiderFrame">
           <button type="button" id="upgrade" style="width: 100px;font-size: 16px">打印日志</button>
       </form>
    </div>
    <div class="pageFormContent" id="pageFormContent" >
    	<div id="spider-message" class="profile_title"></div>
    </div>
    
    <iframe src="" id="spiderFrame" name="spiderFrame" style="display: none"></iframe>
    
    <script>
    <!--接收从iframe子页面发送过来的信息-->
    window.addEventListener('message', function(e) {
        if(e.data && ((typeof e.data) == 'string')) {
            printMessage(e.data);
        }
    });
    function printMessage(message){
        if(message == 'shutdown') {
            vue.download()
            return;
        }
        $("#spider-message").append("<p>" + message + "</p>");
        var $dom = document.getElementById("pageFormContent");
        $dom.scrollTop = $dom.scrollHeight;
    }
    $("#upgrade").click(function () {
        var $form = $("form#upgradeForm");
        $form.submit();
        $("#spider-message").append("<p> 程序正在初始化...</p>");
    });
    </script>
    
    @RequestMapping("/upgrade")
    public void upgrade(HttpServletResponse response) {
    	response.setCharacterEncoding("UTF-8");
    	String msg = "日志。。。。";
    	msg.replace("\n", "<br/>");
    	PrintWriter writer = response.getWriter();
    	writer.print(String.format("<script>parent.postMessage(\"%s\", '*');</script>", msg));
        writer.flush();
    }
    
    展开全文
  • 基于c-lodop后台打印

    2020-02-20 16:17:47
    现在由于需要实现一些业务,频繁单次打印单张条码,过去频繁的打印,如果还是按浏览器的默认打印方式的话,会不停的弹窗提示确认打印的按钮,这显然不符合业务需求,费时费力。 经查阅资料,好像有两种方式可行,第...

    现在由于需要实现一些业务,频繁单次打印单张条码,过去频繁的打印,如果还是按浏览器的默认打印方式的话,会不停的弹窗提示确认打印的按钮,这显然不符合业务需求,费时费力。

    经查阅资料,好像有两种方式可行,第一种是安装旧版的火狐浏览器(56以下的版本),然后需要安装一个拓展插件(jsprintsetup),不过好像需要手动安装,官网已经不再支持该插件,所以不建议使用该方法打印。第二种方式则是下载软件,然后用JS调用打印机的方式进行后台打印,具体操作流程如下:

    1.下载c-lodop并安装,下载地址:http://www.c-lodop.com/download.html,最好下载云打印C-Lodop扩展版。解压安装运行即可。

    2.编写demo测试打印,源码如下:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <!-- saved from url=(0181)http://tldz.irobotbox.com/IrobotBox/Delivery/FBABatchSKU_Print.aspx?OrderCode=2020020314087172421&OrderSourceCountry=%E5%BE%B7%E5%9B%BD&FulfillmentNetworkSKU=X0015555RP&ProductNum=1 -->
    <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>
    
    </title>
    
    <body style="padding:0; margin:0; padding-left:20px;" onload="print_pages()">
    <!--startprint--> 
    <div id="div01">
    
    </div>    
    
    </body>
    <script language="javascript" src="/static/toloog/js/print/lodopFuncs.js"></script>
    <script language="javascript" type="text/javascript">
        var LODOP; //声明为全局变量
        var price_tds = document.getElementsByClassName('price');
        for(var i=0;i<price_tds.length;i++) {
            var _price = (i+1)*10;
            price_tds[i].innerHTML=_price;
        }
    
        // var btn = document.getElementById('print_btn');
    
        // btn.οnclick=function () {
        //     prn_preview1();
        // };
    
        function load_print() {
            CreateOnePage();
            LODOP.PRINT();
        }
    
        function printSet1() {
            CreateOnePage();
            LODOP.PRINT_SETUP();
        }
    
    
    
        function prn_preview1() {
            CreateOnePage();
            LODOP.SET_PREVIEW_WINDOW(1,0,0,0,0,"");
            LODOP.PREVIEW();
    //        LODOP.PREVIEW();
    //        LODOP.PRINT();
    //        LODOP.PRINT_SETUP();
        };
        function CreateOnePage(){
            LODOP=getLodop();
            LODOP.PRINT_INIT("");
            // LODOP.ADD_PRINT_BARCODE(0,0,200,100,"Code39","X001VMCE83");
            LODOP.ADD_PRINT_BARCODE(10,25,270,60,"128B","条码值");//设置条码位置、宽高、字体、条码内容
            // LODOP.SET_PRINT_STYLEA(0,"FontSize",18);//设置上面这个条码下方的文字字体大小
            // LODOP.SET_PRINT_STYLEA(0,"Color","#FF0000");//设置当前条码以及条码下方字体的颜色
            // LODOP.SET_PRINT_STYLEA(0,"Angle",180);//设置旋转角度
            LODOP.SET_PRINT_STYLEA(0,"ShowBarText",0);//设置是否显示下方的文字
            // LODOP.SET_PRINT_STYLEA(0,"AlignJustify",2);//设置条码下方的文字相对于条码本身居中
            // LODOP.SET_PRINT_STYLEA(0,"AlignJustify",1);//设置条码下方的文字相对于条码本身居左
            // LODOP.SET_PRINT_STYLEA(0,"AlignJustify",3);//设置条码下方的文字相对于条码本身居右
            // LODOP.SET_PRINT_STYLEA(0,"GroundColor","#0080FF");//设置条码的背景色 
            LODOP.ADD_PRINT_TEXT(70,20,200,18,"文本");
            LODOP.SET_PRINT_STYLEA(0,"LineSpacing",0);
            LODOP.ADD_PRINT_TEXT(88,20,272,12,"文本");
            LODOP.SET_PRINT_STYLEA(0,"LineSpacing",0);
            LODOP.SET_PRINT_STYLEA(2,"FontSize",13);
            LODOP.SET_PRINT_STYLEA(2,"FontName","Consolas");
            // LODOP.SET_PRINT_STYLEA(2,"bold",1); //加粗
            LODOP.SET_PRINT_STYLEA(2,"LetterSpacing",1);
            LODOP.SET_PRINT_STYLEA(3,"FontSize",6);
            LODOP.SET_PRINT_STYLEA(3,"LetterSpacing",1);
            // LODOP.SET_PRINT_STYLEA(3,"bold",1); //加粗
            LODOP.SET_PRINT_STYLEA(3,"FontName","Consolas"); //设置字体
            LODOP.SET_PRINT_MODE("FULL_WIDTH_FOR_OVERFLOW",true);
            // LODOP.SET_PRINT_STYLEA(0,"TextFrame",2);
            LODOP.ADD_PRINT_TEXT(100,20,100,15,"文本");
            LODOP.SET_PRINT_STYLEA(0,"LineSpacing",0);
            LODOP.ADD_PRINT_TEXT(115,20,100,15,"文本");
            LODOP.SET_PRINT_STYLEA(0,"LineSpacing",0);
            LODOP.ADD_PRINT_TEXT(125,130,200,15,"文本");
            LODOP.SET_PRINT_STYLEA(0,"LineSpacing",0);
            LODOP.SET_PRINT_STYLEA(4,"FontSize",13);
            LODOP.SET_PRINT_STYLEA(4,"FontName","Consolas");
            // LODOP.SET_PRINT_STYLEA(4,"bold",1);
            LODOP.SET_PRINT_STYLEA(4,"LetterSpacing",1);
            LODOP.SET_PRINT_STYLEA(5,"FontSize",13);
            // LODOP.SET_PRINT_STYLEA(5,"bold",1);
            LODOP.SET_PRINT_STYLEA(5,"FontName","Consolas");
            LODOP.SET_PRINT_STYLEA(5,"LetterSpacing",1);
            LODOP.SET_PRINT_STYLEA(6,"FontSize",13);
            // LODOP.SET_PRINT_STYLEA(6,"bold",1);
            LODOP.SET_PRINT_STYLEA(6,"FontName","Consolas");
            LODOP.SET_PRINT_STYLEA(6,"LetterSpacing",1);
            // LODOP.SET_PRINT_STYLEA(6,"AlignJustify",3);
            LODOP.SET_PREVIEW_WINDOW(0,0,0,0,0,"");
        };
    
        // 获取打印机列表
        function getPrintNameList() {
    
            var printerCount = LODOP.GET_PRINTER_COUNT();
    
            // 只是在为了测试在双向绑定时可不可以赋值之后打印。
            for (var i = 0; i < printerCount; i++) {
                console.log(LODOP.GET_PRINTER_NAME(i))
            }
    
        }
        // 指定打印机
        function PreviewByPrinterName(strPrinterName) {
            CreateOnePage();
            if (LODOP.SET_PRINTER_INDEXA(strPrinterName))
                LODOP.PREVIEW();
        };
    
        // 设置打印机的打印张数
        function PrintMoreCopies(intCopies) {
            CreateOnePage();
            if (LODOP.SET_PRINT_COPIES(intCopies)) LODOP.PRINT();
            else  alert("设置打印份数失败!");
        };
    </script>
    
        <script language="javascript">
            function print_pages(){
                setTimeout("preview()","200");
            }
            function preview() {
                load_print(); // 直接打印
                // printSet1(); //打印预览
            } 
    </script> 
    </html>
    

    以上这种方式打印会在纸张的尾部有提示:本页由【试用版打印控件Lodop】输出

    lodopFuncs.js源码如下:

    /**
     * Created by mamimi on 2018/11/14.
     */
    var CreatedOKLodop7766 = null, CLodopIsLocal;
    
    //====判断是否需要 Web打印服务CLodop:===
    //===(不支持插件的浏览器版本需要用它)===
    function needCLodop() {
        try {
            var ua = navigator.userAgent;
            if (ua.match(/Windows\sPhone/i))
                return true;
            if (ua.match(/iPhone|iPod|iPad/i))
                return true;
            if (ua.match(/Android/i))
                return true;
            if (ua.match(/Edge\D?\d+/i))
                return true;
    
            var verTrident = ua.match(/Trident\D?\d+/i);
            var verIE = ua.match(/MSIE\D?\d+/i);
            var verOPR = ua.match(/OPR\D?\d+/i);
            var verFF = ua.match(/Firefox\D?\d+/i);
            var x64 = ua.match(/x64/i);
            if ((!verTrident) && (!verIE) && (x64))
                return true;
            else if (verFF) {
                verFF = verFF[0].match(/\d+/);
                if ((verFF[0] >= 41) || (x64))
                    return true;
            } else if (verOPR) {
                verOPR = verOPR[0].match(/\d+/);
                if (verOPR[0] >= 32)
                    return true;
            } else if ((!verTrident) && (!verIE)) {
                var verChrome = ua.match(/Chrome\D?\d+/i);
                if (verChrome) {
                    verChrome = verChrome[0].match(/\d+/);
                    if (verChrome[0] >= 41)
                        return true;
                }
            }
            return false;
        } catch (err) {
            return true;
        }
    }
    
    //====页面引用CLodop云打印必须的JS文件,用双端口(8000和18000)避免其中某个被占用:====
    if (needCLodop()) {
        var src1 = "http://localhost:8000/CLodopfuncs.js?priority=1";
        var src2 = "http://localhost:18000/CLodopfuncs.js?priority=0";
    
        var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
        var oscript = document.createElement("script");
        oscript.src = src1;
        head.insertBefore(oscript, head.firstChild);
        oscript = document.createElement("script");
        oscript.src = src2;
        head.insertBefore(oscript, head.firstChild);
        CLodopIsLocal = !!((src1 + src2).match(/\/\/localho|\/\/127.0.0./i));
    }
    
    //====获取LODOP对象的主过程:====
    function getLodop(oOBJECT, oEMBED) {
    
        var strHtmInstall = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop32.zip' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
        var strHtmUpdate = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop32.zip' target='_self'>执行升级</a>,升级后请重新进入。</font>";
        var strHtm64_Install = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop64.zip' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
        var strHtm64_Update = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop64.zip' target='_self'>执行升级</a>,升级后请重新进入。</font>";
        var strHtmFireFox = "<br><br><font color='#FF00FF'>(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</font>";
        var strHtmChrome = "<br><br><font color='#FF00FF'>(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</font>";
        var strCLodopInstall_1 = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='CLodop_Setup_for_Win32NT.zip' target='_self'>下载执行安装</a>";
        var strCLodopInstall_2 = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)";
        var strCLodopInstall_3 = ",成功后请刷新本页面。</font>";
        var strCLodopUpdate = "<br><font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='CLodop_Setup_for_Win32NT.zip' target='_self'>执行升级</a>,升级后请刷新页面。</font>";
        var LODOP;
        try {
            var ua = navigator.userAgent;
            var isIE = !!(ua.match(/MSIE/i)) || !!(ua.match(/Trident/i));
            if (needCLodop()) {
                try {
                    LODOP = getCLodop();
                } catch (err) {}
                if (!LODOP && document.readyState !== "complete") {
                    alert("网页还没下载完毕,请稍等一下再操作.");
                    return;
                }
                if (!LODOP) {
                    document.body.innerHTML = strCLodopInstall_1 + (CLodopIsLocal ? strCLodopInstall_2 : "") + strCLodopInstall_3 + document.body.innerHTML;
                    return;
                } else {
                    if (CLODOP.CVERSION < "3.0.6.0") {
                        document.body.innerHTML = strCLodopUpdate + document.body.innerHTML;
                    }
                    if (oEMBED && oEMBED.parentNode)
                        oEMBED.parentNode.removeChild(oEMBED);
                    if (oOBJECT && oOBJECT.parentNode)
                        oOBJECT.parentNode.removeChild(oOBJECT);
                }
            } else {
                var is64IE = isIE && !!(ua.match(/x64/i));
                //=====如果页面有Lodop就直接使用,没有则新建:==========
                if (oOBJECT || oEMBED) {
                    if (isIE)
                        LODOP = oOBJECT;
                    else
                        LODOP = oEMBED;
                } else if (!CreatedOKLodop7766) {
                    LODOP = document.createElement("object");
                    LODOP.setAttribute("width", 0);
                    LODOP.setAttribute("height", 0);
                    LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;");
                    if (isIE)
                        LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA");
                    else
                        LODOP.setAttribute("type", "application/x-print-lodop");
                    document.documentElement.appendChild(LODOP);
                    CreatedOKLodop7766 = LODOP;
                } else
                    LODOP = CreatedOKLodop7766;
                //=====Lodop插件未安装时提示下载地址:==========
                if ((!LODOP) || (!LODOP.VERSION)) {
                    if (ua.indexOf('Chrome') >= 0)
                        document.body.innerHTML = strHtmChrome + document.body.innerHTML;
                    if (ua.indexOf('Firefox') >= 0)
                        document.body.innerHTML = strHtmFireFox + document.body.innerHTML;
                    document.body.innerHTML = (is64IE ? strHtm64_Install : strHtmInstall) + document.body.innerHTML;
                    return LODOP;
                }
            }
            if (LODOP.VERSION < "6.2.2.4") {
                if (!needCLodop())
                    document.body.innerHTML = (is64IE ? strHtm64_Update : strHtmUpdate) + document.body.innerHTML;
                return LODOP;
            }
            //===如下空白位置适合调用统一功能(如注册语句、语言选择等):==
    
    
            LODOP.SET_LICENSES("","13528A153BAEE3A0254B9507DCDE2839","","");
            //=======================================================
            return LODOP;
        } catch (err) {
            alert("getLodop出错:" + err);
        }
    }
    
    
    展开全文
  • html页面实现生成数据调用打印机打印,通过后台传送json数据,前端js生成表格化样式,最后连接打印机即可
  • 我所在的开发的项目其实是一个维护工单系统的项目,其中包括报表功能前端使用的是...后端接收前端传递过来的数据进行打印报表功能(实际可以通过前端传递过来数据进入后台查询)下面我开始介绍具体报表打印pdf功能...

        我所在的开发的项目其实是一个维护工单系统的项目,其中包括报表功能前端使用的是echarts,其中有一个任务就是导出Echarts图,这里面不仅仅是echarts报表中的一张图,我这里呢介绍的是使用itextpdf和jfreechart来进行一个多报表数据的打印功能。

    后端接收前端传递过来的数据进行打印报表功能(实际可以通过前端传递过来数据进入后台查询)下面我开始介绍具体报表打印pdf功能

    一、引入pdf包和jfreechart包

    <!-- https://mvnrepository.com/artifact/jfree/jfreechart -->
    <dependency>
       <groupId>jfree</groupId>
       <artifactId>jfreechart</artifactId>
       <version>1.0.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
    <dependency>
       <groupId>com.itextpdf</groupId>
       <artifactId>itextpdf</artifactId>
       <version>5.0.6</version>
    </dependency>

    二、编写后台逻辑代码

    1、编写报表类:

    2、编写调用的Controller

    3、创建TestPdf类编写createDocument方法

    List代表传入的数据、titles 指pdf各列表标题、path项目目录地址、filename文件名、type 图表类型数组

    Pdf写数据流程是在createDocument方法中的

    图表打印

    5、创建jfreechart 类编写Jfreechart代码  这块需要查看

    jfreechart api 地址:

    https://www.yiibai.com/jfreechart/jfreechart_referenced_apis.html

    下面我列举其中写的一块代码

    下面代码中path:项目目录地址;list:报表中需要打印的数据;title:报表的标题;document :实质就是pdf插件文档类

    Document功能是jfreechart画出报表后生成图片写入document中

     

    6、这些方法写完后 我们可以在页面上编写一个按钮打印pdf  编写点击事件调用controller试一下吧

     

    以上根据

    jfreechart api 学习地址:  https://www.yiibai.com/jfreechart/jfreechart_referenced_apis.html

     itextpdf 学习地址:

    https://www.cnblogs.com/chenpi/p/5534595.html

    如果打印的报表为excel格式请直接使用poi打印

    地址: https://www.baidu.com/link?url=db8X10VJeaD_C7k2ZHe_2c0VLfV047MsGKGo4Pzge0I4zoHBfEyq_uVlFwVJ6KoL&wd=&eqid=8318de2d00001b4a000000035b503d7b

    上文是根据itextpdf和jfreechart所结合使用,对大家不知道帮助是否大如果对我编写文档有什么疑问的话,请在下方留言我会更完善我的博客

     

    展开全文
  • 有前端API、IconFont图标、分管管理、添加分管、分管列表、商品管理、分类列表、基本商品库、添加商品、基础库内容、表单含编辑器、常用列表、可新增的列表、页签切换Table、维护中页面、入库单打印模版、订单统计...
  • html转换pdf 页面抓取内容,分页进行处理,后台进行处理,功能效果不错
  •  通过js动态生成html页面并将该页面传送到后台转成pdf,再通过前台将pdf打印预览 先大约讲述一下具体实现过程 1、在js页面将你自己需要拼装好html页面通过ajax传到后台 2、通过itext将html页面转成pdf 3、js将pdf...
  • 后台打印(套打1)

    千次阅读 2009-01-15 15:24:00
    ASP实现精准打印组件 body {font-size:14px} input{border-color: #ffccff; border-style: solid; border-width: 0px 0px 1px} function doPrint(how){ if(typeof(jatoolsPrinter.page_div_prefix)==undef
  • 一、 背景介绍 最近研究 Jenkins,发现它的日志能动态输出到网页,十分不错, 本文就基于 SpringBoot 简单实现下如何把后台消息源源不断地打印网页上 二、 实现步骤2.1 在你的 SpringBoot 项目中引入 websocket...
  • html页面点餐模版,有前台点餐,后台查看订单,上传菜品等简单功能。
  • 领导分配了一个任务,利用c#连接打印机,打印一个html页面,对于一个Java本专业还不太熟练的我,之前从未接触过c#,挑战还是很大的。但是没办法,做呗!!!首先找一个写c#的工具呗,所以下载了vs2015,实现方法如下...
  • Html PDF 页面打印方案

    千次阅读 2016-10-31 16:34:55
    WEB 项目中要求高精度打印,直接用 Html 输出太难调整格式,用 Word 或 Excel 打印只能在 IE 中使用,在网页上显示和支持得比较好的就算是 PDF 格式了。 1、项目需求: (1) PDF 文件是根据后台 PDF 模板文件...
  • html 页面打印

    千次阅读 2017-09-28 11:05:29
    web页面打印 window.print() $('#dayin').click(function(){ $('#dayin').css('display','none') $('.classroom').css('display','none') $('.open').css('display','none') $('.open1').css('display','...
  • 根据后台数据打印出的结果, 根据后台数据渲染页面 html js代码 页面的显示
  • 的$().text()一样,我想像$().html()可以输出图片怎么实现?? 附代码截图和效果截图 ![图片说明](https://img-ask.csdn.net/upload/201811/02/1541154893_355412.jpg)![图片说明]...
  • QT调用打印机打印html网页及文件

    万次阅读 2015-11-07 11:07:30
    打印用到了 QPrinter, 所以要在.pro里加上 qtHaveModule(printsupport): QT += printsupport直接附上源码吧,当然也是根据网上一些前辈的经验代码和实际使用情况改进而来:#ifndef WIDGET_H #define WIDGET_
  • html导出pdf并上传到后台

    千次阅读 2019-09-03 10:03:51
    html代码示例: <div id="print"> 你要导出的html </div> js引入: <script type="text/javascript" src="../../../../public/js/html2canvas-0.4.1.js"></script> <script type=...
  • 后台返回完整html代码,前端展示

    千次阅读 2020-11-21 16:39:08
    后台返回完整html代码,前端展示 如图所示: 在Response里可以看到后台返回的是完整的html文件。 若想展示在iframe框架里,可直接把请求url赋值给iframe标签里的src,如下图所示: 展示效果:
  • doc.append("<html>\n"+ServletUtils.gwcHtmlHeader("GWC 重载") +"<body>\n" + ServletUtils.gwcHtmlLogoLink("../")); try { layerDispatcher.reInit(); String info = "配置重载, 从配置资源中读取 " + ...
  • html2canvas.js具体来说是一个脚本或者js插件, 该脚本允许您直接在用户浏览器上截取网页或部分网页的“内容截图”。该脚本是基于DOM进行渲染的,所以只支持大部分的css特效,还有就是不支持跨域显示资源或者显示...
  • 做项目中,经常会通过调用后台接口把数据显示到前台页面上来,之前遇到过的问题是,前台页面是用ul+li标签写的,在调用接口调试时发现返回的数据有很多组的,而在前台显示的时候只有一条数据,毋容置疑,一定是......
  • 主要介绍了VUE.js 中取得后台原生HTML字符串 原样显示问题 ,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 比如支付宝的支付接口调用的动态生成的跳转页面后台需要返回给前端打印跳转支付 &amp;lt;form name=&quot;punchout_form&quot; method=&quot;post&quot; action=&quot;...
  • 需要两个页面:显示表格的html页面index.html(页面内包含js),进行后台处理的php页面index.phphtml页面部分:<!doctype html><html><head><meta charset="utf-8"><title>表格</...
  • 网上有各种办法,window.print()必须是需要显示的,是打印HTML页面的。 也有将PDF转换成图片然后打印的,但是需要一个页面来显示这个图片,其实也是打印页面的。 不知道哪位大神有用过。
  • html、jquery、php编写新闻后台管理页面,动态添加新闻数据并实现数据的增删改查功能
  • 前端和java后台HTML转换成pdf

    千次阅读 热门讨论 2018-12-03 11:19:41
    java后台HTML转换成pdf private final static String DEST = &amp;quot;C:\\80afa41a3bfc474cbf1ac8b5bc1d.pdf&amp;quot;; //生成pdf的路径 private final static String SRC = &amp;quot;D:\\3b33a68...
  • 前台: 后台: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { this.Literal1.Text = "";

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,250
精华内容 19,300
关键字:

后台打印html页面