3

我通过使用 PDFiumSharp 将每一页转换为 PNG 图像来打印 PDF 文件。接下来,我将此图像绘制到 Graphics。

private void PrintPage(object sender, PrintPageEventArgs ev)
{
    ev.Graphics.DrawImage(images[pageNum], ev.Graphics.VisibleClipBounds);
    pageNum++;
    if (pageNum == images.Count)
    {
        ev.HasMorePages = false;
    }
    else
    {
        ev.HasMorePages = true;
    }
}

public void Print()
{
    printDocument.PrintPage += new PrintPageEventHandler(PrintPage);
    pageNum = 0;

    if (printDocument.PrinterSettings.IsValid)
    {
        printDocument.Print();
    }
    else
    {
        throw new Exception("Printer is invalid.");
    }
}

问题是打印机接收的数据非常大,整个过程运行缓慢。我尝试lpr在 Windows 上使用命令。它直接适用于 PDF 文件,但我的应用程序需要支持双面打印、不同纸张来源等,而lpr.

如何在不转换为图像的情况下使用 System.Drawing.Printig(或其他提供类似功能的东西)打印 PDF?我使用 .NET Core 3.1,我的应用程序应该是跨平台的。

4

1 回答 1

1

实际上,您需要选择 3 个中的任何 2 个:

  1. 无需光栅图像直接将数据发送到打印机
  2. 使用 System.Drawing.Printing
  3. 跨平台

例如,1 和 2 在 Windows 上运行良好。有跨平台的 PDF 库可以直接解析和打印 PDF 到 System.Drawing.Graphics。看看这个样本

问题是 System.Drawing 在 Linux 和 macOS 上不能很好地工作。它使用libgdiplus,这个实现有很多实际问题。
例如,libgdiplus 不能很好地处理剪切路径。我在那里修复了一些相关问题(#545#547#552),并发现了严重的障碍,可以进一步改进。

第一个是维护者。他们没有回答问题,而是按月审查了简单的拉取请求。看来微软对这个项目不是很感兴趣。

第二个障碍是内部架构。应该重新考虑 2 个旧的区域实现(基于位图和矩形)。但是,如果不与维护人员沟通,进行架构更改也是不可行的。

我认为你有两个选择:

  1. 使用无需中间图像即可打印到 System.Drawing.Graphics 的 PDF 库(如上面的示例)。它可以在 Windows 上正常工作。在 Linux 上,您将需要:

    • 自己修复 libgdiplus 中发现的问题,在您的生产中使用自定义版本。
    • 将 PDF 渲染为图像,然后打印光栅图像。
  2. 不要使用 System.Drawing.Printing

于 2020-11-26T10:21:50.320 回答