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

Posted

技术标签:

【中文标题】在 C# 中绘制和打印复杂文档(改进/替换我的 PrintDocument)【英文标题】:Drawing and Printing complex document in C# (improving/replacing my PrintDocument) 【发布时间】:2013-04-07 15:20:22 【问题描述】:

我正在尝试用 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 的网络服务器上运行。 (如果这就是我所需要的,我可以打包几个 dll,但我不确定。)

所以我正在寻找你们所有好人的想法。

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

【问题讨论】:

您是否考虑过 Visual Studio 中的报表设计器?它将允许您在所见即所得的编辑器中完成一些渲染繁忙的工作,它会处理您的 PDF 和 IMAGE 要求。 msdn.microsoft.com/en-us/library/bb558708.aspx 这是一个非常常见的要求。有很多可用的报告生成器和 pdf 编写器解决方案。您需要去购物才能找到最符合您的要求和预算的产品,我们无法为您做到这一点。这也是购物问题在 SO 上不受欢迎的原因。 【参考方案1】:

试试FlowDocument,也可以看看这个帖子:Printing Flow Document using WPF PrintDialog.

【讨论】:

以上是关于在 C# 中绘制和打印复杂文档(改进/替换我的 PrintDocument)的主要内容,如果未能解决你的问题,请参考以下文章

C#实现打印与打印预览功能

使用 C# 在复杂的 JSON 数组中查找和打印重复项

在 C# 中打印由字体生成的 Pdf 文档条码

用c#替换word文档中的占位符

使用 c# 编辑 HTML 并替换其中的某些文本

如何插入数据 url/二进制文件以替换 libreoffice writer 文档中的图像?