如何使用 vanilla JavaScript 将 html 文档转换为 pdf
How to convert html documents to pdf using vanilla JavaScript
我正在使用具有 HTML 布局的普通 JavaScript 创建文档表单。我想允许用户下载 PDF 格式的表单视图。
所以我想在 UI 中添加一个下载按钮,一旦用户单击该按钮,我希望将表格下载为 PDF 格式。
实现该目标的最佳方法是什么?
另外,我用过jsPDF
,但是韩文字体不能正常工作。
index.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<title>Vanilla JS</title>
</head>
<body>
<div id="temp">
<h1>안녕하세요</h1>
<ul>
<li>사과</li>
<li>오렌지</li>
<li>바나나</li>
</ul>
</div>
<button id="hi">다운로드</button>
</body>
</html>
app.js
import {jsPDF} from 'jspdf';
import { font } from './font';
const button = document.querySelector('#hi');
const koreanTextDiv = document.querySelector('#temp');
button.addEventListener('click', () => {
const doc = new jsPDF();
doc.html(koreanTextDiv, {
callback (doc) {
// setting language
doc.addFileToVFS('NanumGothic-Regular-normal.ttf', font);
doc.addFont('NanumGothic-Regular-normal.ttf', 'NanumGothic-Regular', 'normal');
doc.setFont('NanumGothic-Regular');
doc.setLanguage('ko-KR');
doc.save();
},
fontFaces: [{
family: 'NanumGothic-Regular',
src: ["/NanumGothic-Regular.ttf"]
}]
})
});
结果:
问题出在底层 html2canvas 上,它无法访问字体。您需要将它包含在您的 css 中,这应该允许 html2canvas 拾取它。
@font-face {
font-family: 'NanumGothic-Regular';
src: url('/fonts/NanumGothic-Regular') format('ttf');
}
body {
font-family: 'NanumGothic-Regular';
}
您可以通过传递文本而不是 html(然后将直接使用 jsPDF)来确认问题不在于 jsPDF:
doc.addFileToVFS('NanumGothic-Regular.ttf', font);
doc.addFont('NanumGothic-Regular.ttf', 'NanumGothic-Regular', 'normal');
doc.setFont('NanumGothic-Regular');
doc.setLanguage('ko-KR');
doc.text("안녕하세요", 10, 10);
doc.save();
我正在使用具有 HTML 布局的普通 JavaScript 创建文档表单。我想允许用户下载 PDF 格式的表单视图。
所以我想在 UI 中添加一个下载按钮,一旦用户单击该按钮,我希望将表格下载为 PDF 格式。
实现该目标的最佳方法是什么?
另外,我用过jsPDF
,但是韩文字体不能正常工作。
index.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<title>Vanilla JS</title>
</head>
<body>
<div id="temp">
<h1>안녕하세요</h1>
<ul>
<li>사과</li>
<li>오렌지</li>
<li>바나나</li>
</ul>
</div>
<button id="hi">다운로드</button>
</body>
</html>
app.js
import {jsPDF} from 'jspdf';
import { font } from './font';
const button = document.querySelector('#hi');
const koreanTextDiv = document.querySelector('#temp');
button.addEventListener('click', () => {
const doc = new jsPDF();
doc.html(koreanTextDiv, {
callback (doc) {
// setting language
doc.addFileToVFS('NanumGothic-Regular-normal.ttf', font);
doc.addFont('NanumGothic-Regular-normal.ttf', 'NanumGothic-Regular', 'normal');
doc.setFont('NanumGothic-Regular');
doc.setLanguage('ko-KR');
doc.save();
},
fontFaces: [{
family: 'NanumGothic-Regular',
src: ["/NanumGothic-Regular.ttf"]
}]
})
});
结果:
问题出在底层 html2canvas 上,它无法访问字体。您需要将它包含在您的 css 中,这应该允许 html2canvas 拾取它。
@font-face {
font-family: 'NanumGothic-Regular';
src: url('/fonts/NanumGothic-Regular') format('ttf');
}
body {
font-family: 'NanumGothic-Regular';
}
您可以通过传递文本而不是 html(然后将直接使用 jsPDF)来确认问题不在于 jsPDF:
doc.addFileToVFS('NanumGothic-Regular.ttf', font);
doc.addFont('NanumGothic-Regular.ttf', 'NanumGothic-Regular', 'normal');
doc.setFont('NanumGothic-Regular');
doc.setLanguage('ko-KR');
doc.text("안녕하세요", 10, 10);
doc.save();