Конвертировать HTML в Word, затем в PDF - PullRequest
2 голосов
/ 27 сентября 2019

Мне нужно конвертировать HTML в PDF.Я попробовал с jsPDF и прочитал много вопросов здесь на stackoverflow об этом.Я попробовал все методы, которые существуют, html (), fromHtml, html2pdf и html2canvas.Но у всех них есть различные проблемы.Пропущенный контент, нечеткий контент или поля полностью отключены.

Поэтому я пытаюсь выбрать другой маршрут.Я нашел следующий фрагмент кода для преобразования в документ Word.И это работает.

function exportHTML(){
       var header = "<html xmlns:o='urn:schemas-microsoft-com:office:office' "+
            "xmlns:w='urn:schemas-microsoft-com:office:word' "+
            "xmlns='http://www.w3.org/TR/REC-html40'>"+
            "<head><meta charset='utf-8'><title>Export HTML to Word Document with JavaScript</title></head><body>";
       var footer = "</body></html>";
       var sourceHTML = header+document.getElementById("source-html").innerHTML+footer;
       
       var source = 'data:application/vnd.ms-word;charset=utf-8,' + encodeURIComponent(sourceHTML);
       var fileDownload = document.createElement("a");
       document.body.appendChild(fileDownload);
       fileDownload.href = source;
       fileDownload.download = 'document.doc';
       fileDownload.click();
       document.body.removeChild(fileDownload);
    }

Однако я не хочу, чтобы файл слова загружался.Мне нужно захватить его и преобразовать в строку base64, потому что тогда я могу отправить его в остальные API, которые могут преобразовать слово документа в PDF.Этот остальные API не поддерживает HTML напрямую, в противном случае я бы просто отправил HTML.Отсюда обходной путь к слову, а затем к PDF.ps я не могу использовать онлайн-решение pdf из-за конфиденциальной информации, остальные API - это внутренняя служба.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Использовать «новый BLOB-объект» для конструкции файла:

function exportHTML(){
       var header = "<html xmlns:o='urn:schemas-microsoft-com:office:office' "+
            "xmlns:w='urn:schemas-microsoft-com:office:word' "+
            "xmlns='http://www.w3.org/TR/REC-html40'>"+
            "<head><meta charset='utf-8'><title>Export HTML to Word Document with JavaScript</title></head><body>";
       var footer = "</body></html>";
       var sourceHTML = header+document.getElementById("source-html").innerHTML+footer;
       
       var source = 'data:application/vnd.ms-word;charset=utf-8,' + encodeURIComponent(sourceHTML);
       //var fileDownload = document.createElement("a");
       //document.body.appendChild(fileDownload);
       //fileDownload.href = source;
       //fileDownload.download = 'document.doc';
       //fileDownload.click();
       //document.body.removeChild(fileDownload);
       var my_file=new Blob([source]);
       getBase64(my_file);
}

function getBase64(file) {
   var reader = new FileReader();
   reader.readAsDataURL(file);
   reader.onload = function () {
     console.log(reader.result);
   };
   reader.onerror = function (error) {
     console.log('Error: ', error);
   };
}
    
exportHTML();
<div id="source-html">Hi <b>World</b>!</div>
0 голосов
/ 27 сентября 2019

Однако я не хочу, чтобы файл слова загружался.Мне нужно захватить его и преобразовать в строку base64, потому что тогда я могу отправить его в остальные API, которые могут преобразовать слово документа в PDF.

Тогда нет необходимости вставлять его в ссылку для скачивания,Просто base64 кодирует строку с помощью btoa:

function exportHTML(){
       var header = "<html xmlns:o='urn:schemas-microsoft-com:office:office' "+
            "xmlns:w='urn:schemas-microsoft-com:office:word' "+
            "xmlns='http://www.w3.org/TR/REC-html40'>"+
            "<head><meta charset='utf-8'><title>Export HTML to Word Document with JavaScript</title></head><body>";
       var footer = "</body></html>";
       var sourceHTML = header+document.getElementById("source-html").innerHTML+footer;

       var source = 'data:application/vnd.ms-word;charset=utf-8,' + encodeURIComponent(sourceHTML);

       // encode here instead of creating a link
       var encoded = window.btoa(source);
       return encoded;
}

Тогда вы можете свободно использовать XMLHttpRequest для отправки закодированной строки на вашу конечную точку API.Например:

var encodedString = exportHTML();

var xhr = new XMLHttpRequest();
xhr.open('POST', '/my-conversion-endpoint', true);

xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

xhr.onreadystatechange = function() {
  if(xhr.readyState == 4 && xhr.status == 200) {
    // request finished
    alert(xhr.responseText);
  }
}

xhr.send('encodedString=' + encodedString);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...