Добавление Arial Unicode MS в CKEditor
Мое веб-приложение позволяет пользователю писать насыщенный текст внутри CKEditor, а затем экспортировать результат в формате PDF с помощью библиотеки Flying Saucer.
Поскольку они должны писать греческие символы, я решил добавить Arial Unicode MS к доступным шрифтам, выполнив следующие действия:
config.font_names = "*several fonts...*; Arial Unicode MS/Arial Unicode MS, serif";
Этот шрифт теперь отображается правильно в меню CKEditor, но когда я применяю этот шрифт к любому элементу, я получаю следующий результат:
<span style="font-family:arial unicode ms,serif;"> some text </span>
Как вы можете заметить, я потерял символы UpperCase. Это имеет довольно плохой эффект при экспорте PDF, так как Flying Saucer не распознает шрифт и поэтому использует Helvetica, который не поддерживает символы Unicode, поэтому греческие символы не отображаются в PDF файле.
Если я изменю вручную из источника кода
<span style="font-family:arial unicode ms,serif;"> some text </span>
к
<span style="font-family:arial unicode ms,serif;"> some text </span>
то он работает как ожидалось, отображаются греческие символы.
Кто-нибудь раньше встречал эту проблему? Есть ли способ избежать символов UpperCase для замены на LowerCase?
Я действительно хочу избежать любой последующей обработки, например:
htmlString = htmlString.replace("arial unicode ms", "Arial Unicode MS");
Ответы
Ответ 1
Я согласен с вами в решении этой проблемы, кроме Flying Saucer R8.
Хотя в зависимости от вашего рабочего процесса было бы более эффективным позволить CKEditor предварительно обрабатывать и проверять завершенный HTML-кодированный файл (сначала отобразить весь документ в HTML)?
Ни один из билетов на поддержку CKEditor не указывает истинный источник проблемы, поэтому я рекомендую подтвердить, является ли это (A) проблемой стиля или (B) проблемой обработки CSS, или (C) особый синтаксический анализ CKEditor вопрос.
Возможное обходное решение:
Сделайте копию нужного шрифта юникода и импортируйте его в Type 3.2 (работает как на Mac, так и на Windows).
http://www.cr8software.net/type.html
переименуйте дубликат шрифта во что-то все в нижнем регистре.
Ограничьте выбор шрифта
config.font_names = "customfontnamehere";
Примените стиль отдельно (unicode typeface greatvibes ниже) и посмотрите, дает ли это желаемый результат:
var s = CKEDITOR.document.$.createElement( 'style' );
s.type = 'text/css';
cardElement.$.appendChild( s );
s.styleSheet.cssText =
'@font-face {' +
'font-family: \'GreatVibes\';' +
'src: url(\'' + path +'fonts/GreatVibes-Regular.eot\');' +
'}' +
style;
Если вышеуказанное не работает, вы можете попробовать изменить xmas plugin.js(также использует универсальные шрифты unicode и делает всевозможные крутые манипуляции перед выходом), поэтому, возможно, стоит попробовать изменить его, а не начать с нуля:
'<style type="text/css">' +
'@font-face {' +
'font-family: "GreatVibes";' +
'src: url("' + path +'fonts/GreatVibes-Regular.ttf");' +
'}' +
style +
'</style>' )
Какой бы подход вы ни старались, цель состоит в том, чтобы протестировать различные стили и посмотреть, вернется ли снова CKEditor обратно в Helvetica.
Наконец, SDK CKEditor имеет отличную поддержку, поэтому, если у вас есть время и энергия, вы можете написать плагин. Звучит пугающе, я знаю, но заметьте, что plugin.js в каталоге /plugins/font имеет приоритет для атрибутов размера.
Если вы не заинтересованы в создании собственного плагина, я рекомендую обратиться к плодовитому писателю плагинов ckeditor
doksoft
(указан как на своем веб-сайте, так и на его собственном веб-сайте) и попросите демонстрацию своего коммерческого плагина "Специальные символы CKEditor", который имеет широкие возможности для юникода. Надеюсь, это поможет, ClaireW
Ответ 2
Я не нашел никакого способа сделать это с Flying Saucer R8, но вы можете заставить его работать с помощью Flying Saucer R9.
Метод
ITextResolver.addFont(String path, String fontFamilyNameOverride, String encoding, boolean embedded, String pathToPFB) позволяет добавлять привязку к определенному имени.
Пример кода:
ITextRenderer renderer = new ITextRenderer();
// Adding fonts
renderer.getFontResolver().addFont("fonts/ARIALUNI.TTF", "arial unicode ms", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, null);
renderer.getFontResolver().addFont("fonts/ARIALUNI.TTF", "Arial Unicode MS", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, null);
String inputFile = "test.html";
renderer.setDocument(new File(inputFile));
renderer.layout();
String outputFile = "test.pdf";
OutputStream os = new FileOutputStream(outputFile);
renderer.createPDF(os);
os.close();
Вы можете найти Flying Saucer R9 на Maven.
Ответ 3
Простейшее решение (до тех пор, пока CKEditor не установит эту ошибку) не сделает эту пост-обработку.
Вы можете сделать это на сервере (действительно просто, у вас уже есть код) или с небольшим плагином CKEditor, но это даст вам решение, которое вы хотите, и если вам не нужно добавлять дополнительные шрифты, он будет работать без каких-либо дальнейшие изменения.