我正在使用CairoSVG将SVG转换为PDF。我发现了一个错误,当PDF加载到CorelDraw时,每行文本在末尾都有一个1维标记。
我发现即使使用最简单和最简单的SVG也是如此。然后我决定深入研究CairoSVG的python源码来解决它的问题。我发现text.py是发生问题的地方。
https://github.com/Kozea/CairoSVG/blob/master/cairosvg/text.py
具体来说,for [x, y, dx, dy, r], letter in letters_positions:
for循环。我可以通过在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中打开,但是元素会以不可接受的方式丢失或改变。</ p>
我当然也尝试一次评论这个文件1行,然后一次批量代码,但没有运气。
我还研究了其他文件,例如path.py,parser.py等,但text.py似乎是最有前途的位置。
如何防止此标记出现在我的PDF文件中?
答案 0 :(得分: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()
问题的实际根本原因尚不清楚,但可能更深入到开罗图书馆内部。
https://github.com/bonzini/cairo/blob/9099c7e7307a39bc630919faa65bba089fd15104/src/cairo.c#L3349