English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Требуется функция экспорта PDF, после многоходов и даже подозрений, что текущий метод все еще не прямой.
Есть плагин jsPDF, который позволяет напрямую генерировать PDF на фронтенде, это просто, но он не поддерживает IE.
Фронтенд:
Сначала введите html2canvas.js
html2canvas(document.body, { //Объект для создания скриншота //Здесь можно настроить дополнительные параметры onrendered: function(canvas) { //回调 функция после завершения рендеринга canvas canvas.id = "mycanvas"; //Создать данные изображения в формате base64 var dataUrl = canvas.toDataURL('image/png'); //Указать формат, также можно не указывать параметры var formData = new FormData(); //Мock объекта формы formData.append("imgData", convertBase64UrlToBlob(dataUrl), "123.png"); //Запись данных var xhr = new XMLHttpRequest(); //Метод передачи данных xhr.open("POST", "../bulletin/exportPdf"); //Настройка метода передачи и адреса xhr.send(formData); xhr.onreadystatechange = function(){ //回调 функция if(xhr.readyState == 4){ if (xhr.status == 200) { var back = JSON.parse(xhr.responseText); if(back.success == true){ alertBox({content: 'Успешно экспортирован PDF!', lock: true, drag: false, ok: true}); }else{ alertBox({content: 'Не удалось экспортировать PDF!', lock: true, drag: false, ok: true}); }; }); //Преобразовать изображение URL в формате base64 в 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
Изображения для跨域需要在 заголовке сервера跨域服务器 добавить разрешение на跨доменные запросы
access-control-allow-origin: * access-control-allow-credentials: true
SVG изображения не поддерживаются напрямую, уже есть патч-пакет, но я не пробовал.
IE9 не поддерживает формат данных FormData, также не поддерживает Blob, в этом случае после удаления заголовка url из созданного canvas 64base строки передается напрямую на бэкенд, после приема на бэкенд:
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"); //Получение данных InputStream file = mfile.getInputStream(); byte[] fileByte = FileCopyUtils.copyToByteArray(file); FileImageOutputStream imageOutput = new FileImageOutputStream(new File(imagePath)); //Открываем входной поток imageOutput.write(fileByte, 0, fileByte.length); //Создание локального файла изображения imageOutput.close(); PdfWriter.getInstance(document, new FileOutputStream(filePath)); //itextpdf файл // document.setPageSize(PageSize.A2); document.open(); document.add(new Paragraph(" JUST TEST ... ")); Image image = Image.getInstance(imagePath); //itext-pdf-image float heigth = image.getHeight(); float width = image.getWidth(); int percent = getPercent2(heigth, width); //Уменьшение изображения по пропорциям image.setAlignment(Image.MIDDLE); image.scalePercent(percent+3); document.add(image); document.close(); result.setSuccess(true); operatelogService.addOperateLogInfo(request, "Экспорт успешен: Успешно экспортирован отчет PDF"); System.err.println(de.getMessage()); catch (Exception e) { e.printStackTrace(); result.setSuccess(false); result.setErrorMessage(e.toString()); try { operatelogService.addOperateLogError(request, "Не удалось экспортировать: ошибка сервера"); catch (Exception e1) { } 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); возврат p;
iText - это известный проект open-source на сайте sourceforge, являющийся библиотекой Java для создания PDF-документов.
Быстрая обработка, поддержка множества "высоких" функций PDF.
Но когда iText выдает ошибку, она не сообщает об этом, просто пропускает ее, и затем, когда я смотрю на损坏ленный PDF-документ, не могу найти причину ошибки, что очень раздражает.
В конце хочу поблагодарить блогеров и пользователей Интернета, а также поисковую систему Baidu.
Эту статью о том, как сохранить страницу HTML в изображение и写入 PDF,方法是小编分享给大家的全部内容,希望对大家有所帮助,也希望大家多多支持呐喊教程。