PDFSharp转换问题

问题描述:

使用缩放转换在使用不同比例绘制时发现了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

找到原因,PDFSharp在生成PDF时,将变换矩阵值舍入为4位小数,在这种情况下PDF不足。

为了提高精度我从4至8位的占位符改变在PdfContentWriter

enter image description here

这是在生成的PDF(运行调试时详细模式)的区别:

enter image description here

其中导致正确呈现的PDF:

enter image description here