При попытке использовать 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)
имхо, ответ mico ОК, только замените шрифт PTSans на тот, который вы используете (base64 encode). См. jsfiddle: <
>var PTSans = ...
Мы можем прочитать здесь:
jsPDF окончательно поддерживает UTF-8, имея возможность использовать пользовательские шрифты.
Проблема, которая у вас есть, заключается в том, что вы не совсем понимаете, как работает PDF. Он должен иметь некоторый шрифт, который может отображать правильные буквы. Это должен быть один системный шрифт (для PDF Reader) или встроенный шрифт. И для каждой отдельной буквы PDF должен иметь один правильный шрифт. В этом случае для каждого слова на новом языке в том же PDF вы должны установить правильный шрифт.
Некоторые TTF шрифты были созданы для определенных букв, но не все TTF были созданы правильно, потому что за этим стоит одна стандартная технология. Также не все TTF-шрифты, созданные для определенных букв, могут отображаться в PDF_. Например, шрифт "Devanagari", который я нашел в интернете, должен поддерживать все буквы хинди, но он не работает.
Также нужно найти правильные TTF шрифты. И я их нашел - в вашем случае для строки "'→Kadıköy'" можно использовать "Courier New" или "Arial Unicode MS".
Я искал каждую букву из вашего задания и нашел следующие списки:
→ - Шрифтовая поддержка для "Стрелки вправо" (u+2192)
ı - поддержка шрифта для "Латинской строчной буквы без точки I" (u+0131)
' - Поддержка шрифта для "Левой одинарной кавычки" (u+2018)
' - Шрифтовая поддержка "Правой одинарной кавычки" (u+2019)
ö - Поддержка шрифта для "Латинской строчной буквы o с диарезом'" (u+00F6)
Я создал приложение, которое может создавать PDF для большинства языков мира.
Как его использовать:
В некоторых случаях может оказаться, что ваш язык не поддерживается в шрифте TTF "Arial Unicode MS". Полный список поддерживаемых языков вы можете найти здесь. В этом случае вы должны найти один из правильных TTF шрифтов. Но будьте осторожны: если шрифт меньше 100 кб. У меня есть опыт, что он не работает с 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=' '"><br><br>
<textarea rows="4" cols="75">‘→Kadıköy’</textarea>
<div> </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>
Вы можете сделать это, импортировав шрифт, поддерживающий ваши специальные символы.
В basic.js на примерах вы видите ссылку, как это применить.
(Пример приводит кириллические буквы).
function demoUsingTTFFont() {
//https://fonts.google.com/specimen/PT+Sans
var PTSans = “...... “); // place long string of text here
var doc = new jsPDF();
doc.addFileToVFS("PTSans.ttf", PTSans);
doc.addFont('PTSans.ttf', 'PTSans', 'normal');
doc.setFont('PTSans'); // set font
doc.setFontSize(10);
doc.text("А ну чики брики и в дамки!", 10, 10);
doc.save('test.pdf');
}
В качестве семейства шрифтов обратите внимание на Google's Noto.
Источник:
https://github.com/MrRio/jsPDF/issues/12 (прокрутите вниз)