【问题标题】:How to print .docx silently with c#如何使用 C# 静默打印 .docx
【发布时间】:2019-10-28 17:30:18
【问题描述】:

我想静默打印 .docx 文件并能够选择打印机的托盘。

起初我尝试使用Microsoft.Office.Interop.Word 打印 .docx,但单词正在打开...

在我将 .docx 文件转换为图像并使用 ProcessStartInfo 打印后,它向用户显示了一个打印窗口。

ProcessStartInfo info = new ProcessStartInfo(imageFilePath);

            info.Verb = "Print";
            info.CreateNoWindow = true;
            info.WindowStyle = ProcessWindowStyle.Hidden;
            Process.Start(info);

我尝试了另一种方法,它静默打印图像,但图像模糊且未正确缩放。

            PrinterSettings settings = new PrinterSettings();
            string defaultPrinter = settings.PrinterName;

            FileInfo fileInfo = new FileInfo(imageFilePath);


            PrintDocument pd = new PrintDocument();
            pd.DocumentName = fileInfo.Name;

            pd.PrintPage += (sender, args) =>
            {
                Image i = Image.FromFile(imageFilePath);
                PrintPageEventArgs arguments = args;


                System.Drawing.Rectangle m = new System.Drawing.Rectangle()
                {
                    Y = 0,
                    X = 0,
                    Location = new System.Drawing.Point(0, 0),
                    Height = args.MarginBounds.Height,
                    Size = args.MarginBounds.Size,
                    Width = args.MarginBounds.Width
                };



                if ((double)i.Width / (double)i.Height > (double)m.Width / (double)m.Height)
                {
                    m.Height = (int)((double)i.Height / (double)i.Width * (double)m.Width);
                }
                else
                {
                    m.Width = (int)((double)i.Width / (double)i.Height * (double)m.Height);
                }
                args.Graphics.DrawImage(i, m);
            };

            pd.Print();

那么是否可以静默打印 .docx 并能够选择打印机的托盘?

有没有人遇到过同样的问题。在这方面的任何帮助。提前致谢。

【问题讨论】:

  • 一个想法是将 docx 转换为 pdf,然后发送到打印机。也许打印机会更好地管理pdf。这是一个简单的猜测。
  • 我尝试将其转换为pdf,但我不知道为什么pdf文档的顶部和左侧有额外的边距。

标签: c# printing docx


【解决方案1】:

我自己做了一些与此非常相似的事情,但如果您可以选择托盘,我从未查看过文档。我相信这些是在打印服务器本身上设置的(如果您使用的是其中一个),并且如果您的应用程序具有访问权限,则可以引用它们。

string PrinterName = @"\\Server\nameOfThePrinter";
            ProcessStartInfo printProcessInfo = new ProcessStartInfo()
            {
                Verb = "PrintTo",
                CreateNoWindow = true,
                FileName = pdfFileName,
                Arguments = "\"" + PrinterName + "\"",
                WindowStyle = ProcessWindowStyle.Hidden
            };

            Process printProcess = new Process();
            printProcess.StartInfo = printProcessInfo;
            printProcess.Start();
            printProcess.WaitForInputIdle();

            printProcess.WaitForExit(10000);

            if (printProcess.HasExited)
            {

            }else
            {
                printProcess.Kill();
            }

            return true;

另外,您可能想在 https://www.codeproject.com/Tips/598424/How-to-Silently-Print-PDFs-using-Adobe-Reader-andhttps://www.codeproject.com/Tips/598424/How-to-Silently-Print-PDFs-using-Adobe-Reader-and 处调查这篇文章

干杯!

【讨论】:

  • 它可以,但我无法使用此方法选择打印机托盘...
  • 正确。我不知道指定纸盘所需的论据,这是一个有问题的情况。如果您想要其他方法,请查看其他海报stackoverflow.com/questions/8943312/…
  • 感谢您的链接!即使文档没有正确打印,我现在也可以选择一个数组,这是一个很好的进步!
【解决方案2】:

我找到了一个无法静默打印 .docx 的解决方案,因此我之前将其转换为 .png 图像。

Link to convert .docx to .png

这是打印图像的代码:

            PrinterSettings settings = new PrinterSettings();
            string PrinterName = settings.PrinterName;

            //set paper size
            PaperSize oPS = new PaperSize
            {
                RawKind = (int)PaperKind.A4
            };
            //choose the tray here
            PaperSource oPSource = new PaperSource
            {
                RawKind = (int)PaperSourceKind.Upper
            };
            PrintDocument printDoc = new PrintDocument
            {
                PrinterSettings = settings,
            };
            //set printer name here it's the default printer
            printDoc.PrinterSettings.PrinterName = PrinterName;
            printDoc.DefaultPageSettings.PaperSize = oPS;
            printDoc.DefaultPageSettings.PaperSource = oPSource;

            printDoc.PrintPage += new PrintPageEventHandler((sender, args) =>
            {
                System.Drawing.Image img = System.Drawing.Image.FromFile(imageFilePath);
                int printHeight = (int)printDoc.DefaultPageSettings.PrintableArea.Height;
                int printWidth = (int)printDoc.DefaultPageSettings.PrintableArea.Width;
                int leftMargin = 0;
                int rightMargin = 0;

                args.Graphics.DrawImage(img, new System.Drawing.Rectangle(leftMargin, rightMargin, printWidth, printHeight));
            });

            printDoc.Print();
            printDoc.Dispose();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 2015-05-07
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多