Search code examples
pythonpdfjupyter-notebookpdf-generationfile-conversion

Converting Python Notebook to Pdf using colab_pdf


I am trying to convert my ipython notebook (.ipynb) file to pdf. I always used to use this method of conversion:

  1. Save the .ipynb file in drive/mydrive/Colab Notebooks

  2. Mount the drive

    from google.colab import drive
    drive.mount('/content/gdrive')
    
  3. download the pdf

    !wget -nc https://raw.githubusercontent.com/brpy/colab-pdf/master/colab_pdf.py
    from colab_pdf import colab_pdf
    colab_pdf('mynotebookname.ipynb')
    

But this method is not working anymore. I get this problem when I try to convert:

Error:

--2022-08-19 12:47:01-- https://raw.githubusercontent.com/brpy/colab-pdf/master/colab_pdf.py Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1864 (1.8K) [text/plain] Saving to: ‘colab_pdf.py’

colab_pdf.py 100%[===================>] 1.82K --.-KB/s in 0s

2022-08-19 12:47:01 (30.7 MB/s) - ‘colab_pdf.py’ saved [1864/1864]

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

[NbConvertApp] WARNING | pattern '$notebookpath$file_name' matched no files This application is used to convert notebook files (*.ipynb) to various other formats.

    WARNING: THE COMMANDLINE INTERFACE MAY CHANGE IN FUTURE RELEASES.

Options

The options below are convenience aliases to configurable class-options,
as listed in the "Equivalent to" description-line of the aliases.
To see all configurable class-options for some <cmd>, use:
    <cmd> --help-all

--debug
    set log level to logging.DEBUG (maximize logging output)
    Equivalent to: [--Application.log_level=10]
--show-config
   Show the application's configuration (human-readable format)
   Equivalent to: [--Application.show_config=True]
--show-config-json
   Show the application's configuration (json format)
   Equivalent to: [--Application.show_config_json=True]
--generate-config
   generate default config file
   Equivalent to: [--JupyterApp.generate_config=True]
-y
   Answer yes to any questions instead of prompting.
   Equivalent to: [--JupyterApp.answer_yes=True]
--execute
   Execute the notebook prior to export.
   Equivalent to: [--ExecutePreprocessor.enabled=True]
--allow-errors
   Continue notebook execution even if one of the cells throws an error and include the 
   error message in the cell output (the default behaviour is to abort conversion). This 
   flag is only relevant if '--execute' was specified, too.
   Equivalent to: [--ExecutePreprocessor.allow_errors=True]
--stdin
   read a single notebook file from stdin. Write the resulting notebook with default 
   basename 'notebook.*'
   Equivalent to: [--NbConvertApp.from_stdin=True]
--stdout
   Write notebook output to stdout instead of files.
   Equivalent to: [--NbConvertApp.writer_class=StdoutWriter]
--inplace
   Run nbconvert in place, overwriting the existing notebook (only 
        relevant when converting to notebook format)
   Equivalent to: [--NbConvertApp.use_output_suffix=False -- 
   NbConvertApp.export_format=notebook --FilesWriter.build_directory=]
--clear-output
   Clear output of current file and save in place, 
        overwriting the existing notebook.
   Equivalent to: [--NbConvertApp.use_output_suffix=False -- 
  NbConvertApp.export_format=notebook --FilesWriter.build_directory= -- 
  ClearOutputPreprocessor.enabled=True]
--no-prompt
  Exclude input and output prompts from converted document.
  Equivalent to: [--TemplateExporter.exclude_input_prompt=True -- 
  TemplateExporter.exclude_output_prompt=True]
--no-input
  Exclude input cells and output prompts from converted document. 
        This mode is ideal for generating code-free reports.
  Equivalent to: [--TemplateExporter.exclude_output_prompt=True -- 
  TemplateExporter.exclude_input=True]
--log-level=<Enum>
   Set the log level by value or name.
   Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']
   Default: 30
   Equivalent to: [--Application.log_level]
--config=<Unicode>
Full path of a config file.
Default: ''
Equivalent to: [--JupyterApp.config_file]
--to=<Unicode>
The export format to be used, either one of the built-in formats
        ['asciidoc', 'custom', 'html', 'latex', 'markdown', 'notebook', 'pdf', 'python', 
'rst', 'script', 'slides']
        or a dotted object name that represents the import path for an
        `Exporter` class
Default: 'html'
Equivalent to: [--NbConvertApp.export_format]
--template=<Unicode>
Name of the template file to use
Default: ''
Equivalent to: [--TemplateExporter.template_file]
--writer=<DottedObjectName>
Writer class used to write the 
                                    results of the conversion
Default: 'FilesWriter'
Equivalent to: [--NbConvertApp.writer_class]
--post=<DottedOrNone>
PostProcessor class used to write the
                                    results of the conversion
Default: ''
Equivalent to: [--NbConvertApp.postprocessor_class]
--output=<Unicode>
overwrite base name use for output files.
            can only be used when converting one notebook at a time.
Default: ''
Equivalent to: [--NbConvertApp.output_base]
--output-dir=<Unicode>
Directory to write output(s) to. Defaults
                              to output to the directory of each notebook. To recover
                              previous default behaviour (outputting to the current 
                              working directory) use . as the flag value.
Default: ''
Equivalent to: [--FilesWriter.build_directory]
--reveal-prefix=<Unicode>
The URL prefix for reveal.js (version 3.x).
        This defaults to the reveal CDN, but can be any url pointing to a copy 
        of reveal.js. 
        For speaker notes to work, this must be a relative path to a local 
        copy of reveal.js: e.g., "reveal.js".
        If a relative path is given, it must be a subdirectory of the
        current directory (from which the server is run).
        See the usage documentation
        (https://nbconvert.readthedocs.io/en/latest/usage.html#reveal-js-html-slideshow)
        for more details.
Default: ''
Equivalent to: [--SlidesExporter.reveal_url_prefix]
--nbformat=<Enum>
The nbformat version to write.
        Use this to downgrade notebooks.
Choices: any of [1, 2, 3, 4]
Default: 4
Equivalent to: [--NotebookExporter.nbformat_version]

Examples

The simplest way to use nbconvert is

        > jupyter nbconvert mynotebook.ipynb

        which will convert mynotebook.ipynb to the default format (probably HTML).

        You can specify the export format with `--to`.
        Options include ['asciidoc', 'custom', 'html', 'latex', 'markdown', 'notebook', 'pdf', 'python', 'rst', 'script', 'slides'].

        > jupyter nbconvert --to latex mynotebook.ipynb

        Both HTML and LaTeX support multiple output templates. LaTeX includes
        'base', 'article' and 'report'.  HTML includes 'basic' and 'full'. You
        can specify the flavor of the format used.

        > jupyter nbconvert --to html --template basic mynotebook.ipynb

        You can also pipe the output to stdout, rather than a file

        > jupyter nbconvert mynotebook.ipynb --stdout

        PDF is generated via latex

        > jupyter nbconvert mynotebook.ipynb --to pdf

        You can get (and serve) a Reveal.js-powered slideshow

        > jupyter nbconvert myslides.ipynb --to slides --post serve

        Multiple notebooks can be given at the command line in a couple of 
        different ways:

        > jupyter nbconvert notebook*.ipynb
        > jupyter nbconvert notebook1.ipynb notebook2.ipynb

        or you can specify the notebooks list in a config file, containing::

            c.NbConvertApp.notebooks = ["my_notebook.ipynb"]

        > jupyter nbconvert --config mycfg.py

To see all available configurables, use --help-all.

File Download Unsuccessful. Saved in Google Drive

Can you please help me in this matter? Thanks in advance. Any help will be highly appreciated. :)


Solution

  • I'm not sure what the problem is. However you could generate the pdf directly with nbconvert:

    # Mount the drive
    from google.colab import drive
    drive.mount('/content/gdrive')
    
    # Go to the directory where your file is
    %cd /content/drive/MyDrive/Colab\ Notebooks/
    
    # Verify that now you see your notebooks
    !ls
    
    # Convert
    !jupyter nbconvert --to pdf my_notebook.ipynb
    

    The \ in /Colab\ Notebooks is required to signal a space inside the path. Instead of using %cd you could also use the following, avoiding to insert \s:

    import os
    os.chdir("/content/gdrive/MyDrive/Colab Notebooks/")
    

    Update: other packages may be required to be installed, depending on the notebook to download. For example you may need to install:

    !apt-get install texlive-xetex texlive-fonts-recommended texlive-plain-generic
    

    You can find the full list here.