word-to-html.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. class WordToHtmlConverter {
  2. handleFileSelect(callback, accept = '.doc,.docx') {
  3. let input = document.createElement('input');
  4. input.type = 'file';
  5. input.accept = accept;
  6. input.onchange = (e)=>{
  7. let file = e.target.files[0];
  8. if (!file) {
  9. return;
  10. }
  11. let reader = new FileReader();
  12. reader.onload = (e)=>{
  13. let arrayBuffer = e.target.result;
  14. this.convertToHtml(arrayBuffer, (html)=>{
  15. callback(html);
  16. });
  17. };
  18. reader.readAsArrayBuffer(file);
  19. };
  20. input.click();
  21. }
  22. convertToHtml(arrayBuffer, callback) {
  23. try {
  24. mammoth.convertToHtml({arrayBuffer: arrayBuffer}).then(callback, function(error) {
  25. layer.msg('Error: ' + error);
  26. return
  27. });
  28. } catch (error) {
  29. layer.msg('Error: ' + error);
  30. return
  31. }
  32. }
  33. replaceHtmlBase64(html) {
  34. let regex = /<img\s+src="data:image\/[^;]*;base64,([^"]*)"/g;
  35. let matches = [];
  36. let match;
  37. while ((match = regex.exec(html)) !== null) {
  38. matches.push(match[1]);
  39. }
  40. if (matches.length === 0) {
  41. return new Promise((resolve, reject) => {
  42. resolve(html);
  43. });
  44. }
  45. // 将base64转为blob
  46. let promises = matches.map((base64)=>{
  47. return new Promise((resolve, reject)=>{
  48. let blob = this.base64ToBlob(base64);
  49. let reader = new FileReader();
  50. reader.onload = (e)=>{
  51. resolve({base64, blob, url: e.target.result});
  52. };
  53. reader.readAsDataURL(blob);
  54. });
  55. });
  56. return Promise.all(promises).then((results)=>{
  57. let htmlCopy = html;
  58. return Promise.all(results.map((result) => {
  59. return this.uploadFile(result.blob).then((data) => {
  60. htmlCopy = htmlCopy.replace(`data:image/png;base64,${result.base64}`, data.url);
  61. });
  62. })).then(() => {
  63. return htmlCopy;
  64. });
  65. });
  66. }
  67. uploadFile(blob) {
  68. let file = new File([blob], 'image.jpg', { type: 'image/jpeg' });
  69. let formData = new FormData();
  70. formData.append('editormd-file-file', file);
  71. return fetch(window.fileUploadURL, {
  72. method: 'POST',
  73. body: formData
  74. })
  75. .then(response => response.json())
  76. .then(data => {return data})
  77. .catch(error => {return error});
  78. }
  79. base64ToBlob(base64, type) {
  80. let binary = atob(base64);
  81. let array = [];
  82. for (let i = 0; i < binary.length; i++) {
  83. array.push(binary.charCodeAt(i));
  84. }
  85. return new Blob([new Uint8Array(array)], {type: type});
  86. }
  87. }