2016-03-29 3 views
0

Я использую CairoSVG для превращения SVG в PDF. Я нашел ошибку, где каждая строка текста имеет 1 мерную метку в конце, когда PDF загружен в CorelDraw.Движение цифрового курсора, записанное в формате PDF, видимое в CorelDraw

Example of issue

Я считаю, что это верно даже с самым простым и насущным из SVGs. Затем я решил заглянуть в источник Python CairoSVG, чтобы исправить проблему в ее корне. Я нашел text.py в качестве места, где возникает проблема.

https://github.com/Kozea/CairoSVG/blob/master/cairosvg/text.py

В частности, for [x, y, dx, dy, r], letter in letters_positions: цикл. Я могу фактически манипулировать значком, делая это после цикла for.

surface.context.move_to(100, 100) 
surface.context.save() 
surface.context.text_path(' ')    
surface.context.restore() 

В зависимости от значений я вхожу, он будет двигаться один из пунктов (в этом случае нижняя правая точка знака). Это говорит о том, что когда CairoSVG выполняется с линией текста, поверхность переместит курсор на начало последней буквы, которую он рисует. По какой-то причине последний раз, когда он это делает, фактически записывается в PDF, хотя для большинства читателей в формате PDF он не отображается. Я попытался точно настроить эту отметку, чтобы две точки были одинаковыми, но поскольку это местоположение отличается каждый раз в зависимости от буквы и местоположения и т. Д., Я не могу точно настроить это число, чтобы исчезнуть метка, даже если вы используете доступные ширина и высота переменных

Обратите внимание, что surface.context не файл или функцию и поверхность pprint-е изд, как <cairosvg.surface.PDFSurface object at 0x7f647802ec90>, это своего рода интерфейс Cairo для взаимодействия с файлом PDF непосредственно через своего рода PDF API, хотя я гаванью Не найдено никаких документов.

Я пробовал много дешевой работы вокруг, как сохранение PDF в другой программе, а затем открытие в Corel, однако элементы теряются или изменяются способами, которые неприемлемы.

Я также, конечно, пробовал комментировать этот файл по 1 строке за раз, затем куски кода за раз, но не повезло.

Я также изучал другие файлы, такие как path.py, parser.py и многое другое, но text.py представляется наиболее перспективным местом.

Как я могу предотвратить появление этой метки в моих PDF-файлах?

ответ

0

Я нашел, что смог получить желаемые результаты, перейдя в код CairoSVG и используя другую функцию для создания текстовых элементов в PDF.

Это собирает буквы в переменную.

# Collect entire line instead of letter 
text_line_letters = '' 
for [x, y, dx, dy, r], letter in letters_positions: 
    text_line_letters = text_line_letters + letter 
    # Skip rest of for loop 
    continue 

Эта функция использует новую функцию для создания фактического текста в PDF.

# Create Text with glyph_path  
surface.context.save() 
font = surface.context.get_scaled_font() 
glyphs, clusters, is_backwards = font.text_to_glyphs(
    0, -5, text_line_letters, with_clusters=True) 
surface.context.glyph_path(glyphs) 
surface.context.restore() 

Фактическая корневая причина проблемы неизвестна, но, вероятно, глубже внутри самой библиотеки Cairo.

https://github.com/bonzini/cairo/blob/9099c7e7307a39bc630919faa65bba089fd15104/src/cairo.c#L3349