Ipython: “以 PDF 格式下载”功能显示无用的错误消息并且需要很大的依赖

创建于 2015-02-08  ·  40评论  ·  资料来源: ipython/ipython

这更像是一个功能请求,因为我使用新笔记本 (Ipython 3) 在 Ubuntu 14.10 中测试了“下载为 PDF”功能,并且效果很好。 问题是,当我第一次尝试它时,我没有所需的依赖项,并收到一个错误消息说! LaTeX Error: File 'adjustbox.sty' not found 。 我试图绕过这个问题,只安装 adjustbox.sty 但最终我不得不安装texlive-latex-extra

问题是这需要安装至少 584 MB。 这是一个非常特定的功能的很大依赖。 所以有几个建议:

  1. 在 notebook 的 500 错误页面中找不到诸如 adjustbox 之类的依赖项时,显示更直接的错误消息。 目前,错误显示: nbconvert failed: PDF creating failed
  2. 从长远来看,使用 Web 服务转换为 PDF 的方式与从文档下载 PDF 时使用 Google Drive 相同的方式会很棒。
nbconvert

最有用的评论

感谢大家的发言,我正在经历并清理已经解决的旧问题,这个问题已经成熟了。

在这个问题上有很多很好的讨论,但总结一下:

1.现在会在转换失败时显示更详细的消息。 在笔记本版本 4.2.2 中,删除我机器上有问题的.sty文件会产生一条错误消息,如下所示:

screen shot 2016-10-27 at 11 57 41 am

2.我们不打算将笔记本转换为 PDF 作为网络服务
3.如果第三方提供这样的网络服务,内置笔记本下载自#7951 起就明确使用 LaTeX - 看起来像这样:

screen shot 2016-10-27 at 12 01 12 pm

4.至于所需依赖项的大小, @iuridiniz在此评论上方提出了一种解决方法。

未来围绕这些和相关问题的任何讨论都应该在https://github.com/jupyter/nbconvert 上进行

快乐黑客! :领结:

所有40条评论

乳胶错误是显示在 HTML 错误页面中,还是仅显示在终端中?
只要具体的错误信息到达错误页面,我想
这就是我们所能做的。 我们不打算尝试解析乳胶失败的原因 - 我是
当然有很多可能的方法。

研究生成 PDF 的替代方法会很有趣,
就像使用 reportlab 或 wkhtmltopdf。 我们绝对不应该大声疾呼
默认为 Web 服务。

终端中显示的乳胶错误。 在 HTML 错误页面中,我收到的唯一消息是nbconvert failed: PDF creating failed 。 将回溯添加到 HTML 错误页面怎么样?

我忘了提到使用 Web 服务的想法是在本地安装中发生错误时的一种回退。 创建一个服务器接收请求以转换类似于 nbviewer 的 ipynb 文件,这不是相当简单吗?

像 nbviewer 这样的网络服务是选择加入的人,他们明确地将他们的工作公开,并在互联网上。
默认情况下为 PDF 提供网络服务对隐私非常不利,并且会使笔记本无法在线使用。

目前唯一能做到这一点的服务是 matjax,因为它太大了。 对于 4.0,我们将其作为 IPython 的一部分发布。

@Carreau我并不是说 PDF 将在线公开发布,而是在由 Ipython 管理的服务器中转换并作为下载提供给用户作为备用,以防本地计算机中没有正确安装。

在开源世界中,让软件在您没有明确要求时自动将数据发送到服务器是非常不受欢迎的。 可以想象,我们可以将类似的操作作为显式选项“在 IPython 的服务器上转换为 PDF”,但是当本地转换失败时,我们不会将其作为后备。

是的,你说得对,那会更好。 也许一条消息说转换出了问题,还有一个额外的按钮可以使用外部网络服务下载文件。

我认为这是可行的,但在这种情况下,为什么要停留在 PDF 上?
在云中拥有(完整但仍受限制的)转换服务可能很有意义,并且已经多次提及。 那将是一个“nbviewer api”。 但是,如果发生用户数据泄露、黑客攻击或其他我们(尚未)准备解决的问题,它会引发有问题的法律责任问题。

不过,编写代码以便公司可以将其部署在他们的本地网络上会很好。

嗯,PDF 转换需要大量下载(尽管它的大部分内容都是文档)并且不太可能每个 Ipython 用户都会安装该包。 因此,我认为减少开始使用该功能的努力将是一个不错的补充。 您还想到了哪些其他转换?

实际上,我不会很高兴获得全面的转换服务,因为这样的项目需要大量的努力,这会减损笔记本的改进,并且在这种情况下收益递减定律很快适用。

关于用户数据泄漏,我认为唯一需要的就是 pynb 文件。 转换需要什么类型的用户信息? 在任何情况下,提供 PDF 的服务器都不应该保存用户信息。

用户数据包括笔记本内容本身。 虽然服务器不应该保存该信息,但您不知道何时向它发送 HTTP 请求它将如何处理它。

目前,我可以说您需要安装 Latex 才能将笔记本转换为 PDF。 依赖不是我们需要避免的。

目前,我可以说您需要安装 Latex 才能将笔记本转换为 PDF。 依赖不是我们需要避免的。

我同意@takluyver ,也许以后可以开发更详细的东西,但是现在,我可以要求人们安装 Latex 是否要使用此功能...

终端中显示的乳胶错误。 在 HTML 错误页面中,我收到的唯一消息是 nbconvert 失败:PDF 创建失败。 将回溯添加到 HTML 错误页面怎么样?

这对我来说似乎是个好主意,其他人对此有何看法?

这对我来说似乎是个好主意,其他人对此有何看法?

听起来不错...

将回溯添加到 HTML 错误页面怎么样?

这可能是有道理的,尽管 LaTeX 错误是存在的时间最长和信息最少的错误之一。 我们需要确保我们正确处理了 1000 行错误输出,而通常这些行中最多有一行包含任何有意义的信息。

您还想到了哪些其他转换

一切。 如果我们可以 PDF,为什么不能使用 HTML、RST、markdown,甚至 Just Latex。
安装 Pandoc 并不容易...

关于用户数据泄漏,我认为唯一需要的就是 pynb 文件。 转换需要什么类型的用户信息? 在任何情况下,提供 PDF 的服务器都不应该保存用户信息。

如果您有辅助文件,例如链接的图像,则可能也需要上传它们。
即使服务器不应该保存东西,如果我们被黑客入侵,它可能会,
或者它甚至可能会给你一个受感染的 PDF。

很难想象可以用数据(或缺少数据)做什么,参见 [这个例子])http://mashable.com/2015/01/28/redditor-muslim-cab-drivers/) 其中模式丢失的数据允许猜测纽约出租车司机的宗教信仰。

虽然我们同意该服务会很好,但我们可能不会默认启用它。
我们还需要开发人员和开发人员时间来维护在线服务+受到法律保护,
所以除非有人同意并这样做,或者我们为此获得资金,否则它发生的可能性很小。

对于错误消息,这是有道理的。

我同意,暂时最好描述依赖项并改进错误消息。

在尝试转换 ipynb 文件之前是否可以检测是否安装了 LaTeX? 如果可能的话,Ipython 将能够给出有用的错误消息,而不是抛出关于非常具体的文件的错误。 就我而言,我认为另一个软件包安装了 LaTeX 发行版,因为pdflatex似乎有效。 我想在这种情况下,Ipython 用户遇到的大多数错误都是由于没有安装 LaTeX 发行版。 因此,尽早发现此问题将使大多数用户受益。

也许,一个合理的妥协是将回溯添加到 HTML 错误页面,但默认情况下不显示(因为它太长且信息量不足。)单击某些文本后,例如“想要查看回溯?”,回溯可以被展示。 但是,如果可以及早检测到缺失的依赖项,错误页面中的主要消息应该传达这一点。

@takluyver

用户数据包括笔记本内容本身。 虽然服务器不应该保存该信息,但您不知道何时向它发送 HTTP 请求它将如何处理它。

但是你的意思是像@Carreau建议的那样

@Carreau

一切。 如果我们可以 PDF,为什么不能使用 HTML、RST、markdown,甚至 Just Latex。
安装 Pandoc 并不容易...

我认为转换服务中不需要 HTML 或 RST,因为它们已经在笔记本本身中可用。 不过,Markdown 和 LaTeX 转换可能很有用。

如果服务器被黑,一切皆有可能。 但是,被黑客入侵的可能性足够低,不应阻止人们启动服务。 相反,应该采取安全措施(及时安装安全更新、只打开需要的端口、启用防火墙、只安装需要的应用程序、SSL 等)

我想我们已经检查了pdflatex命令是否可用。 我怀疑有没有一种很好的方法来检查是否需要处理 Latex 的所有文件都存在,而不是运行它。

我怀疑有没有一种很好的方法来检查是否需要处理 Latex 的所有文件都存在,而不是运行它。

我赞同这个怀疑。

我认为转换服务中不需要 HTML 或 RST,因为它们已经在笔记本本身中可用。 不过,Markdown 和 LaTeX 转换可能很有用。

不要低估 nbconvert/nbviewer 所做的事情:-) 如果你有 SVG,它甚至可以将$ inkscape从 SVG 转换为 PNG。 你只是还没有击中那个。

如果服务器被黑,一切皆有可能。 但是,被黑客入侵的可能性足够低,不应阻止人们启动服务。 相反,应该采取安全措施(及时安装安全更新、只打开需要的端口、启用防火墙、只安装需要的应用程序、SSL 等)

这是很多工作,不要低估伟大的防火墙和 NSA。
但无论如何,有许多实验室远程连接到互联网服务是不可能的
另外,但我认为您严重低估了“等”中的工作量和“被黑客入侵的可能性”。

如果人们喜欢,比如 Peter Norvig,知道使用笔记本,然后可能使用该服务,那么它就有 100% 的机会成为攻击的目标。

在 Debian 发行版中,这有效:

 ➜  ~  dpkg -s sudo | grep "install ok installed"
 Status: install ok installed
 ➜  ~  dpkg -s texlive | grep "install ok installed"
 Status: install ok installed
 ➜  ~  dpkg -s texlive-latex-extra | grep "install ok installed"

我在运行最后一个命令之前卸载了texlive-latex-extra 。 不过,我对 Windows 一无所知。

@Carreau不,我的意思是说 nbconvert 已经做了很多有用的转换,所以我们不需要再次实现相同的转换服务。

关于安全问题,这是很多工作,但几乎是机械工作。 对于情报机构,你无能为力。 NSA 现在经常中断 SSL 加密连接。 “etc”中的工作量取决于站点的特定要求,但在这种情况下,由于服务的简单性,额外的需求不会太苛刻。

谷歌经常成为工业间谍的目标,如果某个外国情报机构想要窃取信息,他们选择的攻击向量将是 ipynb->pdf 服务的可能性几乎为 0%。 他们知道精通技术的人不会以如此粗心的方式上传敏感信息。 此外,如果他们想获得 Norvig 的数据,他们会感染他的笔记本电脑,然后每一个额外的安全措施都将毫无意义。

我同时安装了 latex 和 pdflatex,但在 RHEL 6 和 7 上,转换失败总是adjustbox.sty 。 它是否必须是这个似乎是非默认的样式文件?

PDF 导出在 Windows 7(或任何 Windows)上非常困难。

这是过程:

  1. 缺少错误 - pip 安装已损坏,但幸运的是 conda 安装今天可用。
  2. 缺少潘多克。 在 pip 或 conda 中根本不可用,因此在网络上搜索 18 MB 的 Windows 安装程序。
  3. 缺少 pdflatex。 在哪里可以得到这个用于 Windows 的? 有一个叫做 MiKTeX 的东西,它是一个 163 MB 的安装,并不清楚它会做这个 PDF 导出。

到目前为止,在我们接近之前,这是 1 次损坏的 pip 安装和卸载,1 次成功的 conda 安装,以及 2 次来自随机第三方的大量下载。

我只是不知道如何在大量用户的机器上维护它,这只是将文件输出为 PDF。 许多其他软件包无需任何依赖即可管理 PDF 导出。
没有更好的办法吗?

@blokeley希望你只需要处理一次。 我们几乎每周都要处理它。
如果你有更好的方法行得通,那就太好了。

我认为我们可以通过以下两种方式之一解决这个问题:

  1. 尝试验证是否安装了 Latex 及其依赖项。
  2. 编写一个PDF模板和导出器,直接输出为PDF。

我认为(2)实际上比(1)更容易。 我不知道这是否是团队对分配人力感兴趣的事情......我过去有一个直接的 PDF 模板,但它非常基本。

我认为我们进行PDF导出只有两种合理的方法:

  • HTML 通过浏览器打印预览 -> 打印到 pdf
  • 乳胶

如果有人想使用不同的工具编写另一个 PDF 导出器,作为自定义第三方导出器将受到欢迎,但可能不会作为 nbconvert 本身附带的新导出器。

也许像从“PDF”重命名为“Latex PDF”这样简单的事情以及更详细的错误消息就足够了。 现在 HTML 消息是“500:内部服务器错误”,没有任何迹象表明这是一个依赖问题(除了在用户可能无法访问的服务器控制台中)。

也许像从“PDF”重命名为“Latex PDF”一样简单

已经在 #7951 中完成

不过,错误消息仍应得到改进。

我很想编写 PDF 导出器,但我的时间有限(我不会找借口让你厌烦)。 如果没有其他事情发生,我会在今年夏天的某个时候尝试编写一个原型。

或者更现实地说,这可能是 Google Summer of Code 项目吗? 我很乐意捐赠一点现金。

IPython 不做 GSoC - Fernando 非常强烈地认为我们不值得花时间指导人们。

我遇到了与 Windows 7 类似的问题。
我在工作时使用防火墙,需要获得安装软件的特别许可。 我和我的一些同事正在尝试 Anaconda 发行版。 我们希望这将是我们唯一需要安装的东西。
我想我们总共需要 3 个插件,mathjax,pandoc,(这两个在详细的安装说明中有记录)和第三个 MiKTeX,它不在安装说明中。 直到你去 pandoc 页面你才发现。 让 notebook 和 nbconvert 在防火墙后面的 Windows 上完美运行并不容易!

有人可以编写一个 nbconvert PDF 导出器,它要么使用reportlab (现在可在 Windows 上安装 pip)直接转为 PDF,要么生成 HTML,然后使用wkhtmltopdfweasyprint等工具将其转换为 PDF。 如果运行得足够好,我们甚至可以将它包含在 nbconvert 中。 但我认为这还不够优先,以至于我们很快就会自己解决这个问题。

@drafter250如果您想使用转换为 pdf 的矢量化 matplotlib 图(svg),您可能还需要 Inkscape。
@takluyver我还快速浏览了 reportlab,但我担心安排布局,尤其是在存在等式的情况下,会非常棘手。 这是 LaTeX 的一大优势。

这里肯定有很多依赖项。 对于 nbconvert。 乳胶、狮身人面像、jinja、miktex、inkscape。 等等,我很难保持这一切正常。 是否有任何资源可以描述所有这些如何相互关联以提供 nbconvert 完整功能。 也许最好禁用无法解析依赖项的各种命令

目前,我可以说您需要安装 Latex 才能将笔记本转换为 PDF。 依赖不是我们需要避免的。

问题是,目前所有(大多数?)RHEL-ish 发行版都被锁定无法转换。 生成的 Latex 代码依赖于adjustbox.sty并且没有提供该文件的可用包(影响:RHEL6、RHEL7、EPEL6、EPEL7、Scientific 和据称的 CentOS)

这似乎是关于 OP 原始错误的违规拉取请求:

  • #3578 使用 adjustbox 在 nbconvert -> latex 中指定图形大小
    490

尝试使用jsPDF可能会很有趣。

@serverhorror已经存在一个关于 adjustbox 的错误报告。 所以希望很快就会有解决方案。
或者,在本地安装 adjustbox.sty 应该不难,请参阅此处的评论

@jakobgager我已经看到了。 不幸的是,RHEL7 (EPEL7) 甚至还没有出现在路线图上(waaaaayyyy 超出我的控制范围)。

暂时我只使用本地打补丁的版本,基本上可以恢复 #3578

+1

如果您使用(在 ubuntu 15.04 中):

apt-get install --no-install-recommends texlive-latex-extra texlive-fonts-recommended

您将下载大小减少到 24 MB(而不是 606 MB)。 它不下载一些文档(大约 300 MB)

感谢大家的发言,我正在经历并清理已经解决的旧问题,这个问题已经成熟了。

在这个问题上有很多很好的讨论,但总结一下:

1.现在会在转换失败时显示更详细的消息。 在笔记本版本 4.2.2 中,删除我机器上有问题的.sty文件会产生一条错误消息,如下所示:

screen shot 2016-10-27 at 11 57 41 am

2.我们不打算将笔记本转换为 PDF 作为网络服务
3.如果第三方提供这样的网络服务,内置笔记本下载自#7951 起就明确使用 LaTeX - 看起来像这样:

screen shot 2016-10-27 at 12 01 12 pm

4.至于所需依赖项的大小, @iuridiniz在此评论上方提出了一种解决方法。

未来围绕这些和相关问题的任何讨论都应该在https://github.com/jupyter/nbconvert 上进行

快乐黑客! :领结:

此页面是否有帮助?
0 / 5 - 0 等级