将wpf窗口打印到pdf文件

时间:2011-11-22 19:34:39

标签: wpf visual-studio-2010 pdf

我需要从wpf窗口构建一个pdf文件。该窗口包含一个画布,其中包含一些绘图和一些文本框以及带有数据的标签。

朋友告诉我使用水晶报告,但对我来说似乎不是一个好的解决方案....

我想在画布上打印图像,并用texbox和标签的数据写一些行。

我需要一个非付费解决方案。

我该怎么办?

2 个答案:

答案 0 :(得分:5)

我使用名为iTextSharp的免费工具找到了解决此问题的方法(编辑:iTextSharp不是免费用于商业用途 - 对于错误信息感到抱歉)。实际上,我需要将WPF FixedDocument转换为PDF,因此这与您想要的内容略有不同,但也许它也可以帮助您。基本上,方法是采用WPF固定文档(这实际上是XPS格式)并将其转换为位图图像。然后使用iTextSharp的PdfWriter类将此图像作为页面添加到PDF文档中。我尝试了其他几种方法,包括一个名为gxps的免费工具,但这种方法最适合我。

以下是我的代码中的示例。

using iTextSharp.text;
using iTextSharp.text.pdf;
.
.
.
// create an iTextSharp document
Document doc = new Document(PageSize.LETTER, 0f, 0f, 0f, 0f);
PdfWriter.GetInstance(doc, new FileStream("C:\\myFile.pdf", FileMode.Create));
doc.Open();

// cycle through each page of the WPF FixedDocument
DocumentPaginator paginator = myFixedDocument.DocumentPaginator;
for (int i = 0; i < paginator.PageCount; i++)
{
    // render the fixed document to a WPF Visual object
    Visual visual = paginator.GetPage(i).Visual;

    // create a temporary file for the bitmap image
    string targetFile = Path.GetTempFileName();

    // convert XPS file to an image
    using (FileStream outStream = new FileStream(targetFile, FileMode.Create))
    {
        PngBitmapEncoder enc = new PngBitmapEncoder();
        enc.Frames.Add(BitmapFrame.Create(CreateBitmapFromVisual(visual, 300, 300)));
        enc.Save(outStream);
    }

    // add the image to the iTextSharp PDF document
    using (FileStream fs = new FileStream(targetFile, FileMode.Open))
    {
        iTextSharp.text.Image png = iTextSharp.text.Image.GetInstance(System.Drawing.Image.FromStream(fs), System.Drawing.Imaging.ImageFormat.Png);
        png.ScalePercent(24f);
        doc.Add(png);
    }
}
doc.Close();

以下是如何在C#中创建FixedDocument:

using System.Windows.Documents;
using System.Windows.Documents.Serialization;
using System.Windows.Markup;

// create an instance of your XAML object (Window or UserControl)
var yourXAMLObj = new YourXAMLObject();

// create a FixedDocument and add a page of your XAML object
var fixedDocument = new FixedDocument();
fixedDocument.DocumentPaginator.PageSize = new Size(96 * 8.5, 96 * 11);

PageContent pageContent = new PageContent();
FixedPage fixedPage = new FixedPage();
fixedPage.Children.Add(yourXAMLObj);
fixedDocument.Pages.Add(pageContent);
((IAddChild)pageContent).AddChild(fixedPage);

答案 1 :(得分:2)

我希望这个图书馆可以帮助你。

PDFsharp
是一个用于处理PDF文件的.NET库。您可以使用GDI +中已知的绘图例程创建PDF页面。几乎任何可以用GDI +完成的事情都可以与PDFsharp一起使用。 PDFsharp仅支持基本文本布局,并且不会自动创建分页符。相同的绘图程序可用于屏幕,PDF或元文件。

http://www.pdfsharp.net/MainPage.ashx

PDFsharp在麻省理工学院许可下发布。

  • PDFsharp是开源的。
  • 您可以在应用程序中复制,修改和集成PDFsharp的源代码,而不受任何限制。
  • 这也适用于商业产品(开源和闭源)。

好吧,它适用于gdi +,但也许就足够了。