我用winform做的一款桌面应用软件,如何实现点击“打印”按钮后,启动打印文件的同时,还把“单双面,A3、A4、A5,打印份数”等这些参数传进去。直接调用打印系统的话没法把这些打印参数传进去。用printDocument的话,是可以设置画笔来画,但是只能打印字符串二没法打印文件。主要难点在于,如何使用printDocument来打印文件。包括文件夹下的文件,以及子文件夹下的文件。

解决方案 »

  1.   

    可以参考一下docs上的这个例子
    https://docs.microsoft.com/zh-cn/dotnet/framework/winforms/advanced/how-to-print-a-multi-page-text-file-in-windows-forms
      

  2.   

    https://www.cnblogs.com/NoRoad/p/6255916.html
      

  3.   

    虽然问题比较多,但基本原理还是能看着参考
    https://www.cnblogs.com/qiaoke/p/10365440.html
      

  4.   

    为什么我按照你的链接里说的去做,打印出来的是乱码
    文字编码的问题吧,贴出来看看
    加了编码格式以后,txt类的文件正常了,PDF和word打出来的还是乱码
      

  5.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
    using System.Drawing.Printing;
    using System.Text;namespace PrintApp
    {
        public partial class Form1 : Form
        {
            //public Form1()
            //{
            //    InitializeComponent();
            //}
            private Button printButton;
            private PrintDocument printDocument1 = new PrintDocument();
            private string stringToPrint;
            public Form1()
            {
                this.printButton = new System.Windows.Forms.Button();
                this.printButton.Location = new System.Drawing.Point(12, 51);
                this.printButton.Size = new System.Drawing.Size(75, 23);
                this.printButton.Text = "Print";
                this.printButton.Click += new System.EventHandler(this.printButton_Click);
                this.ClientSize = new System.Drawing.Size(292, 266);
                this.Controls.Add(this.printButton);            // Associate the PrintPage event handler with the PrintPage event.
                printDocument1.PrintPage +=
                    new PrintPageEventHandler(printDocument1_PrintPage);
            }        private string ReadFile(string fileName,Encoding encoding)
            {
                if(!File.Exists(fileName))
                {
                    throw new FileFormatException("文件不存在");
                }
                //string docName = "打印测试文档(机试).docx";
                //string docPath = @"C:\Users\Administrator\Desktop\";
                //printDocument1.DocumentName = docName;
                //using (FileStream stream = new FileStream(docPath + docName, FileMode.Open))
                else
                {
                    using (StreamReader reader = new StreamReader(new FileStream(fileName, FileMode.Open), encoding))
                    {
                        stringToPrint = reader.ReadToEnd();
                    }
                    MessageBox.Show(stringToPrint);
                    return stringToPrint;
                }
            }        private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
            {
                int charactersOnPage = 0;
                int linesPerPage = 0;            // 将charactersOnPage的值设置为stringToPrint的字符数,该字符数将适合页面的边界。
                e.Graphics.MeasureString(stringToPrint, this.Font,
                    e.MarginBounds.Size, StringFormat.GenericTypographic,
                    out charactersOnPage, out linesPerPage);            // 在页面边界内绘制字符串
                e.Graphics.DrawString(stringToPrint, this.Font, Brushes.Black,
                    e.MarginBounds, StringFormat.GenericTypographic);            // 删除已打印的字符串部分。
                stringToPrint = stringToPrint.Substring(charactersOnPage);            // 检查是否要打印更多页。
                e.HasMorePages = (stringToPrint.Length > 0);
            }        private void printButton_Click(object sender, EventArgs e)
            {
                //ReadFile(@"C:\Users\Administrator\Desktop\PDF测试.pdf", Encoding.UTF8);//不适用于pdf。
                //ReadFile(@"C:\Users\Administrator\Desktop\PDF测试.pdf", Encoding.Default);//Default适用于txt格式,不适用于docx格式,不适用于pdf。
                //ReadFile(@"C:\Users\Administrator\Desktop\PDF测试.pdf", Encoding.Unicode);//不适用于pdf
                //ReadFile(@"C:\Users\Administrator\Desktop\PDF测试.pdf", Encoding.UTF32);//不适用于pdf
                //ReadFile(@"C:\Users\Administrator\Desktop\PDF测试.pdf", Encoding.ASCII);//不适用于pdf
                //ReadFile(@"C:\Users\Administrator\Desktop\PDF测试.pdf", Encoding.UTF7);//不适用于pdf
                //ReadFile(@"C:\Users\Administrator\Desktop\PDF测试.pdf", Encoding.BigEndianUnicode);//不适用于pdf
                //ReadFile(@"C:\Users\Administrator\Desktop\PDF测试.pdf", Encoding.BigEndianUnicode);//不适用于pdf
                ReadFile(@"C:\Users\Administrator\Desktop\测试打印.txt", Encoding.GetEncoding("GBK"));//不适用于pdf,适用于txt            printDocument1.Print();
            }
        }
    }
      

  6.   

    为什么我按照你的链接里说的去做,打印出来的是乱码
    文字编码的问题吧,贴出来看看
    代码贴出来了。TXT正常,PDF和Word还是乱码,