将电子表格中的数据导入到 LaTeX 中,并为每行创建多个 pdf 文件

将电子表格中的数据导入到 LaTeX 中,并为每行创建多个 pdf 文件

我有一份表格,我将其分配给人们以 Google 表格的形式填写,并在电子表格(xlsx 或 ods 文件格式)中获取回复。我需要根据他们的回答提交一份报告,这意味着我必须为电子表格的每一行生成一个 pdf 文件。这是一个例子。想象一下这是 soreadsheet 的前三行:

Name Question1 Question2 Question3
Name1 Answer1.1 Answer2.1 Answer 3.1
Name2 Answer1.2 Answer2.2 Answer 3.2

我需要获取两个 pdf 文件的名称Name1.pdf,并且Name2.pdf第一个文件包含如下内容:

Name: Name1
Question1: Answer1.1
Question2: Answer2.1
Question3: Answer3.1

等等。我当时想,可以用 Python 编写一个脚本,读取文件的每一行,并将其作为pdflatex模板文件上的命令的输入,但我对如何真正开始做这件事没有太多的想法。

答案1

更详细一点...

如果我使用与您的电子表格类似的电子表格,那么我save as会选择字段分隔符,而不选择任何内容来包围文本。(这是肯定的,.csv但我认为其他软件也提供类似的功能。);calc

这将生成以下.csv文件,我将其另存为question.csv

Name;Question1; Question2; Question3
Name1;Answer1.1;Answer2.1;Answer 3.1
Name2;Answer1.2;Answer2.2;Answer 3.2

然后我跑

gawk 'BEGIN { RS=";"; ORS="\n" } { print }' question.csv > question.dat

生成question.dat

Name
Question1
 Question2
 Question3
Name1
Answer1.1
Answer2.1
Answer 3.1
Name2
Answer1.2
Answer2.2
Answer 3.2

我们并不特别想要一个带有标题的 PDF,但我认为有一个“虚拟”页面会很有用,只是为了确保所有内容都出现在正确的位置。但是,如果您愿意,可以轻松排除它。不过,整理一些行开头的杂散空格会很好:

sed -i 's/^  *//' question.dat

得到我question.dat

Name
Question1
Question2
Question3
Name1
Answer1.1
Answer2.1
Answer 3.1
Name2
Answer1.2
Answer2.2
Answer 3.2

现在,您可以在模板文件中使用数据.tex,并根据需要对其进行格式化。例如,我使用了环境,description因为我不知道答案可能有多长,所以tabular似乎存在潜在问题:

\documentclass{article}
\usepackage{textmerg}

\begin{document}

\Fields{\subjectname\questionone\questiontwo\questionthree}

\Merge{question.dat}{%

\begin{description}
    \item[Name:] \subjectname
    \item[Question1:] \questionone
    \item[Question2:] \questiontwo
    \item[Question3:] \questionthree
\end{description}

\cleardoublepage
}

\end{document}

这将生成一个 3 页的 pdf 文件。为了将页面分成单独的 pdf,我使用了pdftk以下步骤:

pdftk question.pdf burst

这给了我pg_0001.pdfpg_0002.pdfpg_0003.pdf。因此,剩下的问题是使用原始文件中的名称重命名它们。如果您的名称带有重音字符等,这可能会有问题。假设没有任何东西偏离您的系统接受的范围太远:

ls pg_000* > pdf.list
sed 's/\;.*$//' question.csv > name.list

如果您需要清理姓名列表,请立即执行。例如,您可能需要删除空格:

sed -i 's/ //g' name.list

然后创建一个命令文件mv。我这样做是因为如果你有大量数据,将所有名称存储为参数可能会超出 shell 的容量。这样,每个数据条目都会有自己的命令。

paste -d ' ' pdf.list name.list | sed -e 's/^/mv /' -e 's/$/.pdf/' > cmds.list

现在您可以使用例如运行命令sh cmds.list

这给了我三个名为Name.pdfName1.pdf和 的pdf Name2.pdf

Name.pdf是虚拟运行:

模拟运行

Name1.pdf对应于第一个数据行:

第一行数据

第二Name2.pdf点:

第二行数据

显然,这个过程可以通过各种方式进行调整,你可以在脚本等中组合一些东西。它也可以变得更高效,尤其是我认为对于重命名而言。但最好的方法可能取决于细节,如果你最终使用类似这种工作流程的东西,希望这能给你一个起点。

相关内容