如何自动将文件夹中的所有源代码文件(递归)转换为具有语法高亮显示的单个 PDF?

如何自动将文件夹中的所有源代码文件(递归)转换为具有语法高亮显示的单个 PDF?

我想将几个项目的源代码转换为一个可打印文件,保存在 USB 上,以后可以轻松打印出来。我该怎么做?

编辑

首先我想澄清一下,我只想打印非隐藏的文件和目录(因此没有.git例如的内容)。

为了得到当前目录中非隐藏目录中所有非隐藏文件的列表您可以find . -type f ! -regex ".*/\..*" ! -name ".*"按照以下答案所示运行命令此主题

正如在同一个线程中所建议的,我尝试使用命令制作文件的 pdf 文件find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdf,但不幸的是生成的 pdf 文件一团糟

答案1

我对你的问题很感兴趣,有点入迷了。此解决方案将生成一个漂亮的 PDF 文件,其中包含可点击的索引和颜色突出显示的代码。它将查找当前目录和子目录中的所有文件,并在 PDF 文件中为每个文件创建一个部分(请参阅下面的说明,了解如何使 find 命令更具体)。

它要求您安装以下内容(安装说明适用于基于 Debian 的系统,但这些应该在您的发行版的存储库中可用):

  • pdflatexcolorlistings

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

如果您尚未安装,这还应该安装一个基本的 LaTeX 系统。

安装完成后,使用此脚本用源代码创建 LaTeX 文档。诀窍是使用listings(部分texlive-latex-recommended)和color(由 安装latex-xcolor)LaTeX 包。这\usepackage[..]{hyperref}使得目录中的列表成为可点击链接。

#!/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{$name}" >> $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    

在包含源文件的目录中运行脚本

bash src2pdf

这将all.pdf在当前目录中创建一个名为的文件。我尝试使用我在系统上找到的几个随机源文件(具体来说,来自 源的两个文件vlc-2.0.0)执行此操作,这是生成的 PDF 的前两页的屏幕截图:

在此处输入图片描述


一些评论:

  • 如果源代码文件名包含空格,则脚本将无法运行。由于我们讨论的是源代码,因此我假设文件名中不包含空格。

  • 我添加了! -name "*~"以避免备份文件。

  • 不过,我建议你使用更具体的find命令来查找文件,否则任何随机文件都将包含在 PDF 中。如果你的文件都有特定的扩展名(.c例如.h),你应该find用类似这样的命令替换脚本中的

      find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' | 
    
  • 尝试一下listings 选项,您可以对其进行调整,使它完全符合您的要求。

答案2

我知道我来得太晚了,但对于那些正在寻找解决方案的人来说,这很有用。

根据@terdon 的回答,我创建了一个可以完成这项工作的 BASH 脚本:https://github.com/eljuanchosf/source-code-to-pdf

答案3

(从堆栈溢出

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

这将导致 result.txt 包含以下内容:

  • 文件名
  • 分隔器 ( - -)
  • .src 文件的内容
  • 从顶部重复,直到完成所有 *.src 文件

如果您的源代码有不同的扩展名,只需根据需要进行更改即可。您还可以编辑 echo 位以添加必要的信息(可能是 echo "filename $1" 或更改分隔符,或添加文件结尾分隔符)。

链接中还有其他方法,因此请使用您最喜欢的方法。我发现这种方法最灵活,尽管它确实需要一点学习时间。

该代码可以从 bash 终端完美运行(刚刚在 VirtualBox Ubuntu 上测试过)

如果您不关心文件名而只关心合并在一起的文件的内容:

cat *.src > result.txt

将会完美运行。

建议的另一种方法是:

grep "" *.src > result.txt

它将在每一行前面加上文件名作为前缀,这对某些人来说可能会很有用,但我个人认为它包含太多信息,因此我的第一个建议是上面的 for 循环。

感谢 StackOverflow 论坛的各位朋友。

编辑:我刚刚意识到您最终想要的是 HTML 或 PDF,我见过的一些解决方案是将文本文件打印成 PostScript,然后将 PostScript 转换为 PDF。我见过的一些代码:

groff -Tps result.txt > res.ps

然后

ps2pdf res.ps res.pdf 

(需要您有 ghostscript)

希望这可以帮助。

相关内容