为何不同MIME类型的文档通过CUPS打印可正常输出?
我拥有两台打印机:
- Epson L6290(原拼写Eson为笔误)
"application/octet-stream""image/pwg-raster""image/urf""image/jpeg""application/vnd.epson.escpr"
- SAMSUNG SL-M2830DW(原编号3为笔误)
"application/octet-stream""application/PCL""application/vnd.hp-PCL""application/vnd.hp-PCLXL""application/x-QPDL""text/plain""image/urf"
我有一份pwg-raster格式的文档test.pwg,通过CUPS发起打印的核心代码如下:
if (cupsStartDestDocument(pHttp, pDest, pInfo, nJobId, "test.pwg", mimeType, 0, NULL, lastPage) == HTTP_STATUS_CONTINUE){ while ((bytes = fread(buffer, 1, sizeof(buffer), pOut)) > 0) { if (cupsWriteRequestData(pHttp, buffer, bytes) != HTTP_STATUS_CONTINUE) break; } if (cupsFinishDestDocument(pHttp, pDest, pInfo) != IPP_STATUS_OK) { LOG("Document send failed: %s", cupsLastErrorString()); szResult = cupsLastErrorString(); }else{ LOG("Document send success: %s", cupsLastErrorString()); szResult = cupsLastErrorString(); } }else{ LOG("cupsStartDestDocument != HTTP_STATUS_CONTINUE"); }
令人困惑的是,第二台打印机并不支持image/pwg-raster格式,但将mimeType设置为application/PCL或image/urf时,文档仍能正常打印,示例代码如下:
if (cupsStartDestDocument(pHttp, pDest, pInfo, nJobId, "test.pwg", "application/PCL", 0, NULL, lastPage) == HTTP_STATUS_CONTINUE) ... if (cupsStartDestDocument(pHttp, pDest, pInfo, nJobId, "test.pwg", "image/urf", 0, NULL, lastPage) == HTTP_STATUS_CONTINUE)...
请问该现象的原因是什么?
这是CUPS的自动文件格式转换机制在起作用,具体逻辑如下:
CUPS过滤链的自动处理
CUPS作为打印系统核心,接收打印任务后会自动处理格式适配。当你声明的mimeType与打印机支持格式不匹配,或实际文件格式和声明的MIME类型不符时,CUPS会调用内置过滤器(比如rastertopcl、rastertourf等),将文件转换成打印机可识别的格式。文件实际格式的识别优先级
虽然你在代码里声明了mimeType为application/PCL或image/urf,但CUPS会优先通过文件内容识别出这是pwg-raster格式的文件。之后它会匹配打印机支持的格式,选择对应过滤器把pwg-raster转换成打印机兼容的PCL或URF格式,再发送给打印机执行打印。通用二进制类型的兜底支持
另外,两台打印机都支持application/octet-stream类型,这是一种通用二进制流类型。当CUPS无法直接匹配格式时,会将文件当作二进制流接收,再通过内部过滤器完成转换,这也是打印任务能成功的一个保障。
简单来说,CUPS不会完全依赖你代码里声明的MIME类型,它会自动识别文件实际格式并完成格式转换,确保打印机能接收并处理任务。
内容的提问来源于stack exchange,提问作者Jungwon

