ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SPAD自定义纸张格式预览正常打印报错?详解SAP打印链路故障排查

SPAD自定义纸张格式预览正常打印报错?详解SAP打印链路故障排查 前两天刚帮一个客户处理完类似的故障SPAD里加了自定义纸张格式预览一切正常结果一打印就报错。客户急得不行说SAP都用了这么多年了怎么加个纸就出问题。排查一圈下来发现不是纸的问题是很多人在SAP打印链路里根本没搞明白的一个底层逻辑。这篇文章就把这次排查的完整过程写出来。不管你是做SAP运维的、搞实施的还是被分派去处理打印问题的IT支持照着这个思路走一遍能把这类预览成功、打印失败的诡异问题定位到具体环节。1. 先搞清楚SAP里纸张格式到底存在哪一层很多人第一次遇到这个问题第一反应是重新建格式、重配输出设备甚至重装驱动但基本都没用。因为问题压根不在你看到的那个界面上。1.1 你新增的格式落在了哪个仓库里在SAP里纸张格式相关的配置入口是事务代码SPAD全称是Spool Administration打印管理员就靠它管理整个打印输出体系。SPAD里有一个功能叫页面格式这名字很容易让人误解以为它就是最终打印出来的纸张规格。实际上SAP的页面格式更像是一个逻辑画布它定义了输出内容的有效区域——宽度、高度、上下左右页边距。它不是物理意义上的纸张你真正的物理纸张是在打印机驱动和纸盒里指定的。这两者的关系你可以理解成页面格式是内容排版范围物理纸张是承载介质的实际尺寸。我在SPAD里新建一个格式时需要定义格式名、长、宽、计量单位。注意这里定义的长度和宽度SAP会严格记录为格式属性但它不会校验你的打印机是否支持这个尺寸。这就埋下了第一个雷点你能在系统里建出来的格式不一定能在真实打印机上打出来。更关键的是新增的页面格式要应用到输出设备上还需要做一层映射。很多人的操作到SPAD新建格式这一步就结束了完全没有把格式和使用它的输出设备关联起来。到时候打印请求发到后台Spool系统拿着一个设备不认识的新格式名字自然就翻了车。1.2 预览和打印是两条截然不同的通路这也是预览成功打印失败这个现象最迷惑人的地方。预览走的是SAP GUI的屏幕渲染路径打印走的是Spool解析驱动解释物理输出的路径两条路虽然数据源一样但处理环节天差地别。预览的时候SAP把表单内容按页面格式渲染成屏幕上的图像这个过程不涉及打印机驱动也不涉及纸张来源和纸盒选择。说白了只要你的页面格式定义本身不矛盾宽度、高度、边距都合法预览就一定正常。打印的时候就复杂得多。比如常见的智能表单Smart Forms它生成的打印数据会先进入Spool队列再按输出设备上配置的设备类型进行格式转换。这个转换过程会读取页面格式的物理属性然后去匹配输出设备上允许的物理纸张清单。如果匹配不上打印请求会带着一个看不懂的错误信息卡在队列里或者直接转为错误状态。1.3 为什么看得见不等于打得出来有一个不太被人注意的点SAP前端打印还需要本地打印前端组件SAPLPD参与这个组件会把Spool数据和打印机驱动做交互。你的预览界面根本不调用这层组件所以即使驱动配置有问题预览也照样正常。你在SAP里点了打印之后如果用的是本地打印方式也就是SAP GUI上的打印按钮SAP GUI会先把打印数据传给本机上的SAPLPD进程SAPLPD再去调Windows打印机驱动。这一条链路里任何一个环节对纸张尺寸、格式名、代码页的理解跟SAP后台不一致都会导致同样的结果预览没问题打印就失败。所以第一步必须建立这样的认知框架SAP的纸张格式体系和打印机物理纸张体系是靠一整套映射和转换机制对接的不是我建了一个格式就能直接打。接下来排查的时候我们不去猜直接看打印请求留在系统里的痕迹。2. 别急着改配置先学会看打印请求的遗言遇到打印失败最开始的几分钟非常关键。很多人的做法是反复打印、反复试或者干脆重新生成一次打印请求结果还是失败。正确的做法是先到打印请求队列里把那条失败的记录调出来它已经把失败原因写在里面了只是大多数人没仔细看。2.1 打印请求状态字段的读法打印请求相关的常用事务代码有三个SP02是查看前端传入的自己的打印请求SP01是后端管理员的打印请求管理两者的界面和字段几乎一样。进入SP01后你会看到一张打印请求列表每个请求都有状态字段状态可能有等待正在处理完成错误等。关键的一步找出状态异常的那条双击打开它然后点菜单里的转到→打印请求信息或直接看状态文本。里面通常会明确写着失败环节哪怕是英文的也比瞎猜强。我遇到过几次这样的情况用户说打印失败但我在SP01里看到的请求状态其实是完成那说明Spool到打印机这一层是正常的问题出在物理打印机或驱动上。反过来请求状态是错误那必须优先排查Spool内部的转换与匹配。2.2 SP01里那些最常见的硬错误从SPAD打印请求信息里你可能看到下面几类典型错误文本错误类型可能的原文/报错问题方向设备类型解析失败Device type XXXX not valid for output device输出设备的设备类型配置有问题格式不被设备接受Page format Z_XXXX has no length / width页面格式定义不完整打印机纸盒缺纸Paper tray empty or cover open物理打印机配置问题字体/字符集问题Margins/format not found in device格式与设备类型不匹配Spool数据无法生成Form output formatting error程序、打印表单、循环打印问题这里要注意SAP的错误信息往往不会写得通俗易懂它会出现一些组合性的术语比如format、paper size、device descriptor之类的。不要慌先把报错文本截图或抄下来再结合下面的排查链路继续钻。2.3 找出问题出现在队列内还是队列外打印失败的位置粗分可以分成两类队列内失败、队列外失败。队列内失败就是打印请求在Spool系统内部处理时报错。比如设备类型不认某个格式或者页面格式的定义在输出设备的格式映射清单里不存在。这类错误在SP01的状态文本里能看到比较明确的提示修复也集中在SPAD后台配置上。队列外失败则是Spool把所有数据成功转给打印机驱动甚至转给打印服务器之后才出错。典型的症状是请求状态一直是等待或者正在打印但打印机那边就是不出纸或者出来一堆乱码。这类问题往往要跑到物理打印机、网络打印服务器、驱动层面去看。我们这次遇到的情况状态是错误说明问题大概率在队列内也就是Spool处理和格式匹配那一层。先把这个结果记下然后进入下一节把预览成功打印失败的几个典型根因逐一拆开来看。3. 预览成功打印失败的典型根因拆解做SAP打印问题排查这么久这类问题的原因翻来覆去就那么几类。我按实际发生频率排个序你照着一个个排除就行。3.1 根因一设备类型与页格式映射缺失这个原因在我处理过的案例里能占四成。SAP的设备类型Device Type有点类似打印机驱动的抽象层它描述了一台打印机支持哪些页面格式、用什么打印控制语言。你在SPAD里维护输出设备时会指定一个设备类型常见的有CNSAPWINWindows驱动通用设备类型、HPLJ4HP LaserJet 4系列、POSTSCRPTPostScript设备类型等。每个设备类型内部有一个允许的格式清单这个清单叫格式映射或者页面格式映射。它告诉SAP这个设备类型能接收哪些页面格式的信号。问题就出在这里。你新加的页面格式Z_CUSTOM_285x450只存在于SPAD的页面格式列表里但设备类型CNSAPWIN的允许格式清单里根本没有这个名字。当打印请求在Spool时系统会拿格式名和设备类型做匹配匹配不上就直接报错。预览不经过这层匹配所以永远正常。要确认这个原因到SPAD里双击输出设备进入设备属性切到设备类型页签看一下当前设备类型再去查看对应的设备类型属性里有没有你新增格式的条目一步一步来。3.2 根因二输出设备物理纸张规格与页格式冲突这类问题也很常见而且最坑人。SAP的页面格式定义不校验物理打印机的能力但真正往打印机发数据的时候打印机驱动会拿物理纸张去匹配。我就遇到过一次客户在SPAD里新增了一个宽度450毫米的格式用于打印连续标签纸。预览非常完美但打印的时候打印机一直吐白纸没有任何报错。查了半天最后发现打印机的驱动设置里自定义纸张宽度上限只有400毫米驱动直接把超出范围的打印任务丢弃了。如果你新增的格式尺寸是自定义的尤其是超出A3幅面的务必先去打印机驱动里确认物理纸张的最大尺寸。有些打印机的自定义纸张尺寸还有最小限制小于某个宽度它也不接。这类问题在屏幕预览阶段完全看不出来因为预览只是渲染画面根本不会把数据发给驱动。3.3 根因三字符集与代码页对不上这是一个相对冷门但一旦遇上就很头疼的问题。SAP在打印时会把表单文本按照输出设备的语言/字符集设置转换成打印机可以解释的代码页。如果你的表单里有特殊字符比如中文、欧语重音字母、特殊符号而输出设备的字符集配置不支持这些字符轻则乱码重则整个打印请求直接失败。预览成功的原因是Smart Forms/ABAP程序的预览功能使用的是SAP GUI本地的字体渲染能力这个能力几乎支持所有Unicode字符。但真实打印时SAP Spool会按指定的代码页重新编码如果输出设备的语言字段没有选对编码过程就会中断或产生不可用的数据。检查方法也很简单进入输出设备属性在输出属性页签看语言和字符集字段。如果你的打印内容是中文的最好确认这台设备的字符集是支持中文字符的代码页。另外SAP有大量的字体文件需要单独传到打印服务器上比如中文字体包文件在Windows打印服务器上必须存在否则打印输出会变成方框或黑块。3.4 根因四前端打印的本地驱动和远程纸盒配置最后这个场景主要出现在使用前端打印本地打印的部署里。所谓前端打印就是我们最常见的打开报表点打印数据经过SAPLPD发给本机或网络打印机。这种情况下的打印机驱动管理其实和SAP后台是脱节的——你本机驱动里设置的纸张尺寸、纸盒选择、默认纸张来源SAP后台完全不知道。我处理过一个典型的案例SAP后台输出设备的设备类型配置是前端口驱动器打印请求到了SAPLPD之后SAPLPD会调Windows驱动。结果Windows驱动里的默认纸盒选的是自动选择而打印机默认纸盒放的是Letter纸张SAP发过来的是A4自定义尺寸格式两边不匹配打印机面板直接报纸张尺寸错误。这个问题如果发生在办公场景普通用户会以为SAP坏了其实把打印机驱动里的默认纸盒改成手动进纸或者纸盒2A4就能解决。所以你说它SAP配置的问题吗也不完全但症状跟SAP打印失败一模一样。到这里你应该对这类问题有了一个完整的判断框架。接下来写一下这次实际修复的操作链路照着这一步一步来基本都能解决。4. 修复实操从SPAD到输出设备的手动链路排查归排查最终还是要落到修复上。以下是我在处理这类问题时实际走通的操作链路每一步都会解释为什么要这么做。4.1 检查页格式定义确定长宽的有效区域进入事务代码SPAD点击左侧菜单页面格式。这时系统会显示当前所有已定义的页面格式清单。找到你新增的那个格式双击进入查看。这里要重点确认的是格式名、宽度、高度、单位。SAP的页面格式单位一般是毫米也有用字符行和列表示的这取决于创建格式的时候选的单位字段。提示很多用户喜欢把格式名起成A4、A5这种标准名字然后自定义尺寸。我强烈不建议这么干因为标准格式名在设备类型映射里往往和真实A4语义绑定容易造成混乱。自定义格式建议名称以Z开头比如Z_CUSTOM_285x200一眼就能看出规格也方便后续匹配。如果你发现宽度高度没填完整尤其是有任何一个维度是0那这个格式基本是废的。SAP不会阻拦你保存但打印请求一过来只会报格式错误。补全长宽后最好做一个测试在SPAD里有一个打印功能点进去选择这个格式输出一个测试页可以快速验证格式本身能不能被Spool处理。这一步能帮你把格式本身的问题和输出设备映射的问题剥离开。4.2 把新格式绑定到输出设备确认格式本身没问题下一步是检查输出设备是否允许该格式。在SPAD主界面找到输出设备页签或前端输出管理双击你的打印机设备进入设备属性。切换到设备类型页签你会看到一个清单列出了该设备支持的页面格式映射。比如CNSAPWIN设备类型下一般默认有DINA4、DINA5、LETTER这些标准格式。你要找的是刚才新建的Z_CUSTOM_285x200在不在这个清单里。如果不在点击新增行格式名选择你的新格式同时在格式映射到那边填上设备类型实际接受的格式一般就选同一个格式除非你用设备类型做了匹配映射。保存之后再切到输出属性页签确认页面格式字段可以选择新格式。这一步操作就是解决设备类型不认这个格式的问题。保存后在SP01里把之前失败的请求删掉或重新打印再试一次。4.3 调整设备类型参数与打印控制字符串如果做完4.2还是失败不要急还有一层参数要看。回到输出设备的设备类型页签右下角通常有打印控制和控制字符串区域。这些字段定义了SAP发送给打印机的控制指令包括初始化、纸张选择、字体选择等。最常见的一个坑打印控制字符串里写死了Letter纸盒选择指令而你新格式实际是要在A4纸盒或者手动进纸盒里打的。打印机控制语言里有选择纸张来源的指令EPSON/惠普/PostScript各有不同。比如PostScript打印机的纸张选择指令是setpagedevice带着PageSize参数。如果控制字符串里强制指定了某一个纸盒或纸张类型恰好跟你的新格式的物理尺寸矛盾打印就会直接失败。这里我通常的做法是找一个同一台打印机上能正常打印的标准格式对比它的打印控制字符串跟出问题的格式的控制字符串做差异分析。很多时候问题就在某一行控制指令上。如果自己看不懂不要乱改可以把打印控制字符串截图发给打印机厂商的技术支持确认。4.4 前端打印SAPLPD的本地驱动核对如果你用的是前端打印方式做完SAP后台配置后还需要动一下本机打印机驱动。打开Windows设备和打印机找到对应打印机进入打印首选项。重点看两个位置纸张/质量页签的纸张尺寸列表里有没有你新增的那个自定义尺寸没有就自己添加一个同尺寸的自定义纸张纸张来源字段确认选择的纸盒和物理打印机上放纸的纸盒一致顺带提一句SAPLPD组件如果缓存了旧的设备行为有时需要重启才能生效。任务栏右下角找到SAPLPD图标右键退出再重新打一次。5. 踩过的坑SAP打印排查中最容易忽略的细节说完了标准流程再分享一些我在真实项目里踩过、也帮客户排掉过的坑。这些内容不一定会出现在官方文档里但实际工作中超级常见。5.1 关于A4自定义尺寸上限的隐形规则很多打印机驱动的自定义纸张都有宽度和高度的限制范围比如上下限可能是100mm~457mm。如果你在SAP里定义的格式是500mm宽SPAD和预览完全OK但到了驱动层驱动会直接拒绝接收超过上限的任务表现为打印失败或没有任何响应。我建议是新增格式之前先去打印机驱动的自定义纸张列表里看一下最大支持尺寸。SAP端的格式尺寸不要超过驱动上限否则白调半天。5.2 分隔页和页格式串位有一个很容易被忽略的细节有些打印队列开启了分隔页功能就是每份打印任务前会多出一张带SAP信息的蓝色封面页。分隔页的输出格式和主文档输出格式如果不同比如分隔页是A4主文档是自定义尺寸打印机在切换纸张时会多走一次物理动作某些启用了强制纸张匹配的打印机会直接报错。这种问题在SP01里看到的往往是一个错误请求但点进去看不到具体格式错误。我当时的解决办法是把分隔页的格式改成和主文档一致或者干脆关闭分隔页功能。如果你业务上必须要分隔页确保它跟主文档纸张规格一致。5.3 双字节字符和字体下载问题处理中文标签类打印时这个问题简直就是定时炸弹。SAP的Smart Forms中文内容在预览里非常漂亮但发送到打印机时打印机的解析引擎要能识别对应的中文字体。PostScript打印机的字体通常存储在打印机里面或者需要下载到打印服务器。如果SAP Spool配置里没有包含中文字体下载指令打印出来可能是一堆空心方块或者干脆打印任务报错退出。遇到中文打印问题我一般会建议输出设备设备类型保持POSTSCRPT或CNSAPWIN不要为了兼容速度乱换来换去在设备类型里下载字体相关的控制字符串保持默认值不要为了优化性能删除检查Windows打印服务器上的字体文件是否完整SAP中文字体支持一般依赖独立的字体文件5.4 纸盒编号与纸张来源不一致SAP打印控制字符串里纸张来源常常被编码为具体的纸盒编号比如纸盒3代表Manual Feed。但不同品牌的打印机纸盒编号语义完全不同。佳能的纸盒2和惠普的纸盒2控制指令可能不只是换一个数字那么简单。举个例子某个客户打印自定义尺寸标签打印机驱动里已经配置了纸盒3标签纸SAP输出设备的控制字符串也选了纸盒3但就是打不出来。后来查了打印机手册才发现这台机器纸盒3的物理传感器宽度是固定的塞的标签纸宽度不匹配传感器检测不到纸张就直接报缺纸。这种物理层面的问题在SAP后台你是无论如何都查不出来的。我的建议是在打印服务器上用打印机自带的工具比如打印测试页、驱动自带的手动送纸测试先手动打一张排除物理打印机问题再来查SAP配置。顺序千万别搞反。5.5 用标准测试页做控制变量碰到这种SAP打印疑难杂症我个人最顺手的方法就是做控制变量实验。搞一套最简单的测试方案用标准A4、标准Smart Forms、标准输出设备打一张确认基本链路通然后只改一个变量比如换成自定义格式再打一张。如果你只改了格式就失败问题就在格式和设备映射上。如果标准A4都失败了那问题可能就不在格式上而是输出设备、驱动、或者Spool服务本身。很多时候我一到客户现场就让他们做这个最简单的A/B对比效率奇高。写在最后做一个技术支持十年我的经验是SAP打印这块的问题90%都不是高深的代码问题而是多层系统之间预期不一致导致的。预览成功很容易给人安全感让你忽略打印链路上还有一堆默默工作的组件。其实只要平时维护的时候多留个心眼配置的时候按链路一点一点核对这类预览成功、打印失败的问题完全可以在一杯咖啡的时间内解决。在排查和修复的过程中也慢慢理解了系统里那一个个细节字段的意义。以前总是搞不懂SAP为什么搞这么多复杂配置后来才明白打印这个看起来小的功能背后其实是整个企业信息化体系的微缩版。只要有一次体会到配置对了任务跑通打印机刷刷地出纸的感觉你就再也不会轻视打印问题了。
返回列表