c# - 使用 System.Drawing.Printing 在 .NET Core 中打印 PDF

标签 c# pdf .net-core printing lpr

我通过使用 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.");
    }
}

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

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

最佳答案

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

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

例如,1 和 2 在 Windows 上工作正常。有跨平台的 PDF 库可以解析 PDF 并将其直接打印到 System.Drawing.Graphics。看这个sample .

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

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

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

我认为您有 2 个选择:

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

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

关于c# - 使用 System.Drawing.Printing 在 .NET Core 中打印 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63504710/

相关文章:

c# - 如何更改 WPF 中的 View ?

c# - IDesignTimeDbContextFactory 并不总是需要的?

java - 我应该使用哪个字符集来解码java中的这个字节数组?

pdf - 使用 pstools 将大型 PDF 图像拆分为多个页面

c# - 无法向 .NET Core 中的 IConfiguration 添加扩展方法(但在其他类上工作)

docker - 如何从单个 Docker 镜像定位多个 .NET Core 版本?

c# - Win32_DiskDrive 和 eSATA

c# - View 模型中的 MVVM 清除文本框

c# - 为什么我的攻击函数会破坏所有对象包括攻击者?

ios - 如何从 NSData 源写入 PDF 文件