保存为PDF时,WPF DataGrid GridLines不可见

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保存为PDF时,WPF DataGrid GridLines不可见相关的知识,希望对你有一定的参考价值。

我正在使用DataGrid来表示WPF应用程序中的一些数据。在我正在使用PDFSharp保存将DataGrid转换为PDF的特定WPF窗口的功能中,我遇到的问题是,当以较小的查看百分比查看保存的PDF时,DataGrid GridLines不可见。 (请参阅附图,仅当PDF视图设置为139%时,GridLines才可见。但是,在较小的视图%中,某些网格线会被省略。)

  1. 66.7%
  2. 75%
  3. 100%
  4. 139%

这是PDF保存代码: -

MemoryStream lMemoryStream = new MemoryStream();
Package package = Package.Open(lMemoryStream, FileMode.Create);
var doc = new System.Windows.Xps.Packaging.XpsDocument(package);
XpsDocumentWriter writer = System.Windows.Xps.Packaging.XpsDocument.CreateXpsDocumentWriter(doc);

VisualBrush sourceBrush = new VisualBrush(this);
DrawingVisual drawingVisual = new DrawingVisual();

using (var drawingContext = drawingVisual.RenderOpen())
{
    drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(this.ActualWidth, this.ActualHeight)));
}

writer.Write(drawingVisual);
doc.Close();
package.Close();

var pdfXpsDoc = PdfSharp.Xps.XpsModel.XpsDocument.Open(lMemoryStream);
XpsConverter.Convert(pdfXpsDoc, sFileName, 0);

我认为它与视觉效果的质量有关。然后我尝试了这个片段,我正在使用DrawImage以更高的分辨率制作视觉效果。这是片段: -

MemoryStream lMemoryStream = new MemoryStream();
Package package = Package.Open(lMemoryStream, FileMode.Create);
var doc = new System.Windows.Xps.Packaging.XpsDocument(package);
XpsDocumentWriter writer = System.Windows.Xps.Packaging.XpsDocument.CreateXpsDocumentWriter(doc);

double dpiScale = 600.0 / 96.0;
var renderBitmap = new RenderTargetBitmap(Convert.ToInt32(this.Width * dpiScale),
                       Convert.ToInt32(this.Height * dpiScale),
                       600.0,
                       600.0,
                       PixelFormats.Pbgra32);
renderBitmap.Render(this);
var visual = new DrawingVisual();
using (var dc = visual.RenderOpen())
{
    dc.DrawImage(renderBitmap, new Rect(0, 0, this.Width, this.Height));
}                

writer.Write(visual);
doc.Close();
package.Close();

var pdfXpsDoc = PdfSharp.Xps.XpsModel.XpsDocument.Open(lMemoryStream);
XpsConverter.Convert(pdfXpsDoc, _pdfFileName, 0);

这个片段正在工作,因为即使在较小的查看百分比中网格线也可见,但它使我的应用程序停留在PDF保存操作,并且它还会抛出System.OutofMemoryException,并显示消息“内存不足以继续执行程序”。但是,应用程序不会崩溃。

为了检查PDF查看器的行为,我在MS Word中生成了一个包含多行和多列的表,并将其另存为PDF。在这种情况下,即使在较小的观察百分比下,表格网格线也清晰可见。

谁能帮我这个?

答案

我假设第一个代码片段以矢量格式创建了一个表(您不提供允许验证这一点的PDF)。

第二个代码段尝试创建位图图像(栅格格式)。

无论哪种方式:对于矢量和光栅图像,它依赖于PDF查看器是否可见细线。 Adobe Reader有许多选项(如“增强细线”,“平滑线条艺术”,“平滑图像”),这些选项将对实际显示产生影响 - 在客户端计算机上设置,无需在PDF中设置。

我假设您使用MS Word进行的测试也创建了一个矢量格式的表格,但可能使用较粗的线条。所以这个测试没有任何证据。

以上是关于保存为PDF时,WPF DataGrid GridLines不可见的主要内容,如果未能解决你的问题,请参考以下文章

WPF拖动DataGrid滚动条时内容混乱的解决方法

WPF Grid布局 实现DataGrid控件宽充满布局

wpf Grid 样式怎么设置

WPF图片,DataGrid等实现圆角

WPF DataGrid:使单元格只读

WPF DataGrid:使单元格只读