Internet 打印协议 (IPP) 的 PHP 实现
Requires
- php: >=7.1
Requires (Dev)
- phpunit/phpunit: ^8.1
This package is not auto-updated.
Last update: 2024-09-22 12:15:37 UTC
README
Internet 打印协议 (IPP) 的 PHP 客户端实现。该实现实现了在 RFC2911 和 RFC2910 中定义的原始 IPP 协议,并且可以与任何 IPP 打印机或 IPP 打印服务器(如 CUPS)一起使用。
该实现的目的是尽可能遵循 IPP 规范,以尽可能简单的方式提供对该协议的原始接口。
请注意:当前版本处于开发中,尚无稳定发布版。计划很快发布一个稳定版本(见项目状态部分)。
目录
安装
最简单的方法是使用 composer 并将 obray/IPP 添加到 require 部分
"require": { "obray/ipp": "dev-master" }
然后只需运行 composer install 或 composer 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。其他版本将在未来的版本中支持。目前,这个库与每个版本的要求和建议相比的状态如下。