PDFSharp 转换问题
PDFSharp transform issue
发现使用比例变换以不同比例绘制时 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 and VS solution here。
红色矩形应该与蓝色矩形的右上角对齐。这就是我们在查看生成的 XPS 时得到的结果:
但在生成的 PDF 中,我们发现两个矩形之间存在间隙。
Close-up
当距离原点很远时,问题最为明显,在本例中,红色矩形位于 160000;130000 处,比例为 1:85。离原点越远差距越大,会不会是precision/rounding错误?
我试图解决这个问题,但没有成功。任何有助于找到原因的帮助将不胜感激!请注意,我不确定问题出在 PDFSharp 渲染还是 XPS 转换上。
我正在使用 PDFSharp 1.31(较新的版本不包括 XPS 支持)。
包含此示例(包括 PDFSharp 库)的完整 Visual Studio 解决方案可用 here。
找到原因,PDFSharp 在生成 PDF 时将转换矩阵值四舍五入到 4 位小数,这在这种情况下是不够的。
为了提高精度,我将 PdfContentWriter
中的占位符从 4 位更改为 8 位:
这是生成的 PDF 的区别(运行 调试时的详细模式):
导致正确呈现 PDF:
发现使用比例变换以不同比例绘制时 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 and VS solution here。
红色矩形应该与蓝色矩形的右上角对齐。这就是我们在查看生成的 XPS 时得到的结果:
但在生成的 PDF 中,我们发现两个矩形之间存在间隙。
Close-up
当距离原点很远时,问题最为明显,在本例中,红色矩形位于 160000;130000 处,比例为 1:85。离原点越远差距越大,会不会是precision/rounding错误?
我试图解决这个问题,但没有成功。任何有助于找到原因的帮助将不胜感激!请注意,我不确定问题出在 PDFSharp 渲染还是 XPS 转换上。
我正在使用 PDFSharp 1.31(较新的版本不包括 XPS 支持)。
包含此示例(包括 PDFSharp 库)的完整 Visual Studio 解决方案可用 here。
找到原因,PDFSharp 在生成 PDF 时将转换矩阵值四舍五入到 4 位小数,这在这种情况下是不够的。
为了提高精度,我将 PdfContentWriter
中的占位符从 4 位更改为 8 位:
这是生成的 PDF 的区别(运行 调试时的详细模式):
导致正确呈现 PDF: