我想使用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
答案 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文件。
请参阅链接中的工作演示:
此致