我有一份表格,我将其分配给人们以 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.pdf
,pg_0002.pdf
和pg_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.pdf
、Name1.pdf
和 的pdf Name2.pdf
。
Name.pdf
是虚拟运行:
Name1.pdf
对应于第一个数据行:
第二Name2.pdf
点:
显然,这个过程可以通过各种方式进行调整,你可以在脚本等中组合一些东西。它也可以变得更高效,尤其是我认为对于重命名而言。但最好的方法可能取决于细节,如果你最终使用类似这种工作流程的东西,希望这能给你一个起点。