Come posso convertire automaticamente tutti i file di codice sorgente in una cartella (in modo ricorsivo) in un singolo PDF con l'evidenziazione della syntax?

Vorrei convertire il codice sorgente di alcuni progetti in un file printingbile per salvare su un USB e printingre facilmente in seguito. Come lo posso fare?

Modifica

Innanzitutto voglio chiarire che voglio solo printingre i file e le directory non nascosti (quindi nessun contenuto di .git ad esempio).

Per get un elenco di tutti i file non nascosti in directory non nascoste nella directory corrente è ansible eseguire la find . -type f ! -regex ".*/\..*" ! -name ".*" find . -type f ! -regex ".*/\..*" ! -name ".*" find . -type f ! -regex ".*/\..*" ! -name ".*" come visto come risposta in questo thread .

Come suggerito nello stesso thread ho provato a creare un file pdf dei file utilizzando il command find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdf find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdf find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdf ma purtroppo il file pdf risultante è un pasticcio completo .

Sono stato incuriosito dalla tua domanda e sono stato portto via. Questa soluzione genererà un bel file PDF con un indice cliccabile e un codice evidenziato in colore. Troverà tutti i file della directory corrente e delle sottodirectory e crea una sezione nel file PDF per ciascuno di essi (vedere le note sotto per come rendere il command di ricerca più specifico).

Richiede che siano installati i seguenti (le istruzioni di installazione sono per i sisthemes basati su Debian, ma questi devono essere disponibili nei repository della distribuzione):

  • pdflatex , color e listings

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

    Questo dovrebbe anche installare un sistema LaTeX di base se non ne hai installato.

Una volta installati, utilizzare questo script per creare un documento LaTeX con il codice sorgente. Il trucco utilizza gli listings (parte del texlive-latex-recommended ) e il color (installato da latex-xcolor ) pacchetti LaTeX. Il \usepackage[..]{hyperref} è ciò che rende gli elenchi nei collegamenti sumri contenuti nel riepilogo.

 #!/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 echo "\newpage" >> $tex_file ## start each section on a new page echo "\section{$i}" >> $tex_file ## Create a section for each file ## 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 

Eseguire lo script nella directory che contiene i file di origine

 bash src2pdf 

Questo creerà un file denominato all.pdf nella directory corrente. Ho provato questo con un paio di file sorgenti casuali che ho trovato sul mio sistema (in particolare, due file dalla sorgente di vlc-2.0.0 ) e questo è uno screenshot delle prime due pagine del PDF risultante:

immettere qui la descrizione dell'immagine


Un paio di commenti:

  • Lo script non funziona se i nomi dei file di codice sorgente contengono spazi. Dal momento che stiamo parlando di codice sorgente, presumo che non lo fanno.
  • Ho aggiunto ! -name "*~" ! -name "*~" per evitare i file di backup.
  • Vi consiglio di utilizzare un command di ricerca più specifico per trovare i tuoi file, altrimenti qualsiasi file random verrà incluso nel PDF. Se i tuoi file dispongono di estensioni specifiche ( .c e .h per esempio), dovresti sostituire la find nello script con qualcosa di simile

     find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' | 
  • Gioca in giro con le opzioni di inserimento, puoi modificare questo per essere esattamente come lo desideri.

(da StackOverflow )

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

Ciò provocherà un result.txt contenente:

  • Nome del file
  • separatore (—)
  • Contenuto del file .src
  • Ripeti dalla parte superiore finché non vengono completati tutti i file * .src

Se il codice sorgente ha un'estensione diversa, è sufficiente modificare se necessario. È anche ansible modificare il bit echo per aggiungere le informazioni necessarie (forse echo "nome file $ 1" o modificare il separatore o aggiungere un separatore di fine file).

il collegamento ha altri methods, quindi utilizza qualunque metodo ti piace di più. Trovo che questo sia più flessibile, anche se presenta una leggera curva di apprendimento.

Il codice funziona perfettamente da un terminal bash (solo testato su un VirtualBox Ubuntu)

Se non ti interessa il nome del file e ti interessa solo il contenuto dei file fussi insieme:

 cat *.src > result.txt 

functionrà perfettamente.

Un altro metodo suggerito è stato:

 grep "" *.src > result.txt 

Che prefigge each singola row con il nome del file, che può essere utile per alcune persone, personalmente trovo troppo informazioni, quindi perché il mio primo suggerimento è il loop sopra.

Credito a quelli del forum di StackOverflow.

EDIT: Ho appena capito che si tratta di un HTML o di un file PDF come risultato finale, alcune soluzioni che ho visto sono printingre il file di text in PostScript e poi convertire il postscript in PDF. Alcuni codici che ho visto:

 groff -Tps result.txt > res.ps 

poi

 ps2pdf res.ps res.pdf 

(Richiede di avere ghostscript)

Spero che questo ti aiuti.

So che sono troppo tardi, ma qualcuno che cerca una soluzione potrebbe trovare utile.

Sulla base della risposta di @ terdon, ho creato uno script BASH che fa il lavoro: https://github.com/eljuanchosf/source-code-to-pdf