PDFSharp转换问题

sal*_*e55 7 pdfsharp

使用缩放变换在不同比例下绘制时发现了PDFSharp的问题.

在此示例中,我们绘制了两个不同比例的矩形,从中生成XPS FixedDocumentSequence,最后使用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);
Run Code Online (Sandbox Code Playgroud)

完整的程序,可以发现这里和VS的解决方案在这里.

预计红色矩形将与蓝色矩形的右上角对齐.这就是我们在查看生成的XPS时得到的结果:

XPS截图

但是在生成的PDF中,我们得到了两个矩形之间的差距.

在此输入图像描述

特写

当从原点绘制很长的路时,问题最明显,在这个例子中,红色矩形以1:85的比例放置在160000; 130000.从绘制的原点开始,间隙会变得越大,可能是精度/舍入误差吗?

我试图解决这个问题没有成功.任何帮助找到原因将不胜感激!注意,我不确定问题是PDFSharp渲染还是XPS转换.

我正在使用PDFSharp 1.31(较新的版本不包括XPS支持).

此处提供完整的Visual Studio解决方案(包括PDFSharp lib).

sal*_*e55 8

找到原因,PDFSharp在生成PDF时将转换矩阵值四舍五入到4位小数,这在这种情况下是不够的.

为了提高精度,我在4到8位的占位符中改为PdfContentWriter:

在此输入图像描述

这是生成的PDF(运行调试时的详细模式)的差异:

在此输入图像描述

这导致正确呈现的PDF:

在此输入图像描述