更新

更新

后续问题从 PDF 中提取图像以用于 LaTeX 文档?

演示文稿中有一个徽标beamer需要重复使用。我遵循赫伯特的回答将徽标包含到我的 PDF 中并保留矢量图形。它运行完美;唯一的问题是,如果我选择新 PDF 中的文本,原始幻灯片的其余部分就会变得可见。有没有办法避免这种情况?

这是一个最小的例子...考虑以下内容,生成一个名为的2页PDF lipsum_image.pdf

在此处输入图片描述

\documentclass{article}
\usepackage{graphicx,lipsum}

\begin{document}
\centering
\includegraphics[width=.8\linewidth]{example-image}

\lipsum[1-3]
\end{document}

现在在另一个文档中包含以下viewportclipped)版本:lipsum_image.pdf

在此处输入图片描述

\documentclass{article}
\usepackage{graphicx}
\begin{document}
\fbox{\includegraphics[page=1,viewport=190 500 400 620,clip]{lipsum_image}}

some text
\end{document}

答案1

这绝不是一个解决方案。这只是一个真的这是一个肮脏的解决方法,但如果你着急的话,它可能就足够了。

\documentclass{article}
\usepackage{graphicx}

\usepackage{accsupp}
\newcommand\squelchgraphics[2][]{%
  \BeginAccSupp{method=plain,ActualText={}}\includegraphics[#1]{#2}\EndAccSupp{}}

\begin{document}
\fbox{\squelchgraphics[page=1,viewport=190 500 400 620,clip]{lipsum_image}}

some text
\end{document}

我们正在使用一个实验性的可访问性支持包来用空白的替代文本来代替选择。

evince并且zathura无法像我们希望的那样选择视口外的文本。firefox但是chrome仍然可以选择一些空白框。我无法保证其他文档查看器也能做到这一点。

灵感来自这个答案

答案2

该命令从中\includegraphics[page=n,viewport=x y X Y,clip]{filename}提取页面并将其剪辑到具有角和的矩形视口中。坐标相对于边界框的原点。nfilename.pdf(x,y)(X,Y)

由于剪辑是任意的,因此仅通过删除不可能。但是,两种技术的组合可以很好地工作(即删除所有不与视口相交的内容,并从视觉上剪掉其余部分)。

然而,如此复杂的手术在实用性和美观性上几乎没有什么好处,除非你的特殊用例。不幸的是,实现它似乎并不容易。至少对我来说是这样。

让我们想象一下,你可以从输入文件中删除所有文本:这显然解决了你的问题。虽然我确实意识到复杂图形(例如图形标签)的文本会消失,但你写了一篇标识,所以我希望这就足够了。无论如何,采用以下技巧来节省一些文本并不困难。

该计划非常简单:

  • 解压 pdf
  • 删除所有文字
  • 压缩 pdf(可选,只是礼貌问题)

压缩(解压缩)PDF

有很多工具可以完成这项工作。我正在使用pdftk,但你可以选择任何你想要的工具。我们只需要解开压缩混淆的原始 PDF 代码。必要的控制台命令的语法非常清晰:

pdftk input.pdf output output.pdf uncompress
pdftk input.pdf output output.pdf compress

损坏 PDF

这是最棘手的部分。如果你读了 §5.3文本对象来自PDF参考文档您将看到文本对象由一对唯一运算符分隔,BT并且ET(例如开始/结束文本) 并且不能嵌套。或多或少,我们只是想消除形状如下的每一个出现的三条中心线

... mysterious pdf code ...
BT
... text operators code ...
ET
... mysterious pdf code ...

怎么做呢?正则表达式,当然. 关于空格的作用,有一些问题(§3.1词汇惯例),但我只是想绕过它们。以下是黑魔法:

s/^BT.*?^ET//smg

这将用零s替换所有匹配项^BT.*?^ET,同时

  • s:允许.匹配\n
  • m:允许匹配跨越多行
  • g:执行全局搜索(即查找所有匹配项)

该字符串^BT.*?^ET可以分解为

  • ^BT: 匹配打开文本对象的运算符
    • ^:匹配行的开头
    • BT:匹配字符串BT
  • .*?:匹配最短的字符串,包括换行符
    • .:匹配任何内容(包括\n感谢s标志)
    • *:重复上一次匹配零次或多次
    • ?:对最后一次匹配偷懒,而不是贪婪(即选择最短的而不是最长的)
  • ^ET: 匹配关闭文本对象的运算符
    • ^:匹配行的开头
    • ET:匹配字符串ET

这里的关键是中心模式的惰性:它保证我们匹配正确的结束运算符。

我将使用 Perl 来应用正则表达式,但同样:选择您最喜欢的工具来完成这项工作。

使用 LaTeX 进行封装

现在我们将所有内容放入一个漂亮的宏中。正如你现在可能已经猜到的那样,你将必须使用以下宏对文件进行 TeX 处理:--shell-escape选项将文件 TeX 化,至少在第一次编译时,允许执行shell命令。

开始了:

\documentclass{article}
\usepackage{graphicx}

\newcommand\includesquelchedpdf[2][]
  {\IfFileExists{./#2_squelched.pdf}
    {\relax}
    {\IfFileExists{./#2.pdf}
      {\immediate\write18{ pdftk #2.pdf output - uncompress
                         | perl -0777 -pe 's/^BT.*?^ET//smg'
                         | pdftk - output #2_squelched.pdf compress }}
      {\errmessage{Error: you tried to squelch a nonexistent PDF file}}}%
  \includegraphics[#1]{#2_squelched}}

\begin{document}
\fbox{\includesquelchedpdf[page=1,viewport=190 500 400 620,clip]{lipsum_image}}

some text
\end{document}

我使用了一些管道来使 shell 命令更精简。我还添加了一些控制结构,以避免阻塞不存在的文件或重新处理已经阻塞的文件。

我认为可以合理地确认输出在每个文档查看器中的行为都将按预期进行,因为根本没有更多文本对象可供选择。

这适用于 MWE。如果您的实际用例包含一些小段文本,我们可以大概使用更多的黑魔法来解决这个问题。

蛮好玩的!


更新

@cfr 在评论中向我指出pdktk不再支持该工具,因此我提出了一种可能更可取的替代工具。首先,代码:

\documentclass{article}
\usepackage{graphicx}

\newcommand\includesquelchedpdf[2][]
  {\IfFileExists{./#2_squelched.pdf}
    {\relax}
    {\IfFileExists{./#2.pdf}
      {\immediate\write18{ qpdf -qdf #2.pdf -
                         | perl -0777 -pe 's/^BT.*?^ET//smg'
                         | fix-qdf > #2_squelched.pdf }}
      {\errmessage{Error: you tried to squelch a nonexistent PDF file}}}%
  \includegraphics[#1]{#2_squelched}}

\begin{document}
\setlength\fboxsep{0pt}
\fbox{\includesquelchedpdf[page=1,viewport=190 500 400 620,clip]{lipsum_image}}

some text
\end{document}

我正在使用qpdffix-qdf是捆绑包的一部分)。这提供了一些优势:

  • qpdf非常活跃(最新版本是 5.1.3,发布于 2015 年 5 月 24 日),开源并且没有赞成付费版本;
  • 它的特点是量子引力模式,设计确切地解开 PDF 文件并将其作为文本进行操作(这就是我们正在做的事情);
  • 是否有工具fix-qdf来修复该过程中可能造成的损害;
  • 它保证我们的正则表达式始终有效(参见其第 4 条)手动的)。

总而言之,这可能是更好的选择。我将保留这两个,因为我对它们的了解太肤浅,无法在功能方面进行真正公平的比较。

答案3

  • 当徽标作为矢量图存储在 pdf 中(OP 中的情况)时,您可以使用 Inkscape 来完成这项工作:
    1. 将 pdf 导入 inkscape。
    2. 选择出现的对象,右键单击并根据需要多次选择“取消组合”,以将所需的位与所有其他位分离。
    3. 删除除所需图形之外的所有内容。
    4. 进入“文档属性”并点击“根据内容调整页面大小”以使画布尺寸适合您的艺术作品的大小。
    5. 将其保存为 PDF,以便\includegraphics在您的文档中使用。

笔记:你可以使用以下方法裁剪 PDF克罗普或其他工具,但这只会修改 pdf 上可见的“视口”、其元数据的一部分,并且实际上不会删除任何无关的内容。

  • 当徽标以光栅图像形式存储在矢量 PDF(而非扫描页面)中时,您可以使用它pdfimages自动从给定页面中提取所有图像。质量受原始分辨率限制,但不会更差。

  • 当整个 pdf 只不过是整页的扫描图像时,您可以使用pdfimagespdftopng(从xpdf包中)提取整个页面,然后使用您最喜欢的图像编辑程序进行裁剪。

请务必遵守版权、获得许可等。

相关内容