将WPF窗口打印到PDF而无需打印对话框

vlurs2pr  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(228)

正在开发一个创建采购订单的应用程序。我只是使用了一个wpf窗口作为最终文档的模板,我最初使用PrintDialog(),对缩放进行了一些调整,然后将窗口的网格传递给PrintVisual()并通过对话框。然而,它不适用于我的应用程序,因为最终的文档需要自动保存到一个特定的导演,而无需用户输入。经过一番努力,试图找到一个解决方案,我已经能够拼凑在一起:

public void printChartsAsPrintDoc()
        {
            Grid datagrid = pOTemplate.g;
            try
            {
                RenderTargetBitmap rendertargetbitmap = new RenderTargetBitmap((int)datagrid.ActualWidth, (int)datagrid.ActualHeight, 96, 96, PixelFormats.Pbgra32);
                rendertargetbitmap.Render(datagrid);
                System.Windows.Media.Imaging.PngBitmapEncoder bitmapencoder = new PngBitmapEncoder();
                bitmapencoder.Frames.Add(BitmapFrame.Create(rendertargetbitmap));
                MemoryStream stream = new MemoryStream();
                bitmapencoder.Save(stream);
                System.Drawing.Image i = System.Drawing.Image.FromStream(stream);
                loadPOList(dt2 as System.Data.DataTable);
                string x = "test";
                if (tbDocumentNumber.Text != null)
                {
                    x = tbDocumentNumber.Text;
                }
                Directory.CreateDirectory(finalDocPath + docCount + "-" + x + " " + CurrentDocument.GetSendToContact().raw + "TESTING IGNORE" + @"\");
                PrintDocument doc = new PrintDocument()
                {
                    PrinterSettings = new PrinterSettings()
                    {
                        PrinterName = "Microsoft Print to PDF",
                        Collate = true,
                        PrintToFile = true,
                        
                        PrintFileName = finalDocPath + docCount + "-" + x + " " + CurrentDocument.GetSendToContact().raw + "TESTING IGNORE" + @"\" + docCount + "-" + x + " " + CurrentDocument.GetSendToContact().raw + ".pdf",
                    }
                };
                doc.DefaultPageSettings.Landscape = true; //or false!
                doc.PrintPage += (sender, args) =>
                {
                    System.Drawing.Rectangle m = args.MarginBounds;

                    if ((double)i.Width / (double)i.Height > (double)m.Width / (double)m.Height) // image is wider
                    {
                        m.Height = (int)((double)i.Height / (double)i.Width * (double)m.Width);
                    }
                    else
                    {
                        m.Width = (int)((double)i.Width / (double)i.Height * (double)m.Height);
                    }
                    args.Graphics.DrawImage(i, m);
                };
                doc.Print();
                WriteToBinaryFile<DocumentData>(@"C:\Users\Martin Janda\Desktop\docdata.dd", CurrentDocument);
                UpdatePOList();
                resetDoc();

                SendSupportEmail();

                MessageBox.Show("Document has been created.");
            } catch (Exception ex)
            {
                MessageBox.Show("Printing failed, please generate a document first." + ex);
                return;
            }
           

        }

然而,我有问题让图像占据整个PDF页面,分辨率看起来也不太好,最可悲的是,因为我必须转换为图像,以便有一些我可以实际传递给printDocument(),这样我就可以处理所有的打印编程; PDF中的文本不再是可选的.
所以我想我会问这里是否有人有这样的经验,无论是如何迫使我的位图占据整个pdf/或如果有一种方法直接打印网格到pdf。任何想法或建议将不胜感激。
P.S.我试过使用pdfsharp(v 1.31)转换为xml然后xml到pdf,但我完全无法让它工作,因为允许此功能的唯一版本是旧的,代码充满了错误,无法解决,因为有直接不存在的名称,如XImage。

k2arahey

k2arahey1#

如果您想避免图像转换步骤并直接将网格打印到PDF,则可以使用MigraDoc和PdfSharp。首先,确保您有这些库的必要引用和导入。

using PdfSharp.Drawing;
using PdfSharp.Pdf;

public void PrintGridToPdf(Grid datagrid, string filePath)
{
    // Create a PDF document
    PdfDocument document = new PdfDocument();
    document.Info.Title = "Purchase Order";

    // Create a PDF page
    PdfPage page = document.AddPage();
    XGraphics gfx = XGraphics.FromPdfPage(page);

    // Measure the size of the grid
    Size gridSize = new Size((int)datagrid.ActualWidth, (int)datagrid.ActualHeight);

    // Render the grid to the PDF page
    XImage image = RenderToImage(datagrid, gridSize);
    gfx.DrawImage(image, 0, 0);

    // Save the PDF document to the specified file
    document.Save(filePath);
}

private XImage RenderToImage(UIElement element, Size size)
{
    // Render the UI element to a bitmap
    RenderTargetBitmap renderTarget = new RenderTargetBitmap(size.Width, size.Height, 96, 96, PixelFormats.Pbgra32);
    renderTarget.Render(element);

    // Convert the bitmap to an XImage (PDF image)
    using (MemoryStream stream = new MemoryStream())
    {
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(renderTarget));
        encoder.Save(stream);
        return XImage.FromStream(stream);
    }
}

您可以使用网格和所需的文件路径调用PrintGridToPdf,直接从网格创建PDF,而无需转换为图像。
printGridToPdf(datagrid,“path/to/save/purchase_order.pdf”);

相关问题