WPF矢量打印 - 将DrawingGroup作为Vector发送到打印机

时间:2015-09-23 20:19:42

标签: wpf xaml vector printing raster

我想使用WPF以编程方式打印。但是,我需要将所有材料以矢量图形而不是光栅图形发送到打印机。

主要问题是,我无法让WPF打印矢量图形,打印件总是被栅格化。

我使用SharpVectors,它将.svg文件转换为am .xaml绘图组。然后将该绘图组插入到一个图像到一个flowdocument中,最后我使用XPSDocumentWriter发送flowdocument进行打印。

每次都模糊不清。我将打印与adobe Illustrator打印的.svg文件进行比较。日夜的品质。

有没有办法拍摄绘图组并始终将其打印为矢量?

我正在为此付出赏金。您必须提交将以下绘图组作为矢量图形发送到打印机所需的c#代码,这必须是可重现的以获得赏金。此外,在光栅化图像后简单地增加DPI不符合答案。没有矢量打印 - 没有赏金。

https://drive.google.com/file/d/0B-M6Yes83t08V0ZOOEp1Q3dEYjA/view?usp=sharing Google Drive DrawingGroup xaml

1 个答案:

答案 0 :(得分:2)

是的,你可以! ;-) 我想你最好忘记图片并使用FixedDocument

首先创建一个类,重写OnRender:

public partial class MapDrawingElement : FrameworkElement
{
    public MapDrawingElement()
    {
        InitializeComponent();
    }
    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);
        var res = Resources["drawingGroup1"] as DrawingGroup;
        if (res != null)
            drawingContext.DrawDrawing(res);
    }
}

该类在其资源部分中有一个drawingGroup1资源:

<FrameworkElement x:Class="DemoFixedpageDocument.MapDrawingElement"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="800" d:DesignWidth="800">
    <FrameworkElement.Resources>
        <DrawingGroup x:Key="drawingGroup1">
... here your xaml 16k lines ! ...
        </DrawingGroup>
    </FrameworkElement.Resources>
</FrameworkElement>

Instanciate一个FixedDocument,并将控件与地图放在一个页面中:

public static class DocumentMaker
{
    public static FixedDocument GenerateFixedDocument()
    {
        FixedDocument fixedDocument = new FixedDocument();
        PageContent pageContent1 = new PageContent();
        fixedDocument.Pages.Add(pageContent1);
        FixedPage page1 = new FixedPage();
        // PageContent : some text or an object can be added
        ((IAddChild)pageContent1).AddChild(page1);

        MapDrawingElement elt = new MapDrawingElement();
        page1.Children.Add(elt);
        return fixedDocument;
    }
}

然后你可以打印:

    PrintDocumentImageableArea imageArea = null;
    XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(ref imageArea);
    if (xpsdw != null)
    {
        xpsdw.Write(DocumentMaker.GenerateFixedDocument());
    }

您还可以打印预览或发送到XPS文件。

请参阅链接中的工作演示:

http://1drv.ms/1RefeuJ

此致