2

我正在尝试nbconvert从笔记本单元格中导出 jupyter 笔记本的 pdf 副本。我已经阅读了文档,但我只是找不到一些基本代码来实际执行 nbconvert 命令并导出为 pdf。

我能够做到这一点,但我希望有人能填补最后的空白。

from nbconvert import PDFExporter
notebook_pdf = PDFExporter()
notebook_pdf.template_file = '../print_script/pdf_nocode.tplx'

请注意确定如何从这里开始实际创建 pdf。

任何帮助,将不胜感激。

4

2 回答 2

9

我不是专家,但设法让这个工作。关键是您需要对笔记本进行预处理,这将允许您使用该PDFExporter.from_notebook_node()功能。这将为您提供字节格式的 pdf_data,然后可以将其写入文件:

import nbformat
from nbconvert.preprocessors import ExecutePreprocessor
from nbconvert import PDFExporter

notebook_filename = "notebook.ipynb"

with open(notebook_filename) as f:
    nb = nbformat.read(f, as_version=4)

ep = ExecutePreprocessor(timeout=600, kernel_name='python3')

ep.preprocess(nb, {'metadata': {'path': 'notebooks/'}})

pdf_exporter = PDFExporter()

pdf_data, resources = pdf_exporter.from_notebook_node(nb)

with open("notebook.pdf", "wb") as f:
    f.write(pdf_data)
    f.close()

值得注意的是 ExecutePreprocessor 需要 resources 字典,但我们在本例中没有使用它。

于 2017-02-02T21:41:16.927 回答
0

以下是将 .ipynb 文件转换为 .html POST 的 rest api:http://URL/export/<id> Get:http://URL/export/<id>将返回一个 id.html

import os
from flask import Flask, render_template, make_response
from flask_cors import CORS
from flask_restful import reqparse, abort, Api, Resource
from nbconvert.exporters import HTMLExporter

exporter = HTMLExporter()

app = Flask(__name__)
cors = CORS(app, resources={r"/export/*": {"origins": "*"}})
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('path')
notebook_file_srv = '/path of your .ipynb file'

def notebook_doesnt_exist(nb):
    abort(404, message="Notebook {} doesn't exist".format(nb))


class Notebook(Resource):
    def get(self, id):
        headers = {'Content-Type': 'text/html'}
        return make_response(render_template(id + '.html'), 200, headers)


    def post(self, id):
        args = parser.parse_args()
        notebook_file = args['path']

        notebook_file = notebook_file_srv + id + '.ipynb'

        if not os.path.exists(notebook_file):
            return 'notebook \'.ipynb\' file not found', 404
        else:
            nb_name, _ = os.path.splitext(os.path.basename(notebook_file))
            # dirname = os.path.dirname(notebook_file)
            output_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'templates')

            output_path = os.path.join(output_path, '{}.html'.format(nb_name))

            output, resources = exporter.from_filename(notebook_file)

            f = open(output_path, 'wb')
            f.write(output.encode('utf8'))
            f.close()
            return 'done', 201


api.add_resource(Notebook, '/export/<id>')

if __name__ == '__main__':
    app.run(debug=True)
于 2019-02-03T10:50:07.970 回答