Script: man2ps, man2pdf, man2evince

Usage:

  • $ man2ps command will generate a PostScript (.ps) file from command's manpage
  • Symlink or copy this script as "man2pdf" to create a PDF from a manpage.
  • Symlink or copy this script as "man2evince" to call evince on a temporary PDF of the manpage
#!/bin/bash

# man2ps, (c) 2004,2005,2006,2009 Toni Corvera, published under a BSD license
#
# Saves a man page as either a PostScript (PS) or as a PDF file.
#
# This script is also used as a testbed for some experiments,
# as of now only rudimentary in-file localisation is kept, in the past
# the script could also be sourced and work as a function but it led to
# unwanted pollution of the environment.
#
# $Rev: 242 $
#
# Changelog:
# 0.11.0 (2009-03-09):
#     - Added man2evince
#     - Check for man page existence
# 0.10.0 (2006-06-27):
#     - First version with a changelog
#     - Explicit usage of bash
#     - Better use of bashisms
#     - Usage of /usr/include/sysexits.h -compatible exit codes
#     - Dropped support to be used as a function (sourced)
#     - Dropped support for long options
#     - Complete help message
#     - Wrapped localized strings into functions, may help parsing speed. Or maybe not.
#     - Added set -e
#
# 0.9.2 (2005)

set -e

# Current version
VER=0.11.0
# Command name for information messages
CMD=`basename $0`

### Simple localisation support ###

# Language codes
declare -ir _EN=0 _ES=1 _CA=2
declare -a LANGS=( en es ca ) # Languages un the same order as their index
declare -i _L

# Error messages
error_nops2pdf() {
    local nopdf_strs=( "ps2pdf wasn't found, can't export to PDF"
                       "No se ha encontrado ps2pdf, no se puede exportar a PDF"
                       "No s'ha trobat ps2pdf, no es pot exportar a PDF" )
    echo ${nopdf_strs[$_L]} >&2
}

error_bad_cmdline() {
    local badcmdline_strs=( "Use -h to get usage instructions"
                            "Usa -h para obtener ayuda"
                            "Utilitza -h per obtenir ajuda" )
    echo ${badcmdline_strs[$_L]} >&2
}

error_notvalid_ver() {
    local allowedvers_strs=( "Only versions 2, 3 and 4 of ps2pdf are allowed"
                             "Sólo las versiones 2, 3 y 4 de ps2pdf están permitidas"
                             "Només les versions 2, 3 i 4 de ps2pdf estan permeses" )
    echo ${allowedvers_strs[$_L]} >&2
}

# Information messages
declare -r VERSION_STRING="${CMD} v${VER}, (c) 2004,2005,2006 Toni Corvera"

show_help() {
    # Localised functions
    en() {
        echo "$VERSION_STRING"
        echo "   saves a man page as a PostScript or PDF file"
        echo "Options:"
        echo "   -h         Show this help message"
        echo "   -p         Force PDF mode for output"
        echo "   -V VER     Use ps2pdf version 1.VER (VER must be one of 2, 3 or 4), "
        echo "              by default the newest available version is used"
    }

    es() {
        echo "$VERSION_STRING"
        echo "   guarda una página de manual como archivo PostScript o PDF"
        echo "Opciones:"
        echo "   -h         Muestra este mensaje de ayuda"
        echo "   -p         Fuerza la salida a un archivo pdf"
        echo "   -V VER     Usa la versión 1.VER de ps2pdf (VER puede ser 2, 3 o 4), "
        echo "              por defecto se usa la versión más reciente disponible"
    }

    ca() {
        echo "$VERSION_STRING"
        echo "   desa una pàgina de manual com arxiu PostScript o PDF"
        echo "Opcions:"
        echo "   -h         Mostra aquest missatge d'ajuda"
        echo "   -p         Força la sortida a un fitxer PDF"
        echo "   -V VER     Utilitza la versió 1.VER de ps2pdf (VER pot ser 2, 3 o 4), "
        echo "              per defecte s'utilitza la versió disponible més nova"
    }

    ${LANGS[$_L]}
}

show_usage() {
    local usage_strs=(
                        "Usage: ${CMD} [options] <manual page>"
                        "Uso: ${CMD} [opciones] <página del manual>"
                        "Ús: ${CMD} [opcions] <pàgina del manual>"
                     )

    echo "${usage_strs[$_L]}"
}

# $1 => ps2pdf program name
show_ps2pdf_version() {
    local pdfver_strs=( "Using ps2pdf version:"
                        "Usando ps2pdf en su variante:"
                        "Fent servir ps2pdf en sa versió:" )
    echo "${pdfver_strs[$_L]} $1" >&2
}

# Language detection
# FIXME: is the precedence order correct?
for i in LC_ALL LC_MESSAGES LANG ; do
    # Indirect variable reference, see http://www.tldp.org/LDP/abs/html/ivr.html#IVRREF
    eval val=$$i

    if [ "$val" ]; then
        case $val in
            es*) _L=$_ES ;;
            ca*) _L=$_CA ;;
            *)   _L=$_EN ;;
        esac
        break
    fi
done
if [ -z $_L ]; then _L=$_EN; fi

### Core functionality ###

declare -i PDF=0 EVINCE=0
ps2pdf=
PS2PDF_VER=

if [ $(basename "$0") == "man2pdf" ]; then
    PDF=1
elif [ $(basename "$0") == "man2evince" ]; then
    PDF=1
    EVINCE=1
fi

# Command line parsing
while getopts "hpV:" options ; do
    case $options in
        h) show_help && exit 0 ;;
        p) PDF=1 ;;
        V)
            if ! echo -n "$OPTARG" | egrep '^[234]$' >/dev/null 2>/dev/null ; then
                error_notvalid_ver
                error_bad_cmdline
                exit 64
            fi
            PS2PDF_VER=$OPTARG
        ;;
        ?)
            error_bad_cmdline
            exit 64
        ;;
    esac
done
shift $(($OPTIND - 1))

if [ -z "$1" ]; then
    show_usage
    exit 64
fi

if [ $PDF -eq 0 ]; then
    man -t "$1" > "${1}.ps"
else
    # Use the newest ps2pdf
    if [ -z "$PS2PDF_VER" ]; then
        for prog in ps2pdf14 ps2pdf13 ps2pdf12 ps2pdf ; do
            ps2pdf=`which $prog` && break
        done
    else
        ps2pdf=`which ps2pdf1$PS2PDF_VER` || true
    fi

    if [ -z "$ps2pdf" ]; then
        error_nops2pdf
        exit 69
    fi

    show_ps2pdf_version $(basename "${ps2pdf}")
    OUTPUT="${1}.pdf"
    if [ $EVINCE -eq 1 ]; then
        OUTPUT="$(tempfile --suffix=.pdf)"
    fi
    # Check if the command has a manpage...
    if ! whatis "$1" >/dev/null ; then
        man "$1" # Display man's error...
        exit $?
    fi
    man -t "$1" | ${ps2pdf} - > "$OUTPUT"
    if [ $? -eq 0 ] && [ $EVINCE -eq 1 ]; then
        evince "$OUTPUT"
        rm -f "$OUTPUT"
    fi
fi # PDF -eq 0

# vim:set ts=4 et ai: #

Downloadable file: http://p.outlyer.net/graveyard/man2ps.

2 thoughts on “Script: man2ps, man2pdf, man2evince

  1. Chosen says:

    Simply doesn't work. It fails with: /usr/bin/man2ps: 21: /usr/bin/man2ps: Syntax error: "(" unexpected

    If it was saved to /usr/bin/man2ps and was made executeable.

  2. Toni Corvera says:

    Sorry, the linked script didn't match the updated version shown in the page. I've updated the link so you can re-download it now and it should work.


Please note: New comments won't appear immediately, they have to be manually approved (usually done quickly).

Leave a Reply

Your email address will not be published. Required fields are marked *