【问题标题】:export notebook to pdf without code [duplicate]将笔记本导出为没有代码的pdf [重复]
【发布时间】:2016-04-21 11:58:15
【问题描述】:

我有一个大笔记本,里面有很多数字和文字。我想将其转换为 html 文件。但是,我不想导出代码。我正在使用以下命令

ipython nbconvert --to html notebook.ipynb

但此选项也会导出代码。有没有办法不用代码把notebook转成html?

【问题讨论】:

  • 您要导出为 PDF(即您的标题)还是 HTML(即您的问题的正文)?还是两者都有?
  • 我们都说@gboffi
  • nbconvert 内置了对此的支持。见这里:stackoverflow.com/a/50790330
  • 您只需将--no-input 参数传递给nbconvert
  • jupyter nbconvert --no-input --to html notebook.ipynb

标签: python ipython-notebook jupyter-notebook nbconvert


【解决方案1】:

我发现 this 文章很有趣,它解释了如何删除输入列:

您必须在要转换的笔记本所在的目录中创建一个名为“hidecode.tplx”的模板文件并在其中添加这些行:

    ((*- extends 'article.tplx' -*))

((* block input_group *))
    ((*- if cell.metadata.get('nbconvert', {}).get('show_code', False) -*))
        ((( super() )))
    ((*- endif -*))
((* endblock input_group *))

运行此命令后,它将使用 pdfLatex 通过 Latex 将笔记本转换为 pdf:

jupyter nbconvert --to pdf --template hidecode Example.ipynb

或者如果您想编辑,您可以将其转换为 .tex 文档并使用 pdfLatex 将其放入 pdf 中:

jupyter nbconvert --to latex --template hidecode Example.ipynb

2018 年 9 月编辑:

ipython nbconvert 已弃用。会被jupyter nbconvert替换:所以我们把命令ipython替换成jupyter

2021 年 2 月编辑:(这是我最好的答案,让我来处理)

在@Mrule 注释之后添加 --no-input 标志将使其在没有模板的情况下工作...

jupyter nbconvert --to latex --no-input Example.ipynb 

PS:如果你遇到问题说:

未找到与 tcolorbox.sty 相关的 LaTeX 错误

请参考this guide更新您的tex安装和this question

【讨论】:

  • 这对于导出到 html 不起作用...它抱怨找不到模板
  • 不像开箱即用那样工作。
  • 第二;可以确认,截至 2020 年 10 月 12 日,在 jupyter nbconvert 版本 6.0.7 上这没有任何作用。
  • 你能告诉我们什么不起作用吗?以及我们如何改进答案? @MRule
  • 似乎 nbconvert 6.07 只是忽略了该模板中设置的任何内容。但!现在有一个更好的选择:将 --no-input 作为标志传递给 jupyter nbconvert。
【解决方案2】:

我在 SO 中寻求同样的问题,最后变成了一个非常简单的方法:

假设使用 Firefox(57) + Win7

  1. 运行 Jupyter notebook 并在浏览器中下载 notebook:File->Download as->HTML,你会得到一个包含代码和输出的 html 页面。
  2. 使用浏览器打开导出的 HTML 并使用键 F12 激活浏览器控制台
  3. 在控制台中运行以下命令:

    document.querySelectorAll("div.input").forEach(function(a){a.remove()})
    
  4. 代码删除所有输入 div DOM。然后right mouse button 并选择“将页面另存为”并保存“完整页面”(不是单页)。

  5. 您将在 windows 中获得一个包含相关文件夹的页面。通过压缩 html 页面使用技巧,然后提取以解除关联。文件夹没用。

  6. 现在它是一个没有代码的单个 html 页面。您可以重新分发或打印为 PDF。

如果您使用的不是Firefox或Windows,请调整以上3-6个步骤。

【讨论】:

  • 也适用于 Chrome!
  • 可能看起来很疯狂,但这很简单,而且效果很好。感谢您挖掘这个!
  • 我按照你说的在控制台中复制了命令,但它产生了undefined,并且没有任何内容被删除
  • 我认为现在是document.querySelectorAll("div.jp-InputArea.jp-Cell-inputArea").forEach(function(a){a.remove()}),但例如这会保留错误和降价,也许你不想要。要删除所有输入单元格,不仅可以使用 document.querySelectorAll("jp-Cell jp-CodeCell jp-Notebook-cell").forEach(function(a){a.remove()}) 编码单元格,而且是一种检查您想要的列并删除它们检查 div 名称的方法。
【解决方案3】:

这是我的做法: 我只是将我的笔记本下载为 html。

然后运行这个 python 脚本来转换那个 html 文件,这样提示和代码单元就消失了:

FILE = "/somewhere/myHTMLFile.html"

with open(FILE, 'r') as html_file:
    content = html_file.read()

# Get rid off prompts and source code
content = content.replace("div.input_area {","div.input_area {\n\tdisplay: none;")    
content = content.replace(".prompt {",".prompt {\n\tdisplay: none;")

f = open(FILE, 'w')
f.write(content)
f.close()

该脚本基本上为 'prompt' 或 'input_area' 类的所有 div 添加了 CSS 'display: none' 属性。

【讨论】:

  • 只是想感谢您提供此代码。我已经使用了许多'janky'方法来删除输入区域和提示,没有一个像这样简单和干净。谢谢!
  • 非常感谢!这绝对是最简单的方法,而且效果很好!
【解决方案4】:

作为this answer 的概括,使得 hidecode 模板可以从多个位置访问:

  1. 进入你的主目录:

    cd ~/.jupyter
    
  2. 在该目录下创建jupyter_nbconvert_config.py

  3. 将以下内容写入.py 文件(将user_name 更改为您的用户名):

    c = get_config()
    c.TemplateExporter.template_path = ['.', "~/.jupyter" ]
    c.LatexExporter.template_path = ['.', "~/.jupyter"]
    
  4. 在该目录下创建一个模板文件,命名为hidecode.tplxhidecode.tpl

        ((*- extends 'article.tplx' -*))
    
    ((* block input_group *))
        ((*- if cell.metadata.get('nbconvert', {}).get('show_code', False) -*))
                ((( super() )))
        ((*- endif -*))
    ((* endblock input_group *))
    
  5. 然后,以下应该生成一个没有.ipynb 文件代码的 PDF(将 file_name 更改为您的文件名):

    jupyter nbconvert --to pdf '<file_name>.ipynb' --template=hidecode.tpl
    

【讨论】:

    【解决方案5】:

    您可以将此 CSS 添加到您的页面,然后从浏览器打印成 PDF。请注意,代码只是隐藏而不是删除。

    div.output_prompt { visibility: hidden; }
    *{ font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif !important }
    .input,#header { display: none; }
    

    为确保删除代码,您应该使用类似

    $(".input").remove()
    

    据我所知,无法通过 Latex 生成不包含代码的 PDF。如果有一个 jupyter notebook 扩展可以做到这一点,那就太好了......

    【讨论】:

      【解决方案6】:

      nbconvert 使用模板将 notebook 的 JSON 转换为文档;比如nbconvert自带的markdown模板中,markdown.tpl

      {% block input %}
      {% if nb.metadata.language_info %}{{ nb.metadata.language_info.name }}{% endif %}
      {{ cell.source}}
      {% endblock input %}
      

      在输出中打印每个单元格的源。如果您删除{{ cell.source}},则单元格源将不会打印出来。 HTML 和 Latex 模板中也有相应的块。

      更好的是,制作您自己的模板,完全符合您的要求:)

      【讨论】:

      • 该模板位于何处?或者如果我想使用另一个,我应该将新模板指定为 jupyter nbconvert 命令的参数吗?
      • github.com/jupyter/nbconvert/blob/master/nbconvert/templates/… 用于股票模板 - 它应该与 nbconvert 一起安装在您的 python 路径中的某处。我通常在配置文件中指定模板,但是 IIRC 也有一个 CLI 参数。
      猜你喜欢
      • 2019-05-28
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 2019-01-07
      相关资源
      最近更新 更多