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

用C#绘制和打印复杂文档(改进/替换我的打印文档),c#,printdocument,C#,Printdocument,我正试图用C#制作一份文档,主要用于打印。 基本上,它是一个表单,我将在其中填写来自数据库对象的值 我过去使用的代码很难看,很长,编写起来很痛苦,维护起来更糟糕 public class MyDoc : PrintDocument { private MyContainer _myObject; //Inherits from list. private int PageCount() { return (int)Math.Ceiling(_myObje

我正试图用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,但我不确定。)

所以我想从你们这些好人那里得到一些想法

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

尝试并查看此帖子:


您是否考虑过Visual Studio中的报表设计器?它将允许您在WYSIWYG编辑器中完成一些渲染工作,并将处理您的PDF和图像需求。这是一个非常普遍的要求。大量的报表生成器和pdf writer解决方案可用。您将需要去购物,以找到一个最符合您的要求和预算,我们不能为您这样做。这也是为什么购物问题在某时是离题的。