English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Requirement is a pdf export function, after much running around, it has finally been realized, but a lot of detours have been taken, and there is a suspicion that this method is still a detour.
There is a jsPDF plugin that can directly generate pdf on the front-end, it is very simple, but does not support IE.
Front-end:
firstly introduce html2canvas.js
html2canvas(document.body, { //screenshot object //here you can configure detailed parameters onrendered: function(canvas) { //render completed callback canvas canvas.id = "mycanvas"; // generate base64image data var dataUrl = canvas.toDataURL('image/png'); //specify the format, or without parameters var formData = new FormData(); //simulate form object formData.append("imgData", convertBase64UrlToBlob(dataUrl), "123.png"); //write data var xhr = new XMLHttpRequest(); //data transmission method xhr.open("POST", "../bulletin/exportPdf"); //configure the transmission method and address xhr.send(formData); xhr.onreadystatechange = function(){ //callback function if(xhr.readyState == 4){ if (xhr.status == 200) { var back = JSON.parse(xhr.responseText); if(back.success == true){ alertBox({content: 'Pdf export successful!', lock: true, drag: false, ok: true}); }else{ alertBox({content: 'Pdf export failed!', lock: true, drag: false, ok: true}); } } } }; } }); //will be in base64convert image url data to Blob function convertBase64UrlToBlob(urlData){ //去掉url的头,并转换为byte var bytes=window.atob(urlData.split(',')[1]); //处理异常,将ascii码小于0的转换为大于0 var ab = new ArrayBuffer(bytes.length); var ia = new Uint8Array(ab); for (var i = 0; i < bytes.length; i++) { ia[i] = bytes.charCodeAt(i); } return new Blob( [ab] , {type : 'image/png'}); }
兼容性:Firefox 3.5+, Chrome, Opera, IE10+
不支持:iframe,浏览器插件,Flash
跨域图片需要在跨域服务器header加上允许跨域请求
access-control-allow-origin: * access-control-allow-credentials: true
svg图片不能直接支持,已经有补丁包了,不过我没有试过。
IE9不支持FormData数据格式,也不支持Blob,这种情况下将canvas生成的64base字符串去掉url头之后直接传给后台,后台接收之后:
String base64 = Img.split(",")[1]; BASE64Decoder decode = new BASE64Decoder(); byte[] imgByte = decode.decodeBuffer(base64);
后端:
导入 itext jar包
@RequestMapping("/exportPdf") public @ResponseBody void exportPdf(MultipartHttpServletRequest request,HttpServletResponse response)throws ServletException, IOException { ResultData result = new ResultData(); //自定义结果格式 String filePath = "c:\\exportPdf2.pdf"; String imagePath = "c:\\exportImg2.bmp"; Document document = new Document(); try{ Map getMap = request.getFileMap(); MultipartFile mfile = (MultipartFile) getMap.get("imgData"); //Obtenha os dados InputStream file = mfile.getInputStream(); byte[] fileByte = FileCopyUtils.copyToByteArray(file); FileImageOutputStream imageOutput = new FileImageOutputStream(new File(imagePath));//Abra o fluxo de entrada imageOutput.write(fileByte, 0, fileByte.length);//Gere o arquivo de imagem local imageOutput.close(); PdfWriter.getInstance(document, new FileOutputStream(filePath)); //arquivo itextpdf // document.setPageSize(PageSize.A2); document.open(); document.add(new Paragraph("SÓ TESTE ...")); Image image = Image.getInstance(imagePath); //itext-pdf-image float height = image.getHeight(); float width = image.getWidth(); int percent = getPercent2(altura, largura); //Reduza a imagem proporcionalmente image.setAlignment(Image.MIDDLE); image.scalePercent(percent+3); document.add(image); document.close(); result.setSuccess(true); operatelogService.addOperateLogInfo(request, "Exportação bem-sucedida: relatório Pdf exportado com sucesso"); catch (Exception e) { e.printStackTrace(); } result.setSuccess(false); result.setErrorMessage(e.toString()); try { operatelogService.addOperateLogError(request, "Falha ao exportar: exceção do servidor"); ) { catch (Exception e }1) { e1.printStackTrace(); } } response.getWriter().print(JSONObject.fromObject(result).toString()); } private static int getPercent2(float h, float w) { int p = 0; float p2 = 0.0f; p2 = 530 / w * 100; p = Math.round(p2); return p; }
O iText é um projeto conhecido da fonte aberta do site sourceforge, é uma biblioteca de classes Java usada para gerar documentos PDF.
Velocidade de processamento rápida, suporta muitas características "avançadas" de PDF.
Mas quando o iText falha, ele não mostra erro, pula diretamente e, quando olha para o documento PDF danificado, não encontra a razão do erro, o que é realmente frustrante.
Agradecemos aos posts e tópicos na rede e às buscas no Baidu.
A seguir, a maneira recomendada de salvar a página HTML como imagem e escrever para PDF é tudo o que o editor compartilha com vocês. Espero que isso forneça uma referência útil e que todos apoiem o tutorial gritar.