Я пытаюсь преобразовать изображение SVG в файл EPS с помощью командной строки Inkscape. Это команда, которую я запускаю (из сценария Python) для преобразования:
bashCommand = "inkscape " + file + " -D --without-gui --export-eps=exports/" + type + ".eps"
process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
Файл сгенерирован, и при его открытии большая часть его выглядит так, как ожидалось. Проблема в том, что часть текста не отображается (см. Снимок экрана ниже). Вместо этого есть странные прямоугольные символы. В большей части отсутствующего текста нет специальных символов. Я действительно понятия не имею, что может вызвать эту проблему.
Это ошибка, которую я вижу при печати переменной ошибки:
(process:1855): Gtk-WARNING **: Locale not supported by C library.
Using the fallback 'C' locale.
Fontconfig warning: ignoring UTF-8: not a valid region tag
В /etc/default/locale я попытался добавить следующее (я наткнулся на это возможное исправление, когда искал решение):
LANG = "en_US.UTF-8"
LANGUAGE = "en_US.UTF-8"
LC_ALL = "en_US.UTF-8"
Затем я перенастроил локали с помощью sudo dpkg-reconfigure locales.
Вот результат, который я получаю при использовании команды locale:
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE = "en_US.UTF-8"
LC_NUMERIC = "en_US.UTF-8"
LC_TIME = "en_US.UTF-8"
LC_COLLATE = "en_US.UTF-8"
LC_MONETARY = "en_US.UTF-8"
LC_MESSAGES = "en_US.UTF-8"
LC_PAPER = "en_US.UTF-8"
LC_NAME = "en_US.UTF-8"
LC_ADDRESS = "en_US.UTF-8"
LC_TELEPHONE = "en_US.UTF-8"
LC_MEASUREMENT = "en_US.UTF-8"
LC_IDENTIFICATION = "en_US.UTF-8"
LC_ALL=en_US.UTF-8
Я использую Open Sans в качестве шрифта и также установил шрифт на сервере. После добавления шрифтов в /usr/local/share/fonts я перестраиваю кеш шрифтов с помощью команды fc-cache -f -v.
При преобразовании SVG в PDF с помощью приведенного ниже кода все работает должным образом. Виден весь текст, используется шрифт Open Sans.
bashCommand = "inkscape " + file + " -D -d 300 --without-gui --export-pdf=exports/" + type + ".pdf"
process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
Вот как выглядит PDF-файл:
Некоторое время я искал в Интернете решение, но пока не нашел.
Я работаю с сервером Ubuntu 16.04. Я установил Inkscape 0.91.
Кто-нибудь знает, как текст правильно разобрать? И почему текст конвертируется в эти символы (первый скриншот)? Надеюсь, кто-то может помочь!
Спасибо за ответ, я добавил параметры, но получил тот же результат, что и без них @HassanVoyeau
Посмотрите, помогает ли это thomas-krenn.com/en/wiki/Configure_Locales_in_Ubuntu - обратите внимание, где он говорит о перезапуске.
Возможно, вы используете старую версию Inkscape (текущая - 0.92)? v0.47 реализовано с использованием cairo для экспорта (E) PS, а в примечания к выпуску явно упоминается «гораздо лучшая поддержка ... символов, отличных от ASCII». Кажется, я помню, что для некоторых выпусков в диалоговом окне экспорта графического интерфейса была возможность выбирать между cairo и старым методом экспорта, но теперь этого больше нет, и я понятия не имею, поддерживался ли он когда-либо в CLI.






Я могу рассказать только часть того, что происходит. «Странные прямоугольные символы» - это глифы TrueType .notdef. Когда вы используете шрифт, он не содержит всех возможных глифов на всех письменных языках, известных человеку. Кроме того, в PostScript обычные шрифты (в отличие от CIDFonts) могут одновременно обращаться только к 255 различным глифам.
Таким образом, чтобы удовлетворить случай, когда вы пытаетесь использовать глиф, копии которого у шрифта нет, шрифты должны содержать глиф .notdef, и это то, что используется всякий раз, когда вы пытаетесь использовать отсутствующий глиф. Как правило, шрифты PostScript определяют .notdef, который не делает отметок, а шрифты TrueType определяют тот, который образует полый прямоугольник. Есть и другие возможности, но они наиболее распространены.
Так почему вы получаете .notdef? Что ж, похоже, это тоже может быть вызвано (в некотором смысле) сообщением об ошибке от gtk о том, что локаль не поддерживается, и игнорировании UTF-8.
gtk необходимо переназначить коды символов текста во что-то, что будет работать со встроенными шрифтами, и кажется, что он не знает, как работать с текстом в кодировке UTF-8, поэтому он возвращается к притворству своего 'C Я думаю, это в основном US ASCII.
К сожалению, я не могу сказать вам, как это исправить, я недостаточно знаю о внешнем интерфейсе, но мне это не кажется реальной проблемой EPS, проблема заключается в приложении, генерирующем EPS, и, возможно, с gtk в частности.
Я видел команду, используемую с этими параметрами (--export-ignore-filters --export-ps-level = 3). Сообщите мне, как это работает для вас.