如何从web服务生成要打印的XAML WPF文档

本文关键字:打印 XAML WPF 文档 web 服务生 | 更新日期: 2023-09-27 18:20:38

我有一个XAML WPF控件,我用数据填充它,然后允许用户从我们的WPF应用程序打印。

现在,我们需要能够从(无头)web服务填充和打印相同的文档。

我尝试添加我们的WPF项目作为引用,希望它能正常工作,但visual studio的行为就像找不到程序集(引用上的黄色警告图标,编译时找不到相关的命名空间),尽管双击它会成功地将我带到程序集的对象资源管理器。

我宁愿不只是从服务中启动GUI exe。如果可能的话,我更愿意无头处理。

有人这样做过吗?

如何从web服务生成要打印的XAML WPF文档

是的,我现在正在做这件事,这是我的代码。我还必须添加一些额外的代码,以便在一个单独的线程中运行它,该线程使用STA Apartment State作为一些控件所需的状态,不确定您是否也需要这样做。

(这段代码是用VB.NET编写的(别问了),但我使用了一个在线转换器,所以它是用c#编写的,所以stackoverflow的格式更好。)

不要更改屏幕DPI,因为这是窗口默认设置(也不要询问)。

private byte[] Render(FrameworkElement element)
{
    const double SCREEN_DPI = 96.0;
    const double TARGET_DPI = 300.0;
    // Setup the bounds of the image
    Rect bounds = new Rect(0, 0, element.Width, element.Height);
    element.Measure(bounds.Size);
    element.Arrange(bounds);
    element.UpdateLayout();

    // Create the target bitmap
    RenderTargetBitmap rtb = new RenderTargetBitmap(
        Convert.ToInt32(element.Width / SCREEN_DPI * TARGET_DPI),
        Convert.ToInt32(element.Height / SCREEN_DPI * TARGET_DPI),
        TARGET_DPI, TARGET_DPI, PixelFormats.Pbgra32);
    // Render the visual to the bitmap.
    rtb.Render(element);
    System.Windows.Media.Imaging.BitmapEncoder encoder;
    encoder = new System.Windows.Media.Imaging.PngBitmapEncoder();
    encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(rtb));
    var ms = new System.IO.MemoryStream();
    encoder.Save(ms);
    ms.Flush();
    ms.Seek(0, System.IO.SeekOrigin.Begin);
}