javascript - 使用 jspdf 时转换/规范化特殊字符

标签 javascript pdf character-encoding special-characters jspdf

尝试使用 jspdf lib @1.4.1将文本转换为 pdf,输出有时会变得非常难看和不可读,因为文本包含一些特殊字符,例如:

左单引号U+2018,或右单引号U+2019,或等符号,或ıKadıköy... 我如何清理/规范化这些文本?或者我可以使用 jspdf 来解决这个问题吗?

更新:

要重现问题,只需使用此字符串:'→Kadıköy' 在此示例中 https://parall.ax/products/jspdf ,第9行,你会看到箭头被转换为!’ı被转换为1

(仅供引用,Kadıköy 是一个城市的名称 https://en.wikipedia.org/wiki/Kad%C4%B1k%C3%B6y )

最佳答案

我们可以阅读 here :

jsPDF supports finally UTF-8 by having the ability to use custom fonts.

您遇到的问题是您没有真正了解 PDF 的工作原理。它必须有一些可以显示正确字母的字体。它必须是一种系统字体(用于 PDF 阅读器)或嵌入字体。对于每一个字母,PDF 都必须有一种正确的字体。 在这种情况下,对于同一 PDF 中新语言的每个单词,您必须设置正确的字体

一些 TTF fonts是为某些特定字母创建的,但并非所有 TTF 都已正确创建,因为这背后是 one standard technology 也不是所有为某些特定字母创建的 TTF 字体都可以在 PDF 中显示它们。例如我在网上找到的字体“Devanagari”应该支持所有印地语字母,但它完全失败了。

我们还必须找到正确的 TTF 字体。我找到了它们 - 在您的情况下,对于字符串“‘→Kadıköy’”,您可以使用“Courier New”或“Arial Unicode MS”。

我已经搜索了您任务中的每封信,并找到了以下列表:

→ – Font support for "Rightwards arrow" (u+2192)

ı – Font support for "Latin small letter dotless I" (u+0131)

' – Font support for "Left single quotation mark" (u+2018)

' – Font support for "Right single quotation mark" (u+2019)

ö – Font support for "Latin small letter o with diaeresis'" (u+00F6)

世界上大多数语言的解决方案

我已经创建了可以为世界上大多数语言创建 PDF 的应用程序。

使用方法:

  1. 首先下载并解压免费的TTF字体“Arial Unicode MS
  2. 启动下面的代码片段并从您的文件夹中选择提取的免费 TTF 字体“Arial Unicode MS”。
  3. 用您的语言编写文本,然后单击“创建 PDF”按钮。
  4. 将下载 PDF,您可以打开它。

在某些情况下,TTF 字体“Arial Unicode MS”可能不支持您的语言。您可以找到支持语言的完整列表 here 。在这种情况下,您必须从正确的 TTF 字体中找到一个。 但要小心: 如果字体小于 100 kb。我有不适用于 jsPDF 的经验(请参阅我帖子的开头)。

应用

var fontInBase64 = '',
    fileName = '',
    message = document.querySelector('div'),
    txtForPdf = document.querySelector('textarea'),
    errorStr = '<b style="color:red">Please select a font file!</b>';

function readFile()
{
    var file = document.querySelector('input[type=file]').files[0],
        reader = new FileReader();

    if(file && file.name.split('.')[1].toLowerCase() != 'ttf')
    {
        message.innerHTML = errorStr;
        return;
    }

    if(txtForPdf.value.replace(/\s+/g, '').length < 1)
    {
        message.innerHTML = '<b style="color:red">Please write some Text!</b>';;
        return;
    }

    reader.onloadend = function()
    {
        fontInBase64 = reader.result.split(',')[1];
        fileName = file.name.replace(/\s+/g, '-');

        createPDF(fileName, fontInBase64);
    }

    if(file) reader.readAsDataURL(file);
    else message.innerHTML = errorStr;
}


function createPDF(fileName, fontInBase64)
{
    var doc = new jsPDF('p','mm','a4');
        fileNameWithoutExtension = fileName.split('.')[0],
        lMargin = 15, // left margin in mm
        rMargin = 15, // right margin in mm
        pdfInMM = 210; // width of A4 in mm

    doc.addFileToVFS(fileName, fontInBase64);
    doc.addFont(fileName, fileNameWithoutExtension, 'normal');

    doc.setFont(fileNameWithoutExtension);
    doc.setFontSize(14);
    var splitParts = doc.splitTextToSize(txtForPdf.value, (pdfInMM - lMargin - rMargin));
    doc.text(15, 15, splitParts);

    doc.save('test.pdf');
}

function setHindiToTextArea()
{
    txtForPdf.value =
    "हिन्दी विश्व की एक प्रमुख भाषा है एवं भारत की राजभाषा है। केंद्रीय स्तर पर भारत में दूसरी आधिकारिक भाषा अंग्रेजी है। यह हिन्दुस्तानी भाषा की एक मानकीकृत रूप है जिसमें संस्कृत के तत्सम तथा तद्भव शब्द का प्रयोग अधिक हैं और अरबी-फ़ारसी शब्द कम हैं। हिन्दी संवैधानिक रूप से भारत की प्रथम राजभाषा और भारत की सबसे अधिक बोली और समझी जाने वाली भाषा है। हालांकि, हिन्दी भारत की राष्ट्रभाषा नहीं है क्योंकि भारत का संविधान में कोई भी भाषा को ऐसा दर्जा नहीं दिया गया था। चीनी के बाद यह विश्व में सबसे अधिक बोली जाने वाली भाषा भी है। विश्व आर्थिक मंच की गणना के अनुसार यह विश्व की दस शक्तिशाली भाषाओं में से एक है। हिन्दी और इसकी बोलियाँ सम्पूर्ण भारत के विविध राज्यों में बोली जाती हैं। भारत और अन्य देशों में भी लोग हिन्दी बोलते, पढ़ते और लिखते हैं। फ़िजी, मॉरिशस, गयाना, सूरीनाम की और नेपाल की जनता भी हिन्दी बोलती है। 2001 की भारतीय जनगणना में भारत में ४२ करोड़ २० लाख लोगों ने हिन्दी को अपनी मूल भाषा बताया। भारत के बाहर, हिन्दी बोलने वाले संयुक्त राज्य अमेरिका में 648,983; मॉरीशस में ६,८५,१७०; दक्षिण अफ्रीका में ८,९०,२९२; यमन में २,३२,७६०; युगांडा में १,४७,०००; सिंगापुर में ५,०००; नेपाल में ८ लाख; जर्मनी में ३०,००० हैं। न्यूजीलैंड में हिन्दी चौथी सर्वाधिक बोली जाने वाली भाषा है";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.4.1/jspdf.min.js" crossorigin="anonymous"></script>
<input type="file" onchange="message.innerHTML='&nbsp;'"><br><br>
<textarea rows="4" cols="75">‘→Kadıköy’</textarea>
<div>&nbsp;</div>
<input type="button" value="Create PDF with UTF support" onclick="readFile()">
<br>
<i>For example</i>:<br><a href="#" onclick="setHindiToTextArea()"><b>Click on this line if you wont to set hindi text to the textarea.</b></a>

关于javascript - 使用 jspdf 时转换/规范化特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51351307/

相关文章:

javascript - 如何从 Google Sheet 下载具有特定边距和分页符的 PDF 文件?

java - 从 Liferay 的 JSF Portlet 显示 pdf 时出现问题

php - MySQL 数据库在条目中没有转义单引号...如何显示它们?

javascript - grunt-babel 挂起并且不返回错误消息

javascript - 如何在 Vue.js 中添加不同字体的很棒的图标

javascript - 超出视口(viewport)时停止 slider 滚动?

python - 如何使用 pdfminer 作为库

python - 来自python程序的配置单元查询返回的输出类似于 “x00e\x00”\x00“

character-encoding - 是 charset=utf-8 在 js 和 css 文件中需要它,即使我的 html 有 &lt;meta charset ="UTF-8">

php - MySQL -> PHP -> JS/jQuery