Internet 打印协议 (IPP) 的 PHP 实现

v1.0.0 2023-10-07 10:00 UTC

This package is not auto-updated.

Last update: 2024-09-22 12:15:37 UTC


README

Internet 打印协议 (IPP) 的 PHP 客户端实现。该实现实现了在 RFC2911RFC2910 中定义的原始 IPP 协议,并且可以与任何 IPP 打印机或 IPP 打印服务器(如 CUPS)一起使用。

该实现的目的是尽可能遵循 IPP 规范,以尽可能简单的方式提供对该协议的原始接口。

请注意:当前版本处于开发中,尚无稳定发布版。计划很快发布一个稳定版本(见项目状态部分)。

目录

License: MIT

安装

最简单的方法是使用 composer 并将 obray/IPP 添加到 require 部分

"require": {
    "obray/ipp": "dev-master"
}

然后只需运行 composer installcomposer update。或者,您可以克隆存储库或下载源代码,然后按您的需要使用它。

使用方法

使用此实现的最基本方法是创建一个 Printer 对象,并像这样调用 printJob 方法

$printer = new \obray\IPP\Printer(
  {printer-uri},
  {username}, // optional
  {password},    // optional
  {curlOptions} // optional
);
$response = $printer->printJob({raw document}, {attributes});

根据打印机以及您要打印的文档,上述方法可能不会得到您期望的结果(例如,将 PDF 打印为纯文本或空白页面等)。打印机通常只能打印特定的文档格式。要找出打印机支持哪些格式,可以列出打印机属性如下

$printer = new \obray\IPP\Printer(
  {printer-uri},
  {username}, // optional
  {password},    // optional
  {curlOptions} // optional
);
$attributes = $printer->getPrinterAttributes();

这将给出类似以下的结构(编码为 JSON)

{
    "versionNumber": "1.1",
    "requestId": 1,
    "statusCode": "successful-ok",
    "operationAttributes": {
        "attributes-charset": "utf-8",
        "attributes-natural-language": "en-us"
    },
    "jobAttributes": null,
    "printerAttributes": {
    
        ...
        
        "document-format-supported": [
            "application\/octet-stream",
            "image\/urf",
            "image\/pwg-raster",
            "application\/pdf",
            "image\/jpeg",
            "application\/postscript",
            "application\/vnd.hp-PCL",
            "text\/plain"
        ],
        
        ...
        
    }
}

要将 PDF 打印到该打印机,您将执行如下操作

$printer = new \obray\IPP\Printer(
  {printer-uri},
  {username}, // optional
  {password}, // optional
  {curlOptions}, // optional
);
$attributes = $printer->printJob(
   {raw document},
   123, // optional request ID
   [
     'document-format': 'application/pdf'
   ]
);

直接连接到打印机或 CUPS

此库支持直接连接到网络打印机,打印文档或将打印作业发送到安装了 CUPS 的服务器或计算机。

要直接连接到网络打印机,通常只需获取其主机名并使用如下方式之一

ipp://network.hostname.of.printer
ipp://network.hostname.of.printer/ipp

要使用此库与 cups 一起使用,操作完全相同,但通常 URL 如下所示:ipp://hostname.of.cups/ipp/{printer-name-goes-here}

要使用此库与 USB 打印机或其他类型的打印机一起使用,您需要使用 CUPS。在安装了 CUPS 的计算机上安装打印机,然后您可以使用此库通过 CUPS 通过此库将打印作业发送到打印机。

要查看其他方法,请参阅以下关于 打印机对象和方法 以及 作业对象和方法 的文档。

打印机对象与方法

打印机对象基于指定的 URI 定义了打印机。当在打印机上调用方法时,它将尝试连接并发送请求并解释响应。

打印机构造函数

通过指定打印机的URI(如果需要,指定凭证)来创建打印机对象。一旦拥有打印机,就可以调用其方法。

使用方法
$printer = new \obray\IPP\Printer(
  {printer-uri},
  {username},   // optional
  {password},    // optional
  {curlOptions} // optional
);

方法 printJob

RFC 2911 3.2.1:这项必需操作允许客户端提交只包含一个文档的打印作业,并提供文档数据(而不是仅提供数据引用)。

使用方法
$response = $printer->printJob(
  {raw document},
  {request-id},  // optional
  {[attributes]} // optional
);

方法 PrintURI

尚未实现

RFC 2911 3.2.2:这项可选操作与Print-Job操作相同,区别在于客户端使用“document-uri”(uri)操作属性(在组1中)提供文档数据的URI引用,而不是包含文档数据本身。在返回响应之前,打印机必须验证打印机支持URI隐含的检索方法(例如,http、ftp等),并必须检查URI语法是否有效。如果客户端提供的URI方案不受支持,即其值不在打印机对象的“referenced-uri-scheme-supported”属性中,则打印机对象必须拒绝请求并返回“client-error-uri-scheme-not-supported”状态码。

方法 validateJob

RFC 2911 3.2.3:这项必需操作与Print-Job操作类似,区别在于客户端不提供文档数据,打印机也不分配任何资源(即,它不会创建新的作业对象)。这个操作仅用于验证打印机对象的功能与客户端在Validate-Job请求中提供的任何属性相匹配。通过使用Validate-Job操作,客户端可以验证具有相同文档数据(Print-Job操作)将被接受。Validate-Job操作还执行与Print-Job操作相同的网络安全协商,以便客户端可以在执行Print-Job操作之前检查客户端和打印机对象的安全要求是否可以得到满足。

使用方法
$response = $printer->validateJob({request-id}, {[attributes]});

方法 createJob

尚未实现

RFC 2911 3.2.4:这项可选操作与Print-Job操作类似,区别在于在Create-Job请求中,客户端不提供文档数据或任何文档数据引用。此外,客户端也不提供“document-name”、“document-format”、“compression”或“document-natural-language”操作属性。该操作后跟一个或多个Send-Document或Send-URI操作。在这些操作请求的每个中,客户端可以选择性地为多文档作业对象中的每个文档提供“document-name”、“document-format”和“document-natural-language”属性。

方法 getPrinterAttributes

RFC 2911 3.2.5:这项必需操作允许客户端请求打印机对象的属性值。在请求中,客户端提供感兴趣的打印机属性名称和/或属性组名称集合。在响应中,打印机对象返回相应的属性集,其中填充了适当的属性值。默认情况下,此方法将获取所有可用的属性。

使用方法
$response = $printer->getPrinterAttributes({request-id});

方法 getJobs

RFC 2911 3.2.6:这项必需操作允许客户端检索属于目标打印机对象的作业对象列表。客户端还可以提供作业属性名称和/或属性组名称列表(默认情况下包括所有组名称)。对于返回的每个作业对象,将返回一组作业对象属性。

使用方法
$response = $printer->getJobs({request-id});

方法 pausePrinter

RFC 2911 3.2.7:这个可选操作允许客户端停止打印对象在所有设备上安排作业。根据实现方式,暂停打印操作也可能停止打印对象处理当前作业或作业。任何正在打印的作业,根据实现方式,要么在实现允许时立即停止,要么完成。打印对象必须仍然接受创建操作以创建新作业,但必须防止任何作业进入“处理”状态。

如果支持暂停打印操作,那么必须支持恢复打印操作,反之亦然。

使用方法
$response = $printer->pausePrinter({request-id});

方法 resumePrinter

RFC 2911 3.2.8:此操作允许客户端恢复打印对象在其所有设备上安排作业。如果存在,打印对象必须从打印对象的“printer-state-reasons”属性中删除“paused”和“moving-to-paused”值。如果没有其他原因使设备暂停(例如媒体卡住),则IPP打印机可以根据是否有作业要处理分别切换到“processing”或“idle”状态,并且设备(们)恢复处理作业。

如果支持暂停打印操作,那么必须支持恢复打印操作,反之亦然。

使用方法
$response = $printer->resumePrinter({request-id});

方法 purgeJobs

RFC 2911 3.2.9:这个可选操作允许客户端从IPP打印机对象中删除所有作业,无论其作业状态如何,包括打印对象作业历史记录中的作业(见第4.3.7.2节)。执行Purge-Jobs操作后,打印对象必须在后续的Get-Job-Attributes和Get-Jobs响应中返回无作业(直到提交新作业)。

Purge-Jobs(和Get-Jobs)操作是否以与使用IPP向IPP打印机对象提交的作业相同的方式影响来自其他来源的作业(例如,来自IPP打印机对象的作业),取决于实现,即,是否使用IPP协议作为通用管理协议或仅用于管理IPP作业。

使用方法
$response = $printer->purgeJobs({request-id});

作业对象和方法

方法 sendDocument

尚未实现

RFC 2911 3.3.1:这个可选操作允许客户端创建一个多文档作业对象,该对象最初是“空的”(不包含任何文档)。在创建作业响应中,打印对象返回作业对象的URI(“job-uri”属性)和作业对象的32位标识符(“job-id”属性)。对于客户端希望添加的每个新文档,客户端使用发送文档操作。每个发送文档请求包含一个文档的全部文档数据流。

方法 sendURI

尚未实现

RFC 2911 3.3.2:这个可选操作与发送文档操作(见第3.3.1节)相同,但客户端必须提供URI引用(“document-uri”操作属性)而不是文档数据本身。如果打印对象支持此操作,则客户端可以使用发送URI或发送文档操作将新文档添加到现有的多文档作业对象中。但是,如果客户端需要指示上一个发送URI或发送文档是最后一个文档,则客户端必须使用无文档数据的发送文档操作,并将“last-document”标志设置为“true”(而不是使用无“document-uri”操作属性的发送URI操作)。

打印对象必须在返回响应之前验证所提供的URI的语法和URI方案,就像在打印URI操作中一样。IPP打印机可以选择在操作过程中或之后验证文档的可访问性(见第3.2.2节)。

方法 cancelJob

RFC 2911 3.3.3:这个必需操作允许客户端从创建作业到完成、取消或中止作业的时间范围内取消打印作业。由于作业可能在收到取消作业请求时已经开始打印,因此在作业实际终止之前可能会打印一些媒体页。

使用方法
$response = $job->cancelJob({request-id});

方法 getJobAttributes

RFC 2911 3.3.4:此必需操作允许客户端请求作业对象的属性值,它与“获取打印机属性”操作几乎相同(参见3.2.5节)。唯一的不同之处在于,该操作针对的是作业对象而不是打印机对象,在查询作业对象时没有使用“文档格式”操作属性,并且返回的属性组是一组作业对象属性,而不是一组打印机对象属性。

使用方法
$response = $job->getJobAttributes({request-id});

方法 holdJob

RFC 2911 3.3.5:此可选操作允许客户端将待处理的作业保留在队列中,使其不符合调度条件。如果支持“挂起作业”操作,则必须支持“释放作业”操作,反之亦然。可选的“作业挂起直到”操作属性允许客户端指定是否无限期挂起作业,或者挂起到指定的时间段(如果支持)。

使用方法
$response = $job->holdJob({request-id});

方法 releaseJob

RFC 2911 3.3.6:此可选操作允许客户端释放之前挂起的作业,使其再次符合调度条件。如果支持“挂起作业”操作,则必须支持“释放作业”操作,反之亦然。

此操作从创建或最近的“挂起作业”或“重启作业”操作中提供的作业对象中删除(如果存在)“作业挂起直到”作业属性,并删除其对作业的影响。IPP对象必须从作业的“作业状态原因”属性中删除(如果存在)'作业挂起直到指定'值。

使用方法
$response = $job->releaseJob({request-id});

方法 restartJob

RFC 2911 3.3.7:此可选操作允许客户端重启在处理完成后保留在队列中的作业。

使用方法
$response = $job->restartJob({request-id});

打印机 URI

每个打印机对象由一个唯一的URI标识,必须提供给打印机构造函数。以下是一些可能的打印机URI示例

如果您指定IPP作为协议,则假定端口631。或者您可以指定端口号

ipp://hostname/ipp/

ipp://hostname:port/ipp/

ipp://hostname/ipp/port1

如果您的打印机不支持直接IPP,通常可以设置一个CUPS服务器,在那里安装打印机,然后发送所有请求到CUPS服务器。一个例子可能是这样的

ipp:///printers/{printer-name-in-cups}

在这种情况下,CUPS将安装在localhost上,并监听端口631(默认的IPP端口)。

项目状态

目前,这个库没有稳定的版本,但一旦有,它将完全支持IPP/1.1。其他版本将在未来的版本中支持。目前,这个库与每个版本的要求和建议相比的状态如下。