正在开发一个创建采购订单的应用程序。我只是使用了一个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。
1条答案
按热度按时间k2arahey1#
如果您想避免图像转换步骤并直接将网格打印到PDF,则可以使用MigraDoc和PdfSharp。首先,确保您有这些库的必要引用和导入。
您可以使用网格和所需的文件路径调用PrintGridToPdf,直接从网格创建PDF,而无需转换为图像。
printGridToPdf(datagrid,“path/to/save/purchase_order.pdf”);