2016-03-29 41 views
0

我正在使用CairoSVG將SVG轉換爲PDF。我發現了一個錯誤,其中每行文本在PDF加載到CorelDraw時最後都有一個1維標記。在CorelDraw中可見的PDF創建中記錄的數字光標移動

Example of issue

我覺得這是真實的,即使與SVGs的最簡單和最起碼的。然後我決定深入挖掘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>,它是某種開羅接口直接通過某種PDF API與PDF文件交互,雖然我還沒有沒有找到任何文件。

我已經嘗試了許多便宜的工作方式,例如將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() 

該問題的實際根本原因未知,但可能更深入開羅圖書館本身。

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