2016-11-24 129 views
8

使用縮放轉換在使用不同比例繪製時發現了PDFSharp存在的問題。PDFSharp轉換問題

在此示例中,我們繪製兩個不同比例的矩形,從FixedDocumentSequence生成XPS,最後使用PDFsharps XPS轉換器將XPS轉換爲PDF。

var visual = new DrawingVisual(); 
DrawingContext dc = visual.RenderOpen(); 

// Setup transformations. 
dc.PushTransform(new TranslateTransform(0, 1122.0)); 
dc.PushTransform(new ScaleTransform(3.77857136726379, -3.77857136726379)); 
dc.PushTransform(new TranslateTransform(-1719.41186523438, -1410.32360839844)); 
dc.PushTransform(new ScaleTransform(0.0117647061124444, 0.0117647061124444)); 

// Draw red rectangle. 
var redPen = new Pen(Brushes.Red, 1); 
var rectGeo1 = new RectangleGeometry(new Rect(160000, 130000, 8000, 5000)); 
dc.DrawGeometry(Brushes.Transparent, redPen, rectGeo1); 

// Pop two transformations. 
dc.Pop(); 
dc.Pop(); 

// Draw blue rectangle. 
var bluePen = new Pen(Brushes.Blue, 0.5); 
var rectGeo2 = new RectangleGeometry(new Rect(12, 12, 150.9408, 107.088539)); 
dc.DrawGeometry(Brushes.Transparent, bluePen, rectGeo2); 
dc.Close(); 

// Generate XPS from DocumentSequence. 
var a3Size = new Size(1587, 1123); 
var docSeq = CreateDocumentSequence(a3Size, visual); 
string dirPath = @"C:\Temp\"; 
string xpsFilePath = dirPath + "test.xps"; 
string pdfFilePath = dirPath + "test.pdf"; 
WriteXpsFile(docSeq, xpsFilePath); 

// Generate PDF from XPS (PdfSharp) 
XpsConverter.Convert(xpsFilePath, pdfFilePath, 0); 

完整的程序,可以發現here和VS溶液here

紅色矩形預計將與藍色矩形的右上角對齊。這就是我們得到的生成XPS看時:

XPS screenshot

但在生成的PDF我們得到了兩個矩形之間的間隙。在1:85的比例130000;繪圖時從原點長方式,在該示例中的紅色矩形被放置在160000

enter image description here

Close-up

問題是最明顯的。從你繪製的起點開始的時間越長,差距就越大,這可能是精度/舍入誤差嗎?

我試圖解決這個問題沒有成功。任何幫助找到原因將不勝感激!請注意,我不確定問題出在PDFSharp渲染還是XPS轉換。

我使用PDFSharp 1.31(新版本不包括XPS支持)。

此示例的完整Visual Studio解決方案(包括PDFSharp lib)可用here

+0

我假設你已經嘗試了其他XPS到PDF轉換器,問題只存在於PDFSharp中? –

+0

@AndrejsCainikovs正確的,我試過其他轉換器,並得到正確的結果。所以這是PDFSharp的一個問題。 – salle55

回答

8

找到原因,PDFSharp在生成PDF時,將變換矩陣值舍入爲4位小數,在這種情況下PDF不足。

爲了提高精度我從4至8位的佔位符改變在PdfContentWriter

enter image description here

這是在生成的PDF(運行調試時詳細模式)的區別:

enter image description here

其中導致正確呈現的PDF:

enter image description here