在 CorelDraw 中可见的 PDF 创建中记录的数字光标移动

Digital cursor movement recorded in PDF creation visible in CorelDraw

我正在使用 CairoSVG 将 SVG 转换为 PDF。我发现了一个错误,当 PDF 加载到 CorelDraw 中时,每行文本的末尾都有一个一维标记。

我发现即使是最简单的 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 不是文件或函数,surface 被 pprint 编辑为 <cairosvg.surface.PDFSurface object at 0x7f647802ec90>,它是某种 Cairo 接口,用于通过某种方式直接与 PDF 文件交互PDF API,虽然我还没有找到任何关于它的文档。

我尝试了很多廉价的解决方法,例如将 PDF 保存在另一个程序中然后在 Corel 中打开,但是元素丢失或以不可接受的方式被更改。

我当然也试过一次注释掉这个文件的一行,然后一次注释掉代码块,但没有成功。

我也查看了 path.py、parser.py 等其他文件,但 text.py 似乎是最有希望的位置。

如何防止此标记出现在我的 PDF 文件中?

我发现我可以通过进入 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