用C#绘制和打印复杂文档(改进/替换我的PrintDocument)

我试图在C#中生成一个主要用于打印的文档。 基本上它是一个表单,我将从数据库中的对象填充值。

我过去使用的代码是丑陋的,冗长的,写入的痛苦和更糟糕的维护。

public class MyDoc : PrintDocument { private MyContainer _myObject; //Inherits from list. private int PageCount() { return (int)Math.Ceiling(_myObject.Count / 5f); } protected override void OnPrintPage(PrintPageEventArgs e) { Graphics g = e.Graphics; g.PageUnit = GraphicsUnit.Millimeter; Font bigFont = new Font("Arial", 16, FontStyle.Regular, GraphicsUnit.Point); Font mediumFont = new Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Point); Font smallFont = new Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Point); Font smallNumberFont = new Font("Courier New", 7, FontStyle.Regular, GraphicsUnit.Point); Pen linePen = new Pen(Brushes.Black, 0.2F); int rowPosition = 5; int rowIncrement = 9; g.DrawString(string.Format("Page {0} of {1}", _pageNumber, PageCount()), smallFont, Brushes.Black, 175, rowPosition); rowPosition = 15; g.DrawImage(Image.FromFile("myfile.jpg"), 127, rowPosition); g.DrawString("Name:", smallFont, Brushes.Black, 3, rowPosition); g.DrawString(_myObject.Name, smallBoldFont, Brushes.Black, 50, rowPosition); rowPosition += rowIncrement; //Sub-Items Table Header g.DrawRectangle(linePen, 3, rowPosition, 35, 10); g.DrawRectangle(linePen, 38, rowPosition, 85, 10); g.DrawRectangle(linePen, 123, rowPosition, 25, 10); g.DrawRectangle(linePen, 148, rowPosition, 20, 10); g.DrawRectangle(linePen, 168, rowPosition, 25, 10); foreach (var i in _myObject) { //Draw a grid and write out all details of everything in the collection. //If there are 2 many, stop and we will create a page 2. } //Write Standard page footer //etc etc. } } 

另外一个新要求,我需要将其保存为pdf或图像。

基本上我有300-500行代码来编写一个看起来不错的文档。

我还有更多要做的事情非常相似,我需要一个更好的方法!


我想到了:

XAML – 然后数据绑定我需要填写的属性。不知道如何处理它传播到2页或更多页面。

Word Interop – 我不知道是否可以。 它运行在未安装office的Web服务器上。 (如果我需要的话,我可以打包几个dll,但我不确定。)

所以我正在寻找所有优秀人才的想法。

我不想使用外部库,但如果这是最好的方式,它需要是免费的并且拥有良好的许可:)

尝试使用FlowDocument并查看此文章: 使用WPF PrintDialog打印流文档。

在此处输入图像描述

在此处输入图像描述