使用 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

随心所欲导出你的 UI 界面到 PDF 文件的更多相关文章

  1. Altium Designer 只导出PCB元器件及标号的PDF文件的方法

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 作者:struct_mooc 博客地址:https://www.cnblogs.com/stru ...

  2. WEB UI 界面打印PDF

    项目上看到的,感觉很厉害的样子,所以要存档... 说一下思路:画的SF,然后在WDA里调用SF,产生PDF数据流,然后在WDA里用PDF展示出来,UI调用... COMPONENTCONTROLLER ...

  3. 阿里云语音合成(汉语英语)带UI界面的小程序(python)

    一,项目说明 将汉文转汉语.英文转英语,同时又有逗号<###English###>,<,,,>和句号<...>标志符用于文件处理.其中英文包含在### 英文 ### ...

  4. .Net导出pdf文件,C#实现pdf导出

    最近碰见个需求需要实现导出pdf文件,上网查了下代码资料总结了以下代码.可以成功的实现导出pdf文件. 在编码前需要在网上下载个itextsharp.dll,此程序集是必备的.楼主下载的是5.0版本, ...

  5. pdf文件的导入导出

    下面的代码自己本人没有尝试过,只是用来做记录,用到时候再说! 最近碰见个需求需要实现导出pdf文件,上网查了下代码资料总结了以下代码.可以成功的实现导出pdf文件. 在编码前需要在网上下载个itext ...

  6. Django分析之导出为PDF文件

    最近在公司一直忙着做exe安装包,以及为程序添加新功能,好久没有继续来写关于Django的东西了….难得这个周末清闲,来了解了解Django的一些小功能也是极好的了~ 那今天就来看看在Django的视 ...

  7. ReportViewer 不预览,直接导出 PDF文件

    作为笔记记着,以免以后再到处找资料 1. 在不预览的情况下导出文件 先看一个方法说明,想知道ReportViewer支持导出哪些文件类型,在Render方法说明中就有描述 // // Summary: ...

  8. Studio for Winforms FlexGrid:导出到 PDF 文件

    本篇文章主要介绍如何导出 FlexGrid 到 PDF 格式文件.本文源于论坛用户,有多个用户提出如何把 FlexGrid 导出到 PDF 文件的需求.在这里共享给大家. 当前,ComponentOn ...

  9. 文本导出到pdf文件

    程序中数据导出是经常有的需求,今天学习把文本导出到pdf文件.主要是用QPrinter,QPainter TextEditToPdf::TextEditToPdf(QWidget *parent, Q ...

随机推荐

  1. Spring3系列9- Spring AOP——Advice

    Spring3系列9- Spring AOP——Advice Spring AOP即Aspect-oriented programming,面向切面编程,是作为面向对象编程的一种补充,专门用于处理系统 ...

  2. Android之 -WebView实现离线缓存阅读

    前言 本篇博客要实现的是一个离线下载和离线阅读的功能,这是很多阅读类app都常见的一个功能,典型的应用就是网易新闻.什么是离线下载?其实这个概念是比较模糊,是离线之后下载呢,还是下载之后离线,但稍微有 ...

  3. 配置新系统(Win7 x64)

    新装了一个Win7 x64系统.总结了一些系统配置需要注意的地方. 1. C盘空间 发现C盘被用去了50G的空间,在什么软件都没装的情况下,被用去这么多,感到不可思议. 打开控制面板->文件夹选 ...

  4. Oracle10g新特性——正则表达式 - 转

    在进行查询时,有时候需要按照一定的特殊规则来查找某个字符串,比如,你可能需要查询第三位为5-8,最后四位为’8888’的所有电话.在9i之前,你可能需要写一个很复杂的条件:Select usernam ...

  5. 『Golang』跨平台TUI(基于文字的用户界面)库Terbox-Go文档翻译

    原文 package termbox import "github.com/nsf/termbox-go" termbox-go 是一个用于创建跨平台TUI(基于文本的用户界面)的 ...

  6. 那些年做过的 .NET Web 项目和 iOS 之路的一些思考

    从2010年3月份出来工作到2015年初,做过的大大小小的 .NET Web 项目如下: (1)售楼系统产品    「Role: Team Member」 (2)中弘合同管理系统    「Role: ...

  7. MAC自带的SVN进行升级

    1.下载高版本svn:http://www.wandisco.com/subversion/download 2.安装 3. #1.在.bash_profile添加export PATH=/opt/s ...

  8. POJ 2082 Terrible Sets

    Terrible Sets Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2747   Accepted: 1389 Des ...

  9. 同程旅游网开放平台SDK开发完成

    最近利用业余时间,使用了同程旅游网的开放平台,并对大部分的方法进行了调用,发现有很多不好用的地方,比如 1.同一个开放平台居然有几个调用地址,景区调用http://tcopenapi.17usoft. ...

  10. XPS 15 9530使用Windows10频繁发生Intel HD Graphics 4600驱动奔溃的一种解决方法

    本人使用XPS 15 9530.集成显卡为Intel HD Graphics 4600.操作系统Windows 10 Pro,使用过程当中经常会发生集成显卡奔溃的问题,错误提示如下: Display ...