生成带有图像的pdf时,PDFkit会挂起

 伤心怪人_234 发布于 2023-02-12 20:29

我想将网页呈现为PDF.它使用单个图像,我读过你需要提供PDFkit的绝对URL才能使用图像,所以我的代码是:

= image_tag image_url(user.avatar)

这在以HTML格式查看时有效,并且PDFkit能够生成删除了图像的PDF.但是,在使用图像时,它会挂起,直到我杀死服务器.我怎样才能让它发挥作用?

这是杀死服务器时的完整输出:

2013-12-04 13:53:36.576 wkhtmltopdf[27410:507] CoreText performance note: Client called CTFontCreateWithName() using name "Arial" and got font with PostScript name "ArialMT". For best performance, only use PostScript names when calling this API.
2013-12-04 13:53:36.577 wkhtmltopdf[27410:507] CoreText performance note: Set a breakpoint on CTFontLogSuboptimalRequest to debug.
2013-12-04 13:53:36.582 wkhtmltopdf[27410:507] CoreText performance note: Client called CTFontCreateWithName() using name "Arial" and got font with PostScript name "ArialMT". For best performance, only use PostScript names when calling this API.
2013-12-04 13:53:36.584 wkhtmltopdf[27410:507] CoreText performance note: Client called CTFontCreateWithName() using name "Arial" and got font with PostScript name "ArialMT". For best performance, only use PostScript names when calling this API.
^C
RuntimeError - command failed: /usr/local/bin/wkhtmltopdf --page-size Legal --print-media-type --quiet - -:
  pdfkit (0.5.4) lib/pdfkit/pdfkit.rb:73:in `to_pdf'
  pdfkit (0.5.4) lib/pdfkit/middleware.rb:21:in `call'
  warden (1.2.3) lib/warden/manager.rb:35:in `block in call'
  warden (1.2.3) lib/warden/manager.rb:34:in `catch'
  warden (1.2.3) lib/warden/manager.rb:34:in `call'
  rack (1.5.2) lib/rack/etag.rb:23:in `call'
  rack (1.5.2) lib/rack/conditionalget.rb:25:in `call'
  rack (1.5.2) lib/rack/head.rb:11:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/flash.rb:241:in `call'
  rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
  rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/cookies.rb:486:in `call'
  activerecord (4.0.0) lib/active_record/query_cache.rb:36:in `call'
  activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call'
  activerecord (4.0.0) lib/active_record/migration.rb:369:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (4.0.0) lib/active_support/callbacks.rb:373:in `_run__4124003592524659480__call__callbacks'
  activesupport (4.0.0) lib/active_support/callbacks.rb:80:in `run_callbacks'
  actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/reloader.rb:64:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
  better_errors (1.0.1) lib/better_errors/middleware.rb:84:in `protected_app_call'
  better_errors (1.0.1) lib/better_errors/middleware.rb:79:in `better_errors_call'
  better_errors (1.0.1) lib/better_errors/middleware.rb:56:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.0.0) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.0.0) lib/rails/rack/logger.rb:21:in `block in call'
  activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `block in tagged'
  activesupport (4.0.0) lib/active_support/tagged_logging.rb:25:in `tagged'
  activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `tagged'
  railties (4.0.0) lib/rails/rack/logger.rb:21:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.2) lib/rack/runtime.rb:17:in `call'
  activesupport (4.0.0) lib/active_support/cache/strategy/local_cache.rb:83:in `call'
  rack (1.5.2) lib/rack/lock.rb:17:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/static.rb:64:in `call'
  railties (4.0.0) lib/rails/engine.rb:511:in `call'
  railties (4.0.0) lib/rails/application.rb:97:in `call'
  rack (1.5.2) lib/rack/content_length.rb:14:in `call'
  thin (1.6.0) lib/thin/connection.rb:82:in `block in pre_process'
  thin (1.6.0) lib/thin/connection.rb:80:in `catch'
  thin (1.6.0) lib/thin/connection.rb:80:in `pre_process'
  thin (1.6.0) lib/thin/connection.rb:55:in `process'
  thin (1.6.0) lib/thin/connection.rb:41:in `receive_data'
  eventmachine (1.0.3) lib/eventmachine.rb:187:in `run_machine'
  eventmachine (1.0.3) lib/eventmachine.rb:187:in `run'
  thin (1.6.0) lib/thin/backends/base.rb:73:in `start'
  thin (1.6.0) lib/thin/server.rb:162:in `start'
  rack (1.5.2) lib/rack/handler/thin.rb:16:in `run'
  rack (1.5.2) lib/rack/server.rb:264:in `start'
  railties (4.0.0) lib/rails/commands/server.rb:84:in `start'
  railties (4.0.0) lib/rails/commands.rb:78:in `block in '
  railties (4.0.0) lib/rails/commands.rb:73:in `tap'
  railties (4.0.0) lib/rails/commands.rb:73:in `'
  bin/rails:4:in `require'
  bin/rails:4:in `
'

Arman H.. 13

这是一个臭名昭着的问题,你正在遇到它,因为你的HTML中可能有相对链接的资产(即图像,CSS,JS,字体等),而你的网络服务器只能处理一个请求/线程一个时间(如WEBrick).

那会发生什么?当您请求其URL时,服务器开始生成PDF.PDFkit查找链接的资产,因此它尝试从服务器加载此资产,该服务器恰好与运行PDFkit的服务器相同.但是,服务器的单线程已经忙于运行PDFkit,因此它无法"释放"来提供所请求的资产.总而言之,这是一个僵局--PDFkit正在等待等待PDFkit完成处理的同一台服务器上的资产,以便它可以将资产提供给PDFkit ......

解决方案:Base64将您的资产嵌入HTML中,以便PDFkit不需要发出任何其他请求(我个人喜欢的解决方案),或者暂时将资产卸载到另一台服务器(例如临时AWS桶).您也可以尝试使用unicornThinWeb服务器启用多线程,或添加config.threadsafe!in application.rb,但不能保证这些方法会奏效.

当然,这些hacks(嵌入资源或托管其他地方)应该只在开发环境中使用 - 你不应该在生产中遇到这些问题,因为实时服务器应该(希望)能够处理多个GET要求.

1 个回答
  • 这是一个臭名昭着的问题,你正在遇到它,因为你的HTML中可能有相对链接的资产(即图像,CSS,JS,字体等),而你的网络服务器只能处理一个请求/线程一个时间(如WEBrick).

    那会发生什么?当您请求其URL时,服务器开始生成PDF.PDFkit查找链接的资产,因此它尝试从服务器加载此资产,该服务器恰好与运行PDFkit的服务器相同.但是,服务器的单线程已经忙于运行PDFkit,因此它无法"释放"来提供所请求的资产.总而言之,这是一个僵局--PDFkit正在等待等待PDFkit完成处理的同一台服务器上的资产,以便它可以将资产提供给PDFkit ......

    解决方案:Base64将您的资产嵌入HTML中,以便PDFkit不需要发出任何其他请求(我个人喜欢的解决方案),或者暂时将资产卸载到另一台服务器(例如临时AWS桶).您也可以尝试使用unicornThinWeb服务器启用多线程,或添加config.threadsafe!in application.rb,但不能保证这些方法会奏效.

    当然,这些hacks(嵌入资源或托管其他地方)应该只在开发环境中使用 - 你不应该在生产中遇到这些问题,因为实时服务器应该(希望)能够处理多个GET要求.

    2023-02-12 20:32 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有