Как улучшить качество при использовании RMagick / ImageMagick для конвертации из SVG в PDF? - PullRequest
0 голосов
/ 17 ноября 2011

Я использую Rubyvis для создания графиков SVG, а затем разрешаю пользователю сохранять либо непосредственно в SVG, либо в каком-либо другом формате с использованием RMagick.

Графики SVG имеют заданный размер, который указан вФайл SVG.Поэтому мне кажется, что преобразование в PDF такого же размера должно быть тривиальным.

К сожалению, это не так.Я могу создать PDF-файл таким образом, но он намного больше (по размеру), чем PDF-файлы, если я сначала открою SVG в inkscape, а затем распечатываю в файл в формате PDF.

Хуже,качество изображения в PDF ужасноеВот код:

image = Magick::Image::from_blob(svg_string_data) { self.format = 'SVG' }
image[0].format = 'PDF'
image[0].to_blob

Затем я записываю возвращенное значение (BLOB-объект PDF) прямо в файл.

1 Ответ

1 голос
/ 29 ноября 2011

Ответ приходит к вам на основе подсказки cptjazz на github.

Прежде всего, документация для RMagick часто неверна.Я сомневаюсь, что это проблема версии, потому что документы, размещенные на ImageMagick, v2.12.0, а я использую v2.13.1.В любом случае, вот что вам нужно знать.

В документах утверждается, что вы можете использовать image[0]['pdf', 'use-cropbox'] = true, поскольку true.to_s возвращает строку "true".На самом деле ему нужна явная строка, а метод []= требует только один ключ, а не два.

Я не экспериментировал с pdf:use-trimbox, главным образом потому, что хотел вариант, который также работает для postscript.Что касается постскриптума, вы можете изменить его лишь незначительно и установить ps:use-cropbox в значение «истина», но документы RMagick неясно, как правильно установить геометрию на PS, PS2 или PS3.(Обычно в ImageMagick можно было бы установить плотность на «300x300», а геометрию на «24%», предположительно.) И по какой-то причине выходные файлы формата PS3 не масштабируются так же, как PDF-файлы, созданные RMagick.Но я отвлекся.

Вот что я использовал для PDF:

image = Magick::Image::from_blob(svg_string) { self.format = 'SVG' }
image[0].format = 'PDF'
image[0]["use-cropbox"] = 'true'
image[0].to_blob

А вот что я использовал для PS:

image = Magick::Image::from_blob(svg_string) { self.format = 'SVG' }
page  = image[0].page.dup
image[0]["use-cropbox"] = 'true'
image[0].format = 'PS3'
image[0].density = '100x100'
image[0].page = page
image[0].to_blob

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...