【问题标题】:How to print information programmatically on a doc template?如何以编程方式在文档模板上打印信息?
【发布时间】:2025-12-21 04:20:13
【问题描述】:

我有一个用 C# 编写的应用程序,可以打印发票和工资单。客户给我发了一个模板,用于日常操作。我不知道如何打印到它,尽管我已经知道如何打印一个以编程方式制作的包含来自访问数据库的信息的文本文件。

如何打印这种模板上的信息? (这只是我 [在 Google 上找到][1] 的东西,是简单发票打印的理想选择)我的文档模板也有一个 LOGO..

【问题讨论】:

  • “文档模板”是什么意思?
  • 一个文档格式文件,应该在其中打印信息,这将使它像某种模板。现在我想以编程方式重新创建相同的模板并打印它

标签: c# printing documents


【解决方案1】:

在 Word 中通过邮件合并来完成。使用这种技术您可以创建 Word 文档。在文档内部,您可以为文本创建占位符。从代码中,你可以用你想要的任何东西填充占位符。

例如:

  1. 在word文档中输入ctrl + F9
  2. 右键单击字段和Edit field
  3. 选择MergeField
  4. 在字段名称类型FirstName
  5. 添加代码:

.

var document = new Document("document.docx");
var sqlCommand = "SELECT TOP 1 userName FirstName FROM Users";
var table = GetTable(sqlCommand, String.Empty);
document.MailMerge.Execute(table);

【讨论】:

  • 那么这里实际会发生什么?我打算打印的文本会打印在文档上吗?我已包含将包含在上述发票中的实际文本
  • 基本上你创建Word文档。在文档内部,您可以为文本创建占位符。从代码中你可以用你想要的任何东西填充占位符。
  • 哦!好的,我明白了,非常感谢!因此,我只需在代码中处理 Word 文档中的占位符,以便将信息放置在占位符正确的位置吗?有固定的占位符吗?还是我只是扫描整个文档以查找我创建的占位符然后替换它?
  • 我所说的“设置”是指用于处理占位符的“预定义”代码
  • 填充占位符的整个代码都在回答中。在示例代码中,我展示了如何创建名为 FirstName 的占位符。然后我进行sql查询,其中一列将被称为FirstName。这就是它识别文本放置位置的方式。当然,您可以创建多个占位符并将文本放置在您想要的位置。
【解决方案2】:

我一直在使用 PrintDocument 和 PrintPreview 对象。即使用 Graphics 类。调用 print 时,您会得到一个“PrintEventArgs e”对象。然后,您可以使用 e.Graphics 访问诸如 e.Graphics.DrawString、.DrawImage 等内容。

我构建了一个覆盖打印的完整打印对象类。所以我有一个详细信息框,它有不同的字体、标志、标题、法律术语等。每一个都有它自己的类。我将它们全部放在一个大列表中,然后调用 printThis(List);它将获取每个打印函数和坐标,并为我制作一个表格。

继承的对象

class formHdr : printObject
{
    private string headerText;

    public formHdr(string hText)
        : base()
    {
        headerText = hText;

    }

    public override void printThis(System.Drawing.Printing.PrintPageEventArgs e)
    {
        Graphics g = e.Graphics;
        g.DrawString(headerText, FRHEADER, Brushes.Black, BaseX, BaseY);

    }
}

基类

abstract class printObject
{
    protected Font FTHEADER;
    protected Font NRML;
    protected Font DETAIL;
    protected Font FRHEADER;
    protected Font DETHEADER;
    protected Font LEGAL;
    protected Font LEGAL2;

    public int baseX, baseY;
    public int boxSX, boxSY;

    public printObject()
    {
        baseX = 0;
        baseY = 0;
        boxSX = 0;
        boxSY = 0;
        FTHEADER = new Font("Arial", 12, FontStyle.Bold);
        NRML = new Font("Calibri", 10);
        DETAIL = new Font("Consolas", 8);
        FRHEADER = new Font("Arial", 16, FontStyle.Bold);
        DETHEADER = new Font("Calibri", 10, FontStyle.Bold);
        LEGAL = new Font("Arial", 8);
        LEGAL2 = new Font("Arial", 10);
    }

    public virtual void printThis(PrintPageEventArgs e) { }

对象创建

                mainHead = new formHdr("Bill of Lading/Weigh slip Original");
                mainHead.BaseX = 225;
                mainHead.BaseY = 20;
                bol.Add(mainHead);

也许这可以让你开始?我仍在调整它,并且会对其他响应感兴趣。

【讨论】:

  • 什么是“bol.Add(mainHead)”?这也是你自己做的一门课吗?
  • 对不起。 bol 是包含所有打印对象的列表的名称。所以当打印事件触发时。它遍历该列表中的所有 printObjects。将它们打印到页面上,然后将其发送到打印机。
  • 好的.. 我有点理解这一点。 BaseX 和 BaseY 有什么用?
  • XY 指向绘图对象的左上角。如果您想到一个句子或图片周围的边界框,它位于纸上的 XY 坐标上,以像素为单位。如果我想向下移动它,我增加 Y 或向右移动我增加 X。这就是文本将显示的位置。
  • 任何想法如何在此处插入徽标?和水平线?