2015-05-28 2 views
12

Мое веб-приложение позволяет пользователю писать насыщенный текст внутри CKEditor, а затем экспортировать результат в формате PDF с помощью библиотеки Flying Saucer.Добавление Arial Unicode MS в CKEditor

Как нужно писать греческие символы, я решил добавить 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> 

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

Проблема известна (и старая) ошибка CKEditor, см. Https://dev.ckeditor.com/ticket/5966 и https://dev.ckeditor.com/ticket/10676 – obourgain

ответ

2

я не нашел способ сделать это с летающее блюдце R8, но вы можете сделать его работу с помощью летающей тарелки 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(); 

Вы можете найти летающее блюдце R9 на Maven.

+0

Благодарим вас за указание на то, что решение , Я действительно не хочу менять версию Flying Saucer, и я ищу решение CKEditor, чтобы шрифт был сохранен правильно. – realUser404

4

Я согласен с вами в решении этой проблемы, кроме Flying Saucer R8. Хотя в зависимости от вашего рабочего процесса было бы более эффективным разрешить CKEditor предварительно обрабатывать и проверять завершенный HTML-кодированный файл (сначала отобразить весь документ в HTML)?

Ни один из билетов на поддержку CKEditor не указывает истинный источник проблемы, поэтому я рекомендую подтвердить, является ли это (A) проблемой стиля или (B) проблемой обработки CSS, или (C) своеобразным CKEditor проблема синтаксического анализа.

Возможное обходное решение: Сделайте копию нужного шрифта Юникода и импортируйте его в Тип 3.2 (работает как на Mac, так и на Windows).

http://www.cr8software.net/type.html

переименовать дублированный набор шрифтов во что-то все в нижнем регистре.

Ограничить выбор шрифта

config.font_names = "customfontnamehere";

Применить стиль отдельно (Юникод начертание шрифта 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; 

Если выше не работает, вы можете попытаться изменить Рождественский plugin.js (также использует юникод гарнитуры шрифта greatvibes и делает все виды прохладных манипуляции перед выходом), так что может быть стоит пытаться изменить его, а не начинать с нуля:

'<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 Plugin писатель

doksoft

(перечислено как на их сайте и на его собственном сайте) и попросить демо его коммерческого плагина «Специальные символы CKEditor», который имеет широкие возможности для юникода. Надеюсь, что это поможет, ClaireW

2

Простейшее решение (до тех пор, пока CKEditor не установит эту ошибку) не сделает эту пост-обработку.

Вы можете сделать это на сервере (действительно просто, у вас уже есть код) или с небольшим плагином CKEditor, но это даст вам решение, которое вы хотите, и если вам не нужно добавлять дополнительные шрифты, он будет работать без любые дальнейшие изменения.

Смежные вопросы