包含来自基于表的数据库(如 excel)中特殊列的数据的 pdf + 图片

包含来自基于表的数据库(如 excel)中特殊列的数据的 pdf + 图片

我对 tex 还很陌生,但现在我必须:

  • 编译多个具有相同布局的 pdf(如果物理上分开在不同的文件中或只是作为一个文件中的页面则不那么重要)
  • 来自基于表的数据库的 1 列数据(目前 Excel 表包含以下三列:英语 + 德语,包含定义 + 图片)(数据由其他人填写并且每隔几个月更改一次)
  • 与图片相关(文中解释的内容,因此两列在第三列中有相同的图片)

通过搜索这里的问题,我发现了几种使用.csv 文件、photon 和 luatex 的解决方案(例如:将电子表格中的数据导入到 LaTeX 中,并为每行创建多个 pdf 文件 ) - 这些都是我从未听说过的东西 ;) 但我愿意学习。我会根据需要努力解决这些问题。问题是,我不知道从哪里开始。此外,我感觉图片会成为一个问题,因为图片不包含在 excel 单元格中,因此它们不会以任何方式被读取。所以可能我首先必须使用完全不同的工具来处理表格。然后无论如何都会有完全不同的方法。

我的问题是:

  1. 应该使用哪个程序来生成表格(其他人会做这件事,所以对他们来说不应该太复杂或昂贵,如果可能的话,使用像 excel 这样简单而常见的程序就更好了)
  2. 然后当然是如何开始将它带入乳胶 - 你不需要再次给我一个已经给出的答案,我愿意阅读这里已经存在的问题和答案,但是有太多了,而且由于我对这一切的了解有限,如果能得到提示,尝试给出的哪个答案就太好了。
  3. 并且仍然可以更改.tex 文件中最终 pdf 的布局,但我想这适用于每个解决方案。

下面是一个草图,展示了其中一个 PDF 最终的样子:卡1 示例表:表格

我希望我能把我的问题说清楚。非常感谢你的帮助!

答案1

找到了一个使用 datatool 包的解决方案。它还不完美,但您可能有一些改进的想法?

我把所有图片放在一个文件夹中,然后使用

ls /b *.jpeg >pix.csv 

生成所有图片的 .csv 文件。(在 Mac 上操作)

然后我将其和我想要使用的列(在保存为 .csv 之前)加载到我的 .tex 中并合并它们。

最后,我对每一行运行 tikzpicture 来生成单张卡片。

\documentclass{standalone}

\usepackage{graphicx}
\usepackage{tikz}
\usepackage{datatool}

\DTLloaddb[
  noheader,
  keys={name}
  ]{pix}{pix.csv}

 \DTLloaddb[
  noheader,
  keys={title}
  ]{text}{text.csv}

\begin{document}

\newcount\rowIdx

\dtlforcolumn{\secondC}{text}{title}%\dtlforcolumn{?cs?}{?db?}{?key?}{?body?}
{
  % iterate through each entry in the `title' column of the text database
  \advance\rowIdx by 1\relax
  % get corresponding row of pix database
  \dtlgetrow{pix}{\rowIdx}%
  % append to current row (this new column is assigned the key `title')
  \dtlappendentrytocurrentrow{title}{\secondC}%\dtlappendentrytocurrentrow{?key?}{?value?}
  % update first database
  \dtlrecombine
}


\DTLforeach*%\DTLforeach*[?condition?]{?db name?}{?assign list?}{?text?}
    [\not\DTLiseq{\Name}{main.tex}]  
    {pix}{\Name=name,\Title=title}{
  \newpage
    \begin{tikzpicture}[remember picture,overlay]

        \node[anchor=south,inner sep=0pt] (icon) at (7.4,-8.5){\includegraphics[height=5cm]{\Name}}; %inserting the picture according to name

        \node[inner sep=0,text width=\paperwidth,align=flush center] (text) at (7.4,-9){\Title};

    \end{tikzpicture}  
 }

\end{document}

有一些错误,在 \end{tikzpicture} 行中缺少 \endgroup 和 },最后它说 } 太多了,但我不明白为什么?如果我在 .tex 中写入 \endgroup,它会说太多了。所以它就是这样工作的,因为缺失的部分会自动添加,但我总是必须按 Enter 才能接受更改。也许你们中的一个可以在这里提供帮助。

多谢!

答案2

上面的答案只适用于一种语言,但现在我的解决方案适用于两种语言(带字幕),就像问题中问的那样,还有一个级别选项。制作表格的人必须在最后一列写上图片的文件名,而不是放图片,然后它就可以正常工作了。

\documentclass[english]{article}

\usepackage[paperwidth=11cm, paperheight=10.4cm]{geometry}

\usepackage{graphicx}
\usepackage{tikz}
\graphicspath{{../pix/}}
\usepackage{datatool}
\usepackage{etoolbox}

\newbool{GER}
%\booltrue{GER} % if german version activate
\newcommand{\Levelgew}{1} % say which level (if you say level 2 it will print level1+2)

\DTLsetseparator{;}
\DTLloaddb[keys={level,eng,engunderline,ger,gerunderline,name}]{cards}{_scrumflowcards.csv} %\DTLloadrawdb[?options?]{?db name?}{?filename?} 



\begin{document}
\ifbool{GER}
{
    \DTLforeach*%\DTLforeach*[?condition?]{?db name?}{?assign list?}{?text?}
        [\not\DTLisgt{\Level}{\Levelgew}]
        {cards}{\Level=level,\Title=ger,\Underline=gerunderline,\Name=name}
        {
            \clearpage%start a new page for each row
            \thispagestyle{empty}%get rid of the pagenumbers

            \begin{tikzpicture}[remember picture,overlay]

                \node[yshift=-2.2cm,anchor=south] (icon) at (current page.center) {\includegraphics[height=6cm]{\Name}};

                \node[yshift=-3.5cm,text width=8cm,align=flush center] (text) at (current page.center){\huge\bfseries\sffamily\Title\\[15pt]
            \LARGE \Underline};

            \end{tikzpicture}
        }

}{
    \DTLforeach*%\DTLforeach*[?condition?]{?db name?}{?assign list?}{?text?}
        [\not\DTLisgt{\Level}{\Levelgew}]
        {cards}{\Level=level,\Title=eng,\Underline=engunderline,\Name=name}
        {
            \clearpage%start a new page for each row
            \thispagestyle{empty}%get rid of the pagenumbers

            \begin{tikzpicture}[remember picture,overlay]

                \node[yshift=-2.2cm,anchor=south] (icon) at (current page.center) {\includegraphics[height=6cm]{\Name}};

                \node[yshift=-3.5cm,text width=8cm,align=flush center] (text) at (current page.center){\huge\bfseries\sffamily\Title\\[15pt]
            \LARGE \Underline};

            \end{tikzpicture}
        }
}
\end{document}

最后我使用 pgfpackage(\pgfpagesphysicalpageoptions 和 \pgfpageslogicalpageoptions)在一张 A4 纸/片材上打印多张卡片/页面。

相关内容