检测 PDF 中符号的最终位置

检测 PDF 中符号的最终位置

我们使用 LaTeX 渲染 PDF,其中包含一个表格,该表格将由人工使用笔填写,然后输入到 OpenCV 应用程序进行识别。该表格由带有小方块(\fbox符号)的问题组成,人们填写这些问题以回答是或否。

问题是,当我们能为识别算法提供一些提示,说明\fboxes 的位置时,识别算法的效果会更好。因此,我们将它们排列成一个图案,与边框和边框之间保持一定的距离。但是,如果我们想要创建更复杂的布局,我们需要先渲染文档,然后查看 PDF 找出边距、分隔线等。

我们希望尽可能地自动化这个过程,所以一般的问题是:在 LaTeX 中“标记”某些符号的最佳方法是什么,以便我以后可以以某种方式恢复它们在呈现的 PDF 中的位置(我猜可能是使用第二个工具来查看 PDF 内部)?

答案1

使用

\fbox{%
\pdfsavepos\write-1{hello is at \the\pdflastxpos,\the\pdflastypos}%
hello%
}

日志文件将以缩放点的形式显示坐标

上述操作会在日志文件中产生如下一行:

hello is at 10005380,43282099

答案2

以下是通过 TikZ 可能的解决方案:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\newcommand\mybox{%
  \begin{tikzpicture}[remember picture]
    \draw (0,0) rectangle (.6em,.6em);
    \path let \p1=($(.3em,.3em) - (current page.south west)$)
    in \pgfextra{
      \pgfmathsetmacro\xpos{\x1/1cm}
      \pgfmathsetmacro\ypos{\y1/1cm}
      \typeout{checkboxpos:(\xpos cm,\ypos cm)}
    };
  \end{tikzpicture}%
}
\begin{document}

This is a test \mybox{}.

\begin{itemize}
\item[\mybox{}] First item.
  \begin{itemize}
  \item[\mybox{}] First subitem.
  \item[\mybox{}] Second subitem.
  \item[\mybox{}] Third subitem.
  \end{itemize}
\item[\mybox{}] Second item.
\item[\mybox{}] Third item.
\end{itemize}

\end{document}

经过两次编译后,你得到了这个日志:

复选框位置:(7.49284厘米,23.29828厘米)
复选框位置:(5.30951厘米,22.52507厘米)
复选框位置:(6.08272厘米,21.82214厘米)
复选框位置:(6.08272厘米,21.25981厘米)
复选框位置:(6.08272厘米,20.69748厘米)
复选框位置:(5.30951厘米,19.99455厘米)
复选框位置:(5.30951厘米,19.29164厘米)

答案3

此任务的重点是使用 pdfTeX 基元\pdfsavepos\pdflastxpos\pdflastypos。您可以创建一个宏,以以下形式\saveposition将实际位置保存到文件中:\jobname.pos

1: 67.65254mm, 267.37009mm
2: 101.77405mm, 267.37009mm
3: 67.65254mm, 261.73753mm
4: 101.77405mm, 261.73753mm

复选框的数字后面是 x 和 y 坐标。坐标系的 (0,0) 是纸张的左下角。您不需要两次 TeX 处理。此文件在第一次 TeX 运行后立即创建。

宏的实现\saveposition可以如下:

\newcount\posnum
\newwrite\posout

\immediate\openout\posout=\jobname.pos

\def\saveposition{\global\advance\posnum by1 \pdfsavepos
   \write\posout\expandafter{\the\posnum: \tomm\pdflastxpos, \tomm\pdflastypos}}

\def\tomm#1{\expandafter\ignorept\the\dimexpr.35146\dimexpr#1sp\relax\relax mm}
{\lccode`\?=`\p \lccode`\!=`\t  \lowercase{\gdef\ignorept#1?!{#1}}}

sp从到mm单位的转换是通过\tomm使用 eTeX 原语的宏完成的\dimexpr

现在测试一下。你需要把 放到\saveposition你的\fbox宏里。因为我不使用 LaTeX,所以我必须创建整个\fbox

\def\fbox{\leavevmode \saveposition
  \lower3pt \hbox{\vrule \vbox{\hrule width1cm \kern.5cm \hrule}\vrule}%
}

aghd sajhas hds ddjds \fbox\ dhjdka ak das \fbox

aghd sajhas hds ddjds \fbox\ dhjdka ak das \fbox

\end

请注意,您不需要使用任何特殊包(如tikz另一个答案中提到的)。

相关内容