CUPS打印收据时如何固定打印方向?
问题描述
搭建简易POS系统,使用Seiko Instruments RP-D10收据打印机,系统生成的PDF文件正确,但CUPS打印时存在以下问题:
- 始终以纵向模式打印,当收据高度小于宽度时,CUPS自动将内容横向发送至打印机,导致打印效果异常
- 收据左侧约60mm内容被裁切
- 手动设置打印方向及默认选项无效,无法通过固定文档尺寸解决可变长度收据的问题
配置文件信息
printers.conf
# Written by cupsd # DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING NextPrinterId 2 <Printer RP-D10> PrinterId 1 UUID urn:uuid:ec55ffd0-01c2-36cf-545c-84174ebae871 Info RP-D10 MakeModel SII RP-D10 (80mm) DeviceURI usb://SII/RP-D10 State Idle StateTime 1636338040 ConfigTime 1636338040 Type 53252 Accepting Yes Shared Yes JobSheets none none QuotaPeriod 0 PageLimit 0 KLimit 0 OpPolicy default ErrorPolicy stop-printer </Printer>
RP-D10.ppd
*FormatVersion: "4.3" *FileVersion: "1.0" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "sii_rpd10_80.ppd" *Manufacturer: "SII" *Product: "(RP-D10 (80mm))" *1284DeviceID: "MFG:SII;CMD:SII;MDL:RP-D10;CLS:PRINTER;" *cupsVersion: 1.2 *cupsManualCopies: True *cupsModelNumber: 4 *cupsFilter: "application/vnd.cups-raster 0 rastertosii" *ModelName: "RP-D10 (80mm)" *ShortNickName: "RP-D10 (80mm)" *NickName: "SII RP-D10 (80mm)" *PSVersion: "(3010.000) 550" *LanguageLevel: "3" *ColorDevice: False *DefaultColorSpace: Gray *FileSystem: False *Throughput: "1" *LandscapeOrientation: Plus90 *VariablePaperSize: True *TTRasterizer: Type42 *% Print Quality *OpenUI *PrintQuality/Print Quality: PickOne *OrderDependency: 5 AnySetup *PrintQuality *DefaultPrintQuality: Normal *PrintQuality Normal/Normal mode: "<<</cupsBitsPerColor 8/HWResolution [203 203]>>setpagedevice" *PrintQuality Draft/Draft mode: "<<</cupsBitsPerColor 8/HWResolution [101 101]>>setpagedevice" *CloseUI: *PrintQuality *OpenUI *PageSize/Media Size: PickOne *OrderDependency: 10 AnySetup *PageSize *DefaultPageSize: X72MMY200MM *PageSize X72MMY200MM/72mm * 200mm: " <<</PageSize[204 567]/ImagingBBox null>> setpagedevice" *PageSize X72MMY1000MM/72mm * 1000mm: " <<</PageSize[204 2835]/ImagingBBox null>> setpagedevice" *PageSize A4/A4 reduced to 72mm: " <<</HWResolution [69 69]/PageSize[595 842]/ImagingBBox null>> setpagedevice" *PageSize Letter/Letter reduced to 72mm: " <<</HWResolution [67 67]/PageSize[612 792]/ImagingBBox null>> setpagedevice" *PageSize SELECTPAPERXXMM/Custom Paper Size(72mm * 297mm): " <<</PageSize[204 842]/ImagingBBox null>> setpagedevice" *CloseUI: *PageSize *OpenUI *PageRegion: PickOne *OrderDependency: 10 AnySetup *PageRegion *DefaultPageRegion: X72MMY200MM *PageRegion X72MMY200MM/72mm * 200mm: " <<</PageSize[204 567]/ImagingBBox null>> setpagedevice" *PageRegion X72MMY1000MM/72mm * 1000mm: " <<</PageSize[204 2835]/ImagingBBox null>> setpagedevice" *PageRegion A4/A4 reduced to 72mm: " <<</HWResolution [69 69]/PageSize[595 842]/ImagingBBox null>> setpagedevice" *PageRegion Letter/Letter reduced to 72mm: " <<</HWResolution [67 67]/PageSize[612 792]/ImagingBBox null>> setpagedevice" *PageRegion SELECTPAPERXXMM/Custom Paper Size(72m * 297mm): " <<</PageSize[204 842]/ImagingBBox null>> setpagedevice" *CloseUI: *PageRegion *DefaultImageableArea: X72MMY200MM *ImageableArea X72MMY200MM: "0.0 0.0 204.0 567.0" *ImageableArea X72MMY1000MM: "0.0 0.0 204.0 2835.0" *ImageableArea A4: "0.0 0.0 595.0 842.0" *ImageableArea Letter: "0.0 0.0 612.0 792.0" *ImageableArea SELECTPAPERXXMM: "0.0 0.0 204.0 842.0" *DefaultPaperDimension: X72MMY200MM *PaperDimension X72MMY200MM: "204 567" *PaperDimension X72MMY1000MM: "204 2835" *PaperDimension A4: "595 842" *PaperDimension Letter: "612 792" *PaperDimension SELECTPAPERXXMM: "204 842" *MaxMediaWidth: "204" *MaxMediaHeight: "23219" *HWMargins: 0 0 0 0 *CustomPageSize True: "pop pop pop <<</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice" *ParamCustomPageSize Width: 1 points 72 204 *ParamCustomPageSize Height: 2 points 72 23219 *ParamCustomPageSize WidthOffset: 3 points 0 0 *ParamCustomPageSize HeightOffset: 4 points 0 0 *ParamCustomPageSize Orientation: 5 int 0 0 *% Cut Mode *OpenUI *PageCutMode/Cut Mode: PickOne *DefaultPageCutMode: FullCutPage *PageCutMode FullCutPage/Full Cut: "" *PageCutMode PartialCutPage/Partial Cut: "" *PageCutMode NoCutPage/No Cut: "" *CloseUI: *PageCutMode *% Print Density: PickOne *OpenUI *PrintDensity/Print Density: PickOne *DefaultPrintDensity: 100Percent *PrintDensity 70Percent/70%: "" *PrintDensity 80Percent/80%: "" *PrintDensity 90Percent/90%: "" *PrintDensity 100Percent/100%: "" *PrintDensity 110Percent/110%: "" *PrintDensity 120Percent/120%: "" *PrintDensity 130Percent/130%: "" *CloseUI: *PrintDensity *% Cut Timing *OpenUI *CutTiming/Cut Timing: PickOne *DefaultCutTiming: Page *CutTiming Page/Each Page: "" *CutTiming Document/Each Document: "" *CloseUI: *CutTiming *% Blank Image *OpenUI *BlankImage/Blank Image: PickOne *OrderDependency: 10 AnySetup *BlankImage *DefaultBlankImage: feed *BlankImage feed/Feed: "" *BlankImage nonfeed/Non feed: "" *CloseUI: *BlankImage *% Dither *OpenUI *Dither/Dither Type: PickOne *OrderDependency: 10 AnySetup *Dither *DefaultDither: ditherScreen *Dither ditherNone/None: "" *Dither ditherScreen/Screen: "" *Dither ditherErrDiff/Error Diffusion: "" *CloseUI: *Dither *% End
解决方案
1. 修改PPD文件,强制默认纵向并修正旋转逻辑
编辑RP-D10.ppd文件,添加方向控制配置并调整旋转参数:
- 添加方向选择项,强制默认纵向:
*OpenUI *Orientation/Orientation: PickOne *OrderDependency: 15 AnySetup *Orientation *DefaultOrientation: Portrait *Orientation Portrait/Portrait: "<<</Orientation 0>>setpagedevice" *Orientation Landscape/Landscape: "<<</Orientation 1>>setpagedevice" *CloseUI: *Orientation
- 将
*LandscapeOrientation: Plus90修改为*LandscapeOrientation: Minus90,避免旋转后内容偏移导致裁切
修改后重启CUPS服务:
sudo systemctl restart cups
2. 强制打印机使用固定宽幅长页面
通过命令行设置打印机默认选项,指定使用72mm宽、1000mm长的页面(适配可变长度收据),并锁定纵向:
lpadmin -p RP-D10 -o PageSize=X72MMY1000MM -o Orientation=Portrait
也可以先停止CUPS服务,直接编辑printers.conf,在<Printer RP-D10>块内添加:
Option PageSize X72MMY1000MM Option Orientation Portrait
3. 替换CUPS过滤器(可选)
当前使用的rastertosii过滤器可能存在方向处理缺陷,可尝试替换为通用ESC/POS过滤器:
- 安装
rastertoescpos(Debian/Ubuntu系统示例):
sudo apt install printer-driver-escpos
- 修改PPD文件中的过滤器配置:
*cupsFilter: "application/vnd.cups-raster 0 rastertoescpos"
- 重启CUPS服务后测试打印
4. 打印PDF时强制指定参数
打印生成的PDF时,明确指定页面尺寸和方向,避免CUPS自动判断:
lp -d RP-D10 -o PageSize=X72MMY1000MM -o Orientation=Portrait receipt.pdf
如果是应用程序内调用打印,确保传递这些参数给CUPS打印命令。
内容的提问来源于stack exchange,提问作者Sarazil
相关产品推荐
相关产品推荐

