web-dev-qa-db-fra.com

Comment puis-je convertir automatiquement (de manière récursive) tous les fichiers de code source d'un dossier en un seul PDF avec une coloration syntaxique?

Je voudrais convertir le code source de quelques projets en un seul fichier imprimable pour économiser sur un usb et l’imprimer facilement plus tard. Comment puis je faire ça?

Modifier

Tout d'abord, je tiens à préciser que je souhaite uniquement imprimer les fichiers et les répertoires non cachés (donc, aucun contenu de .git par exemple).

Pour obtenir une liste de tous les fichiers non cachés situés dans des répertoires non cachés du répertoire en cours , vous pouvez exécuter la commande find . -type f ! -regex ".*/\..*" ! -name ".*" comme indiqué dans la réponse - ce fil .

Comme suggéré dans ce même fil, j'ai essayé de créer un fichier pdf à l'aide de la commande find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdf mais malheureusement, le fichier pdf résultant est un désordre total .

29
Bentley4

Votre question m'a intriguée et je me suis laissé emporter. Cette solution générera un fichier Nice PDF avec un index cliquable et un code en couleur. Il trouvera tous les fichiers dans le répertoire et les sous-répertoires actuels et créera une section dans le fichier PDF (voir les notes ci-dessous pour savoir comment rendre votre commande de recherche plus spécifique).

Vous devez avoir les éléments suivants installés (les instructions d’installation concernent les systèmes Debian, mais elles devraient être disponibles dans les dépôts de votre distribution):

  • pdflatex , color et listings

    Sudo apt-get install texlive-latex-extra latex-xcolor texlive-latex-recommended
    

    Cela devrait également installer un système LaTeX de base si vous n'en avez pas installé.

Une fois ceux-ci installés, utilisez ce script pour créer un document LaTeX avec votre code source. Le truc consiste à utiliser listings (partie de texlive-latex-recommended) et color ( installé par latex-xcolor) packages LaTeX. Le \usepackage[..]{hyperref} est ce qui rend les listes dans la table des matières des liens cliquables.

#!/usr/bin/env bash

tex_file=$(mktemp) ## Random temp file name

cat<<EOF >$tex_file   ## Print the tex file header
\documentclass{article}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color}  %% Allow color names
\lstdefinestyle{customasm}{
  belowcaptionskip=1\baselineskip,
  xleftmargin=\parindent,
  language=C++,   %% Change this to whatever you write in
  breaklines=true, %% Wrap long lines
  basicstyle=\footnotesize\ttfamily,
  commentstyle=\itshape\color{Gray},
  stringstyle=\color{Black},
  keywordstyle=\bfseries\color{OliveGreen},
  identifierstyle=\color{blue},
  xleftmargin=-8em,
}        
\usepackage[colorlinks=true,linkcolor=blue]{hyperref} 
\begin{document}
\tableofcontents

EOF

find . -type f ! -regex ".*/\..*" ! -name ".*" ! -name "*~" ! -name 'src2pdf'|
sed 's/^\..//' |                 ## Change ./foo/bar.src to foo/bar.src

while read  i; do                ## Loop through each file
    name=${i//_/\\_}             ## escape underscores
    echo "\newpage" >> $tex_file   ## start each section on a new page
    echo "\section{$i}" >> $tex_file  ## Create a section for each filename

   ## This command will include the file in the PDF
    echo "\lstinputlisting[style=customasm]{$i}" >>$tex_file
done &&
echo "\end{document}" >> $tex_file &&
pdflatex $tex_file -output-directory . && 
pdflatex $tex_file -output-directory .  ## This needs to be run twice 
                                           ## for the TOC to be generated    

Exécutez le script dans le répertoire contenant les fichiers source

bash src2pdf

Cela créera un fichier appelé all.pdf dans le répertoire en cours. J'ai essayé cela avec quelques fichiers de source aléatoires trouvés sur mon système (en particulier deux fichiers de la source de vlc-2.0.0). Voici une capture d'écran des deux premières pages du fichier PDF obtenu:

enter image description here


Quelques commentaires:

  • Le script ne fonctionnera pas si vos noms de fichier de code source contiennent des espaces. Puisque nous parlons de code source, je suppose que ce n’est pas le cas.
  • J'ai ajouté ! -name "*~" pour éviter les fichiers de sauvegarde.
  • Je vous recommande cependant d'utiliser une commande plus spécifique find pour rechercher vos fichiers, sinon tout fichier aléatoire sera inclus dans le fichier PDF. Si vos fichiers ont tous des extensions spécifiques (.c et .h par exemple), vous devez remplacer le find dans le script par quelque chose comme ceci

    find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' | 
    
  • Jouez avec les options listings , vous pouvez modifier ce paramètre pour qu'il soit exactement comme vous le souhaitez.
47
terdon

Je sais que je suis trop tard, mais quelqu'un qui cherche une solution peut trouver cela utile.

Sur la base de la réponse de @ terdon, j'ai créé un script BASH qui fait le travail: https://github.com/eljuanchosf/source-code-to-pdf

2
eljuanchosf

(de StackOverflow )

for i in *.src; do echo "$i"; echo "---"; cat "$i"; echo ; done > result.txt

Cela donnera un résultat.txt contenant:

  • Nom de fichier
  • séparateur (---)
  • Contenu du fichier .src
  • Répéter à partir du haut jusqu'à ce que tous les fichiers * .src soient terminés

Si votre code source a une extension différente, modifiez-le si nécessaire. Vous pouvez également modifier le bit d'écho pour ajouter les informations nécessaires (par exemple, echo "nomfichier $ 1" ou modifier le séparateur, ou ajouter un séparateur de fin de fichier).

le lien a d'autres méthodes, alors utilisez la méthode que vous préférez. Je trouve que celui-ci est le plus flexible, même s'il comporte une légère courbe d'apprentissage.

Le code fonctionnera parfaitement à partir d'un terminal bash (juste testé sur un VirtualBox Ubuntu)

Si vous ne vous souciez pas du nom de fichier et du contenu des fichiers fusionnés:

cat *.src > result.txt

fonctionnera parfaitement bien.

Une autre méthode suggérée était:

grep "" *.src > result.txt

Ce qui préfixera chaque ligne du nom de fichier, ce qui peut être bon pour certaines personnes, personnellement, je le trouve trop d’informations, d’où ma première suggestion: la boucle for ci-dessus.

Nous remercions les membres du forum StackOverflow.

EDIT: Je viens de me rendre compte que vous recherchiez spécifiquement HTML ou PDF, comme solution finale. Certaines solutions que j’ai déjà vues sont d’imprimer le fichier texte en PostScript, puis de convertir le format postscript en PDF. Un code que j'ai vu:

groff -Tps result.txt > res.ps

puis

ps2pdf res.ps res.pdf 

(Vous devez avoir ghostscript)

J'espère que cela t'aides.

2
Darius