使用 C1PDF 控件可以導出文件到 PDF 文件,結合 .NET 平臺特性你可以在任何客戶端生成自定義報表。你可以打印任何 UI 界面,例如 DataGrid 導出到 PDF。 在本篇文章中我們將闡述在 XAML 平臺中打印 UI 到 PDF 文件的通用方法。
打印 UI 界面到 PDF 文件,需要首先把 UI 界面導出到圖片,然后把圖片添加到 PDF 文件中。面讓我們來進入實戰部分。
導出UI到圖片
UI導出到 PDF 文件,最簡單明了的方法是把 UI 界面作為圖片插入到 PDF 文件中。每個平臺都支持把 UI 界面保存為圖片的接口。所以我們可以利用這些接口來獲取需要的圖片。接下來使用 C1PDF 控件,通過幾行簡單的代碼導出到 PDF。
Silverlight 平臺下我們使用 WriteableBitmap 類來渲染 UI 到圖片。通過 Render 方法即可生成圖片。這種方法不僅可以渲染某個控件,同時可以創建整個頁面。只需要把根節點賦值給構造函數即可。
// render element to image (Silverlight)
var img = new WriteableBitmap(element, null);
WPF 平臺下我們可以使用RenderTargetBitmap 類來渲染UI到圖片。代碼如下:
// render element to image (WPF)
RenderTargetBitmap rtbmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
rtbmp.Render(element);
需要注意的是 WinRT 平臺,使用的方法相同,但參數不同,代碼如下:
// render element to image (WinRT)
var renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(element);
好了,上面我們介紹了 XAML 平臺的導出圖片方法,接下來我們就可以把圖片插入到 PDF 文件了。
導出 UI 到 PDF 文件(WPF 和 Silverlight)
以下代碼創建了 C1PdfDocument 對象,繪制UI元素生成的圖片到PDF文件,保存到 PDF 文件。
// get stream to save to
var dlg = new SaveFileDialog();
dlg.DefaultExt = ".pdf";
var dr = dlg.ShowDialog();
if (!dr.HasValue || !dr.Value)
{
return;
}
// create document
var pdf = new C1PdfDocument(PaperKind.Letter);
pdf.Clear();
var img = new WriteableBitmap(CreateBitmap(content));
// if Silverlight, use below instead
// var img = new WriteableBitmap(content, null);
pdf.DrawImage(img, pdf.PageRectangle, ContentAlignment.TopLeft, Stretch.None);
// save document
using (var stream = dlg.OpenFile())
{
pdf.Save(stream);
}
MessageBox.Show(dlg.SafeFileName + " saved successfully!");
生成圖片的方法如下:
public BitmapSource CreateBitmap(FrameworkElement element)
{
int width = (int)Math.Ceiling(element.ActualWidth);
int height = (int)Math.Ceiling(element.ActualHeight);
width = width == 0 ? 1 : width;
height = height == 0 ? 1 : height;
// render element to image (WPF)
RenderTargetBitmap rtbmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
rtbmp.Render(element);
return rtbmp;
}
導出 UI 到 PDF 文件 (WinRT)
因為它涉及到C1Pdf的代碼是相同的,無論你使用何種平臺。但由于對WPF和Silverlight 和 WinRT 平臺的差異,在其中呈現的圖像,并將其保存到用戶的計算機上的代碼是完全不同的。下面是一些渲染UI內容為PDF格式在Windows Store應用程序(WinRT的XAML)中的代碼:
FileSavePicker savePicker = new FileSavePicker();
savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
savePicker.FileTypeChoices.Add("PDF (*.pdf)", new List(new string[] { ".pdf" }));
savePicker.DefaultFileExtension = ".pdf";
StorageFile file = await savePicker.PickSaveFileAsync();
if(file != null)
{
// create document
var pdf = new C1PdfDocument(PaperKind.Letter);
pdf.Clear();
// set document info
var di = pdf.DocumentInfo;
di.Author = "ComponentOne";
di.Subject = "C1.Xaml.Pdf demo.";
di.Title = "Export UI to PDF";
// create a bitmap from the UI element
var img = await CreateBitmap(panel);
// draw bitmap to PDF
pdf.DrawImage(img, pdf.PageRectangle, ContentAlignment.TopLeft, Stretch.None);
// save PDF file
await pdf.SaveAsync(file);
// notify user it's saved
MessageDialog dialog = new MessageDialog("File saved!");
await dialog.ShowAsync();
}
我們準備了三個平臺的 Demo 供你體驗效果:
C1PDF 控件下載鏈接:
http://www.gcpowertools.com.cn/products/componentone_studio_enterprise.htm
文章列表