用C#创建可打印的内容

11

请问有没有简单的方法可以创建打印文件呢?目前我只是编写 HTML 脚本,但我想知道是否有更简便的方法可以让我对正在打印的内容拥有更多控制权?类似于 Access 打印输出或 Excel 打印输出 - 我可以决定如何布局并通过编程“邮件合并”细节。

基本上,我想创建一个可以包含表格的打印文档,并且每个记录的长度可能因外键数量而长或短(例如,一个员工今天可能有 10 个任务,也可能只有 3 个。我想创建一个能够生成并打印这些文档的工具)。

有什么想法/建议/意见吗?谢谢!

编辑:哇,感谢所有回复!对于这个特定任务,FlowDocuments 似乎是最接近我实际需求的,所以我会试用一下。无论如何,现在我有了几个非常好的选择。

编辑 2:经过一些尝试,iTextSharp 成为了我的选择。对于未来有疑问的人,这是一个链接到一个很棒而简单的教程:http://www.mikesdotnetting.com/Category/20

再次感谢!

10个回答

8

4

你可以使用FlowDocuments来实现。在MSDN上查看概述,链接如下: http://msdn.microsoft.com/zh-cn/library/aa970909.aspx,看看是否符合你的需求。它们很容易打印并且可以序列化为xaml格式。可能不完全符合你的要求,但是它们非常有用。


加上我的一份也!这是一个很棒的工具!我不知道WPF有这个! - netmajor

3

1
就像David一样,我也推荐使用I Text Sharp ;) 使用它创建PDF文档非常简单 ;) 我在ASP.NET项目中使用它。它有很多选项来格式化PDF文件,在我的示例中我只使用了基本的功能 ;)
    string file = @"d:\print.pdf";  //path to pdf file
    Document myDocument = new Document(PageSize.A4.Rotate());        
    PdfWriter.GetInstance(myDocument, new FileStream(file, FileMode.Create));
    myDocument.Open();
    //data to save in pdf- unimportant!
    Opiekun obiekun = (from opiekunTmp in db.Opiekuns where opiekunTmp.idOpiekun == nalez.Dziecko.idOpiekun select opiekunTmp).SingleOrDefault();
    Dziecko dzieckoZap = (from dzieckoTmp in db.Dzieckos where dzieckoTmp.idDziecko == nalez.idDziecko select dzieckoTmp).SingleOrDefault();
    //some info about font
    BaseFont times = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, BaseFont.EMBEDDED);
    Font font = new Font(times, 12);
    myDocument.Add(new Paragraph("--------------------------Raport opłaty--------------------------",font));
    myDocument.Add(new Paragraph("Data rozliczenia: " + (((TextBox)this.GridViewOplaty.Rows[e.RowIndex].Cells[8].Controls[0]).Text), font));
    myDocument.Add(new Paragraph("Płatnik: " + obiekun.Imie + " " + obiekun.Nazwisko, font));
    myDocument.Add(new Paragraph("Dziecko: " + dzieckoZap.Imie + " " + dzieckoZap.Nazwisko, font));
    myDocument.Add(new Paragraph(""));
    myDocument.Add(new Paragraph("Data             Podpis płatnika: " + obiekun.Imie + " " + obiekun.Nazwisko, font));
    myDocument.Add(new Paragraph(""));
    myDocument.Add(new Paragraph("  ...........       ................................."));
    myDocument.Close(); //we close the pdf and open
    System.Diagnostics.Process.Start(file); //and open our file if You want that ;)

1

如果您使用PDF或XPS生成器,它仍然需要您定义文档组成,就像编写HTML脚本一样,因此我认为它除了创建的文件是印刷就绪格式之外,并没有给您带来更多价值。

您需要的是可以设计模板并填写空白的东西,因此我建议您选择Word或Excel自动化,否则请查看一些轻量级报告生成库。我遇到了这个,也许值得一看。 http://www.fyireporting.com/


0
如果你正在寻找一种非常简单的创建文档的方法(可能不是最好的,但肯定很容易),你可以使用书签设置 Word 文档,并将数据插入到书签 通过代码,所以我猜这对 Excel 也适用(如果它们有书签的话?):
编辑:这里有一个快速的 C# 翻译(已在 VB 中测试,但未在 C# 中测试):
Word.Application oWord = default(Word.Application);
Word.Document oDoc = default(Word.Document);

oWord = Interaction.CreateObject("Word.Application");
oWord.Visible = false;

oDoc = oWord.Documents.Add(Directory + "\\MyDocument.dot");

oDoc.Bookmarks("MyBookmark").Range.Text = strBookmark;

oDoc.PrintOut();
oDoc.Close(Word.WdSaveOptions.wdDoNotSaveChanges);
oDoc = null;
oWord.Application.Quit();
oWord = null;

是的,但有时您不想安装Office...特别是如果您的服务器正在动态渲染文档。 - Kris Krause
在他的问题中,他说“类似于Access打印或Excel打印”,所以我猜他有Office软件。我知道这不是首选方法,但如果您需要非常快速地组合一些东西(比如5分钟内),这样做会容易得多。 - Seth Moore
1
C#中的Word文档比VB更难处理,目前而言。我建议等待C# 4发布,因为它承诺提供更好的支持。 - Chris Conway
看起来如果你只是插入书签(这就是我在做的事情),自从VS 2005以来两者完全相同:http://msdn.microsoft.com/en-us/library/ad6ks7k0(VS.80).aspx - Seth Moore

0

5
说XPS是最好的方式甚至首选方式,这是一个非常大胆的说法。我完全不同意!在我看来,PDF是首选方式,因为它具有平台独立性和更广泛的使用。虽然XPS可以实现Vista和7用户的目标,但它不是最好的方式。 - Chris Conway
祝你好运,无论是在XP、Mac还是Linux上。 - Jerod Venema
6
我不认为我曾经收到或下载过任何人发来的XPS文档。从来没有。通常情况下是:“糟糕,我错把打印机选成了微软XPS文档写入者,而不是CutePDF。” - Mark Carpenter
我之前说错了,我并不是在建议发送XPS文件,而是说你可以在.NET中使用它的基本功能来简化结构化内容的打印。 - Bobby

0
我使用Excel XML格式从网站创建打印输出。基本上这意味着您不必使用Office API来生成文档(这可能很麻烦,并且需要在Web服务器上安装额外的库)。相反,您可以只需取一个XML模板,使用XPath、LINQ to XML或其他技术将数据插入到模板中,然后将其流式传输给用户,他们就可以打印它。
生成模板很容易。您只需使用Excel创建文档,然后以“XML电子表格”格式保存即可。XML有点压抑,但并不可怕。
XML电子表格格式的文档在此处:
http://msdn.microsoft.com/en-us/library/aa140066%28office.10%29.aspx 请注意,文档适用于Excel 2002。该格式在较新版本的Excel中会发生变化,但向后兼容。

0

我们使用ActiveReports。它非常容易定义您的布局,并且可以打印和导出多种格式,如pdf、rtf、excel、tiff等。


0

我以前做过单词和PDF生成的事情,pdfsharp(@Kris)对于PDF生成的支持非常好,我会在使用办公自动化之前使用它。

我希望我没有误读您的需求,但与其导出特定格式然后触发打印功能,我现在会重新考虑普通的浏览器打印。过去,浏览器打印的可怕限制意味着打印是一种糟糕的体验(没有缩小到适合页面等)。但是,现代浏览器具有足够的打印支持,可以接受简单的工作。

我刚刚在Firefox 3.5.8和IE8中检查了打印此页面的情况,两者都支持缩小到适合页面,只要您(可能是内部)的受众保证拥有现代浏览器,简单的打印样式表就可以直接从浏览器生成漂亮的工作表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接