#打印 #PDF #winapi #API绑定 #XPS

winprint

使用Windows API将打印机设备打印的crate

1 个不稳定版本

0.1.0 2024年3月14日

#162Windows API

BSD-3-Clause

140KB
3.5K SLoC

包含 (ZIP文件, 70KB) test_data/test_document.xps

winprint

crates.io Released API docs BSD 3 Clause licensed

使用Windows API将打印机设备打印的crate。

关于安全性

此crate与多个Windows API函数交互,需要使用不安全代码块。尽管如此,此crate设计用于安全使用。如果您发现任何会破坏安全性或可靠性的情况,请将其作为错误报告。

许可证

根据BSD 3条款许可

贡献

除非您明确声明,否则您提交给此crate的任何贡献,均应按BSD 3条款许可,不附加任何额外条款或条件。


lib.rs:

使用Windows API将打印机设备打印的crate。

示例

打印文件

以下是一个简单示例,展示如何打印文件

  • 筛选您要使用的设备。
  • 将打印机设备包装成打印机。
  • 将文件发送到打印机。

首先,通过 PrinterDevice::all() 获取所有打印机设备,并筛选您要使用的设备。

use winprint::printer::PrinterDevice;

fn get_my_device() -> PrinterDevice {
    let printers = PrinterDevice::all().expect("Failed to get printers");
    printers
        .into_iter()
        .find(|x| x.name() == "My Printer")
        .expect("My Printer not found")
}

然后,创建一个打印机并将文件发送到它。目前有两种类型的打印机可用

注意:这里的Printer概念是特定类型数据的打印设备包装器,并不代表打印机设备。

use std::path::Path;
use winprint::printer::FilePrinter;
use winprint::printer::PrinterDevice;
use winprint::printer::XpsPrinter;

let my_device = get_my_device();
let xps = XpsPrinter::new(my_device);
let path = Path::new("path/to/test/document.xps");
xps.print(path, Default::default()).unwrap();

指定打印首选项

打印票是一组可以用来指定打印首选项的选项集,可以用来设置媒体大小、方向等选项。如果您想指定打印首选项,可以使用打印票。

请参阅打印架构规范以获取技术细节。

以下是一个如何使用该库中的打印票示例。

  • 从打印机设备获取打印功能。
  • 过滤您想要使用的功能。
  • 为您的打印机设备创建一个打印票构建器。
  • 将功能合并到您要构建的打印票中。
  • 构建打印票。
  • 使用打印票打印文件。
use std::path::Path;
use winprint::printer::FilePrinter;
use winprint::printer::PrinterDevice;
use winprint::printer::XpsPrinter;
use winprint::ticket::PredefinedMediaName;
use winprint::ticket::PrintCapabilities;
use winprint::ticket::PrintTicket;
use winprint::ticket::PrintTicketBuilder;

let my_device = get_my_device();
let capabilities = PrintCapabilities::fetch(&my_device).unwrap();
let a4_media = capabilities
    .page_media_size()
    .find(|x| x.as_predefined_name() == Some(PredefinedMediaName::ISOA4))
    .unwrap();
let mut builder = PrintTicketBuilder::new(&my_device).unwrap();
builder.merge(a4_media).unwrap();
let ticket = builder.build().unwrap();
let xps = XpsPrinter::new(my_device);
let path = Path::new("path/to/test/document.xps");
xps.print(path, ticket).unwrap();

功能

  • pdfium:启用PDFium对打印PDF文件的支持。

依赖项

~131MB
~2M SLoC