weixin_44068894 2024-02-28 10:11 采纳率: 0%
浏览 38

Java调用Microsoft Print to PDF打印机生成pdf文件失败

在tomcat启动的Java服务中需要调用系统的Microsoft Print to PDF打印机生成pdf文件,执行到private native boolean _startDoc(String dest, String jobName) throws PrinterException;后一直卡住无响应,但是将打印机换成OneNote (Desktop)就可以。以上的情况在使用命令在cmd启动tomcat时运行ok可以正常生成pdf,但是当tomcat作为Windows服务运行时就会出现以上的问题。以window服务启动时“login on” 的账号在group “administrators”中,“Log on as” “Local System account”时也会出现这个问题,怀疑时权限问题,但是不知道怎么排查与修复,知道的大佬提点一下。

  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2024-02-28 10:12
    关注

    weixin_44068894 上午好☀️☀️☀️️
    本答案参考通义千问

    问题分析:

    • Java服务调用系统打印机生成PDF失败:可能是由于权限不足、驱动程序兼容性问题、系统设置或者Java Native Interface (JNI) 函数调用的问题。
    • 推荐打印机不同导致成功: OneNote (Desktop) 可能是通过不同的打印方式或API来工作的,不一定是打印功能。

    解决方案:

    1. 检查权限:

      • 确保Java服务运行用户有权限访问Microsoft Print to PDF打印机。可以尝试以管理员身份运行Java服务,或者为该用户分配适当的打印权限。
      • 代码示例(使用java.lang.management.ManagementFactory检查当前用户权限):
      ManagementFactory.getRuntimeMXBean().getUserPrincipal();
      

      如果权限不足,可能需要修改服务运行配置或使用具有足够权限的用户账户。

    2. 更新驱动程序:

      • 确保Microsoft Print to PDF的驱动程序是最新的,过时的驱动可能会导致兼容性问题。
      • 更新驱动程序可以通过设备管理器手动操作,或者查找官方发布的最新驱动程序安装。
    3. 检查系统设置:

      • 检查Windows的打印机设置,确保Microsoft Print to PDF在所有应用程序中都允许被选择。
      • 右键点击打印机 -> 打印首选项 -> 兼容性 -> 添加/排除应用程序。
    4. 检查JNI函数:

      • 如果是JNI问题,可能是函数签名不匹配或者函数内部逻辑错误。查看Java代码中的native方法是否正确实现了C++/C#的对应接口。
      • 使用System.out.println("Native method called!");这类日志跟踪,确认native方法是否被调用。
    5. 使用第三方库:

      • 如果以上方法都无法解决问题,可以考虑使用Java的第三方PDF生成库,如iText、Apache PDFBox等,它们可能提供了更稳定的PDF输出支持。
    6. 错误处理和日志:

      • 在关键点添加日志输出,记录调用堆栈和返回值,以便更好地定位问题。
      try {
          // Native method call
      } catch (PrinterException e) {
          System.err.println("Error in native method: " + e.getMessage());
      }
      
    7. 寻求专业帮助:

      • 如果问题依然存在,可以尝试在开发者社区或微软技术支持论坛上寻求帮助,或者联系Microsoft官方技术支持。
    评论

报告相同问题?

问题事件

  • 修改了问题 2月28日
  • 修改了问题 2月28日
  • 创建了问题 2月28日