English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Método de Salvar Página HTML em Imagem e Escrever em PDF (Recomendado)

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.

Você Também Pode Gostar