Добавление 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, но это даст вам решение, которое вы хотите, и если вам не нужно добавлять дополнительные шрифты, он будет работать без каких-либо дальнейшие изменения.