25

我试图解决这个问题将近 2 天。网上有很多或多或少的好解决方案,但没有一个完全适合我的任务。

任务:

  • 以编程方式打印 PDF
  • 用固定打印机做
  • 不要让用户做多个 Button_Click
  • 默默地做——越多越好
  • 做客户端

第一个解决方案:

使用 Forms.WebBrowser 进行操作

如果我们安装了 Adob​​e Reader,有一个插件可以在网络浏览器中显示 PDF。使用这个解决方案,我们有一个很好的预览,并且使用 webbrowserControlName.Print() 我们可以触发控件来打印它的内容。

问题 - 我们还有一个 PrintDialog。


使用启动参数启动 AcroRd32.exe

下面的 CMD 命令让我们使用 Adob​​e Reader 来打印我们的 PDF。

InsertPathTo..\AcroRd32.exe /t "C:\sample.pdf" "\printerNetwork\printerName"

问题 - 我们需要 AcroRd32.exe 的绝对路径 | 有一个 Adob​​e Reader 窗口打开,必须打开它,直到打印任务准备好。


使用 Windows 预设

Process process = new Process();

process.StartInfo.FileName = pathToPdf; 
process.StartInfo.Verb = "printto";
process.StartInfo.Arguments = "\"" + printerName + "\""; 
process.Start();

process.WaitForInputIdle();
process.Kill();

问题 - 仍然会弹出一个 Adob​​e Reader 窗口,但打印完成后它通常会自行关闭。

解决方案 - 说服客户使用 Foxit Reader(不要使用最后两行代码)。


将 PDF 页面转换为 Drawing.Image

我不知道如何用代码来做,但是当我让它工作时,剩下的只是小菜一碟。Printing.PrintDocument 可以满足所有需求。


任何人都想从这些 PDF 中获得一些 Drawing.Image 或其他方法如何做到这一点?

最好的问候, 马克斯

4

12 回答 12

6

我能找到的最灵活、最简单、性能最好的方法是使用 GhostScript。它可以通过打印机名称直接打印到Windows打印机。

"C:\Program Files\gs\gs9.07\bin\gswin64c.exe" -dPrinted -dBATCH -dNOPAUSE -sDEVICE=mswinpr2 -dNoCancel -sOutputFile="%printer%打印机名称" " pdfdocument.pdf "

添加这些开关以将文档缩小到 A4 页面。

-sPAPERSIZE=a4 -dPDFFitPage

于 2013-10-11T13:58:49.590 回答
3

如果可以选择商业图书馆,您可以尝试使用Amyuni PDF Creator。网。

直接使用库打印:
要打开 PDF 文件并将其发送到直接打印,您可以使用IacDocument.Print方法。C# 中的代码将如下所示:

// Open PDF document from file<br>
FileStream file1 = new FileStream ("test.pdf", FileMode.Open, FileAccess.Read);
IacDocument doc1 = new IacDocument (null);
doc1.Open (file1, "" );
// print document to a specified printer with no prompt
doc1.Print ("My Laser Printer", false);

导出为图像(然后在需要时打印):
选择 1:您可以使用IacDocument.ExportToJPeg方法将 PDF 中的所有页面转换为可以使用 Drawing.Image 打印或显示的 JPG 图像

选择 2:您可以使用IacDocument.DrawCurrentPage方法和System.Drawing.Graphics.FromImage方法将每个页面绘制到位图中。C# 中的代码应如下所示:

FileStream myFile = new FileStream ("test.pdf", FileMode.Open, FileAccess.Read);
IacDocument doc = new IacDocument(null);
doc.Open(myFile);
doc.CurrentPage = 1;
Image img = new Bitmap(100,100);
Graphics gph = Graphics.FromImage(img);
IntPtr hdc = gph.GetHDC();
doc.DrawCurrentPage(hdc, false);
gph.ReleaseHdc( hdc );

免责声明:我为 Amyuni Technologies 工作

于 2012-07-23T15:09:33.980 回答
3

另一种方法是使用 .NET 中的假脱机功能将预先格式化的打印机数据发送到打印机。但不幸的是,您需要使用 win32 spooler API

您可以查看如何使用 Visual C# .NET 将原始数据发送到打印机

只有当打印机本身支持 PDF 文档时,您才能使用此方法。

于 2012-07-20T13:14:21.163 回答
1

我知道标签有Windows Forms; 但是,由于通用标题,有些人可能想知道他们是否可以在WPF应用程序中使用该名称空间——他们可以。

这是代码:

var file = File.ReadAllBytes(pdfFilePath);
var printQueue = LocalPrintServer.GetDefaultPrintQueue();

using (var job = printQueue.AddJob())
using (var stream = job.JobStream)
{
    stream.Write(file, 0, file.Length);
}

现在,这个命名空间必须与WPF应用程序一起使用。它不能很好地与ASP.NETor一起使用Windows Service。它不应该与 一起使用Windows Forms,因为它有System.Drawing.Printing。使用上述代码打印 PDF 时没有任何问题。

请注意,如果您的打印机不支持 PDF 文件的直接打印,这将不起作用。

于 2014-12-11T18:01:04.850 回答
1

我发现使用 printto 动词的代码版本略有不同。我没有尝试过,但也许它可以帮助你:

http://vbcity.com/forums/t/149141.aspx

于 2012-07-30T11:21:00.023 回答
1

您可以使用ghostscript将 PDF 转换为图像格式。

以下示例将单个 PDF 转换为 PNG 文件序列:

private static void ExecuteGhostscript(string input, string tempDirectory)
{
    // %d will be replaced by ghostscript with a number for each page
    string filename = Path.GetFileNameWithoutExtension(input) + "-%d.png";
    string output = Path.Combine(tempDirectory, filename);

    Process ghostscript = new Process();
    ghostscript.StartInfo.FileName = _pathToGhostscript;
    ghostscript.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    ghostscript.StartInfo.Arguments = string.Format(
        "-dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -r300 -sOutputFile=\"{0}\" \"{1}\"", output, input);

    ghostscript.Start();
    ghostscript.WaitForExit();
}

如果您更喜欢使用 Adob​​e Reader,您可以隐藏它的窗口:

process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
于 2012-07-20T21:19:35.637 回答
1

我公司提供可以渲染和打印 PDF 文档的 Docotic.Pdf 库。链接后面的文章包含有关以下主题的详细信息:

  • 直接在 Windows 窗体或 WPF 应用程序中打印 PDF
  • 通过中间图像打印 PDF
  • 在 Graphics 上渲染 PDF

也有示例代码的链接。

我在公司工作,所以请阅读这篇文章并自己尝试建议的解决方案。

于 2021-03-23T10:08:35.083 回答
1

我尝试了很多方法,最适合我的方法是从命令行启动 SumatraPDF:

// Launch SumatraPDF Reader to print
String arguments = "-print-to-default -silent \"" + fileName + "\"";
System.Diagnostics.Process.Start("SumatraPDF.exe", arguments);

这样做有很多好处:

  1. SumatraPDF 比 Adob​​e Acrobat Reader 快得多。
  2. UI 不加载。它只是打印。
  3. 您可以将 SumatraPDF 作为一个独立的应用程序使用,这样您就可以将它包含在您的应用程序中,这样您就可以使用自己的 pa。请注意,我没有阅读许可协议;您可能应该自己检查一下。
于 2017-11-17T18:55:47.733 回答
0

使用PrintDocument类呢?

http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.aspx

您只需要传递要打印的文件的文件名(基于示例)。

高温高压

于 2012-07-20T12:53:40.703 回答
0
        Process proc = new Process();
        proc.StartInfo.FileName = @"C:\Program Files\Adobe\Acrobat 7.0\Reader\AcroRd32.exe";
        proc.StartInfo.Arguments = @"/p /h C:\Documents and Settings\brendal\Desktop\Test.pdf";
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.CreateNoWindow = true;
        proc.Start();

        for (int i = 0; i < 5; i++)
        {
            if (!proc.HasExited)
            {
                proc.Refresh();
                Thread.Sleep(2000);
            }
            else
                break;
        }
        if (!proc.HasExited)
        {
            proc.CloseMainWindow();
        }
于 2012-09-30T20:14:51.660 回答
0

如果您对完全符合您要求的商业解决方案感兴趣,那么有很多选择。我的公司在名为Debenu Quick PDF Library的开发人员工具包中提供了这些选项之一。

这是一个代码示例(关键功能是PrintOptionsPrintDocument):

/* Print a document  */

// Load a local sample file from the input folder

DPL.LoadFromFile("Test.pdf", "");

// Configure print options

iPrintOptions = DPL.PrintOptions(0, 0, "Printing Sample")

// Print the current document to the default 
// printing using the options as configured above.
// You can also specify the specific printer.

DPL.PrintDocument(DPL.GetDefaultPrinterName(), 1, 1, iPrintOptions);
于 2014-01-17T05:46:44.440 回答
0

截至July 2018, OP 仍然没有答案。没有免费的方法可以 1) 为 2) 闭源项目静默打印您的 pdf。

1) 您当然可以使用 Adob​​e Acrobat 或 Foxit Reader 等程序

2) 免费解决方案具有 GPL(GNU 通用公共许可证)。这意味着如果将软件提供给公司以外的任何人,即使是免费的,您也必须开放源代码。

正如 OP 所说,如果您可以将 PDF 转换为 Drawing.Image,则可以使用 .NET 方法打印它。可悲的是,执行此操作的软件还需要付款或 GPL。

于 2018-07-31T18:27:30.447 回答