Я тоже некоторое время боролся с этой проблемой. На этой неделе я снова начал исследовать проблему и начал писать небольшое тестовое приложение, чтобы изолировать проблему. Я смог запустить растеризацию всего за несколько операций рисования.
Четыре прямоугольника, эллипс и, если быть точным, линия.
static void Main(string[] args)
{
var printers = new LocalPrintServer().GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections });
PrintQueue defaultPrinter = LocalPrintServer.GetDefaultPrintQueue();
PrintQueue printerToUse = printers.FirstOrDefault(p => p.Name.Contains("PDFCreator")) ?? defaultPrinter; // Use PDFCreator if available.
PrintTicket ticket = printerToUse.DefaultPrintTicket;
XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printerToUse);
writer.Write(CreateVisual(), ticket);
}
private static Visual CreateVisual()
{
var visual = new DrawingVisual();
using (DrawingContext dc = visual.RenderOpen())
{
var pen = new Pen(Brushes.Black, 3);
var opacityBrush = new SolidColorBrush { Color = Colors.Violet, Opacity = 0.7 };
dc.PushClip(new RectangleGeometry(new Rect(20, 20, 150, 150)));
dc.DrawLine(pen, new Point(0, 0), new Point(200, 300));
dc.DrawEllipse(new SolidColorBrush(Colors.LightGreen), pen, new Point(50, 80), 50, 70);
dc.DrawRectangle(new SolidColorBrush(Colors.LightBlue), pen, new Rect(10, 100, 100, 100));
dc.DrawRectangle(new SolidColorBrush(Colors.LightPink), pen, new Rect(40, 120, 100, 100));
dc.DrawRectangle(new SolidColorBrush(Colors.LightGray), pen, new Rect(60, 140, 100, 100));
dc.DrawRectangle(opacityBrush, pen, new Rect(80, 160, 100, 100));
}
return visual;
}
Полное тестовое приложение можно загрузить с здесь (решение VS 2010).
Во время тестирования я печатаю на PDFCreator , виртуальном PDF-принтере для предотвращения массового использования бумаги. Но я получаю тот же результат с реальными физическими принтерами. Однако на этом примере трудно заметить разницу на бумаге, однако случаи реального мира могут быть более заметными ( pic1 , pic2 ).
Вот скриншот с результатом:
При увеличении PDF-файла вы видите, что прямоугольники и эллипсы больше не имеют векторного формата и становятся размытыми.
Условия растеризации
Кажется, это очень сложно определить. Я поделился тем же опытом, что и Boomhauer, что непрозрачность и отсечение, кажется, довольно часто вызывают растеризацию. И мой пример действительно включает в себя оба из них (вроде того, которые использовались специально при попытке инициировать растеризацию). Не сказать, что любой из них должен присутствовать для растеризации.
Имеет смысл, что непрозрачность может вызвать растеризацию, но некоторые другие тонкие изменения, которые, по вашему мнению, не имеют отношения к проблеме, могут фактически "предотвратить" растеризацию. Как изменение толщины пера в моем примере ( снимок экрана ). Другие изменения, которые каким-то образом удаляют условие растеризации, - это изменение порядка операций рисования, удаление любых операций и, конечно, удаление непрозрачности или отсечения.
Обход
Я обнаружил, что создание файла XPS и его печать из Microsoft XPS Viewer фактически приведет к выводу без растрового изображения, даже если используется точно такой же чертеж и принтер.
private static void GenerateXps()
{
var xpsDoc = new XpsDocument("wpf_printing_raster_test.xps", FileAccess.ReadWrite);
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
writer.Write(CreateVisual());
xpsDoc.Close();
}
Скриншот здесь .
Таким образом, вместо печати непосредственно из вашего кода, вы можете сгенерировать XPS-оч, а затем программно дать команду Microsoft XPS Viewer напечатать XPS для вас.
Это, конечно, хакерский и не оптимальное решение. Но мне было бы интересно, если у кого-нибудь есть хороший метод принуждения к печати из Microsoft XPS Viewer, если не найдено никакого исправления или реального решения (я еще не пробовал сам).
Мне также было бы интересно узнать, есть ли у кого-нибудь растеризованные распечатки даже при печати из Microsoft XPS Viewer.
В общем, я попытался загрузить XPS-файл в мое тестовое приложение и распечатать его ( код ). Но это не сработало, все равно получил растеризованную распечатку.
Решение
Не думаю, что это проблема с драйвером принтера. Когда происходит растеризация, она происходит на всех принтерах без исключения. Я пробовал 4-5 различных принтеров, от 100 HP 1020 до 6000 Konica Minolta C360 за несколько долларов и несколько виртуальных принтеров.
Обходной путь также указывает, что Microsoft XPS Viewer отправляет что-то другое в драйвер принтера, чем прямая печать WPF.
Мы должны действительно попытаться заставить Microsoft взглянуть на это, оно было зарегистрировано как bug еще в 2009 году, но ничего не произошло. Надеюсь, небольшой пример кода для воспроизведения проблемы поможет.