pdf 图表/图形有奇怪的瑕疵

pdf 图表/图形有奇怪的瑕疵

所以我以前用 svg 文件来画图,但是编译太多图会花太长时间,所以我改用 pdf 图,它在这方面效果更好。我做到了不是将 svg 文件转换为 pdf,我将 matplotlib 中的图直接保存为 pdf 文件。

但是现在我在我的一些地块中发现了一些奇怪的现象,例如左下角的小盒子:

原来的(在 Adob​​e 中打开): 原著

编译图截图: 编译图截图

由于某种原因,编译后的图形左下角有一个小框。

这是相应的 tex 代码:

\begin{figure}[H]
    \centering
    \includegraphics[width=\textwidth]{figures/Costs_Validation_linearreg_neg.pdf}
    \caption{Caption}
    \label{fig:enter-label}
\end{figure}

如果有人知道这是怎么回事,请告诉我!

pdf 文件的 Dropbox 链接)

答案1

向反对者澄清一下:

  • 在这种情况下,解决方案(答案)不能是一些 Latex 代码
  • 必须进行根本原因分析
  • 本文阐述了导致少数根本原因的原因,这些原因可能仅在 TO 的环境中有效。

如果你可以做得更好,请这样做;-)


让我们尝试另一种总结,尽管从评论中 TO 可能得出的结论可能是正确的,也可能是错误的。

请检查最后一项,“建议的测试“, 以下。


试验

> 编译
  • 我:Texmaker、pdflatex、MikTex
  • 致:Overleaf,未知的 latex 编译器
> 看到了文物吗?
  • 我:无(Acrobat Reader、Firefox)
  • TO:使用 FireFox,视情况而定(例如此评论

(因此,FF 本身不可能是问题,因为它既可以显示也可以不显示工件,这取决于它的使用位置。其他未提及的差异一定是根本原因。)

> 从 Dropbox 打开 pdf 或 svg(见上文)
  • 我:没有看到任何文物

检查 svg 文件

inkscape许多Notepad++ (Editor)SVG 路径都是显而易见的,正如它应该的那样:

  • 数据点、线性拟合、三角区域等。
  • 框架和网格
  • 字符(字母、数字、标点符号......)

通过对一些(而非全部)SV路径的探索,我们发现有一条路径十分突出:

<path id="ArialMT-2e" d="M 581 0 
L 581 641 
L 1222 641 
L 1222 0 
L 581 0 
z
" transform="scale(0.015625)"/>
...

渲染成一个漂亮的正方形,例如这个在线 svg-path 编辑器用 inkscape 更难捕捉:

svg 路径

墨景

这个人看起来和那个麻烦制造者很相似,TO 在这里报道过几次。

这会不会是麻烦制造者?

Notepad++可能是。从上面的定义id="ArialMT-2e"被引用多次可以看出。

将其转变为波动的(=取决于情况,由 TO 报告)工件所需要做的就是对 SVG 元素进行某种非预期的解释,例如:

  • 使用的 LaTeX 编译器,包括其编译选项
  • 错误处理 SVG-XML 结构之一
  • 浏览器特性,包括使用/未使用的附加组件
  • ETC。

记事本++


建议的测试

为了定位变化(或稳健性术语中的噪声),我们必须改变噪声源,在本例中是 SVG 文件。

因此,TO 可以创建多个专用的 SVG 文件,并重复他/她的编译过程,并检查是否存在此工件。

有很多方法可以做到这一点。最实用的可能是推进 50:50 策略,正如我在 Latex 上下文中,并且快速/指数地收敛:

  • 按照 SVG 文件的 XML 结构将其粗略地分成两半(这更多的是一种想法,而不是一种精确的测量):
  • 一半包含这些路径,另一半包含其他路径,同时保留结构元数据和文件完整性所需的其他部分(即仍然渲染图形)
  • 检查哪一个仍然创建工件
  • 丢弃非工件的一半
  • 重复此操作,直到找到造成问题的元素或路径

当双方似乎都无法再创造出任何成果时,退一步考虑另一种分割方式,直到你确实达到了目的。

顺便说一句:这很容易做到,而且用语言来描述的话很长......

这应该很快就会产生一个或几个 XML 部分,值得进一步考虑。此时,您甚至可以尝试生成 SVG 变体/内容,您可以根据需要打开或关闭工件:一种根本原因的验证。

不同的方法可能是故意丢弃引用的全部、一半或大部分部分id="ArialMT-2e"

结束

附言

捷径或预测试可能是将所述正方形的路径更改为不同的形状,例如通过添加独特的第 5 个点。编译后,TO 应该会看到正方形伪影被这个新形状替换,如果这是问题制造者的话。

然后,按照上面描述的方式进一步定位。

答案2

这里有两个带有类articlestandalone来自您的 dropbox 的 pdf 的编译:没有显示框,使用 进行编译pdflatex

再次强调,你应该发布可编译的代码,而不仅仅是片段:

  • 现在看来,这个盒子可能是你序言等中的一个工艺品。
  • 或者从你的 Latex 安装中
  • ETC。

文章和独立

截图取自Acrobat Reader 2023;与 相同FireFox

文章

\documentclass[10pt,a4paper]{article}
\usepackage{graphicx}

\begin{document}
\begin{figure}
    \centering
    \includegraphics[width=\textwidth]{Costs_Validation_linearreg_neg.pdf}
    \caption{Caption}
    \label{fig:enter-label}
\end{figure}
\end{document}

独立

由于某种原因,需要 tikz 来编译......

\documentclass[10pt,border=3mm,tikz]{standalone}
\usepackage{graphicx}

\begin{document}
\begin{figure}
    \centering
    \includegraphics%[width=\textwidth]
    {Costs_Validation_linearreg_neg.pdf}
    \caption{Caption}
    \label{fig:enter-label}
\end{figure}
\end{document}

答案3

这不一定是答案,而是基于 @MS-SPO 的评论和回答对可能发生的情况/可以做什么的有根据的猜测/动机/建议。调查原始 matplotlib pdf 输出,例如在 hexcode 中00012600 可以000126C4找到:

obj.<< /Type /FontDescriptor /FontName /CFEKEO+ArialMT
/Flags 32./FontBBox [ -665 -325 2000 1040 ] /Ascent 906
/Descent -212 /CapHeight 716 ./XHeight 519 /ItalicAngle 0
/StemV 0 /MaxWidth 1015 >>. endobj.14

预计它应该在那里(否则无法从 pdf 中复制文本)。但是,有趣的部分是FontBBox。这表示文本的(通常不可见的)边界框。有趣的事实是,FontBBox文档中定义了多个具有完全相同参数的边界框。如果在从到 的[ -665 -325 2000 1040 ]转换过程中将字体作为字体而不是路径包含,我不确定它们是如何处理的。如果进行粗略计算并调整绘图的比例( ),数据起点周围有时可见的矩形可能是由于将 svg 转换为路径而导致的误解。 为什么只有在以某种方式编译、使用某个查看器等时才会发生这种情况,除非可以分析所有相关组件的相关源代码(由于 Adob​​e 产品的封闭性,这是不可能的),否则无法澄清。根据我的经验,我做出有根据的猜测:对于单页文档,LaTeX 编译与对于多页文档(由于链接、引用等)的编译不同。我认为,与图包含引入的未定义行为相结合,这会创建部分无效的 pdf,这些 pdf 在二进制级别上是不相同的。一些 pdf 查看器以不同的方式处理错误(忽略无效元素),但如果错误超过一定数量,pdf 查看器可能会不堪重负,因此错误处理将中断,并且每个无效垃圾都将被呈现。pdfsvgFontBBox1e6FontBBox
FontBBox

我以前遇到过类似但又截然不同的问题:我通过 包含了包含元数据的照片\includegraphics。我用几个 pdf 查看器(包括常用的浏览器)验证了生成的 pdf;一切都显示正确。为了确保万无一失,我甚至从图像中删除了(至少看起来是这样)旋转元数据信息,以确保出现伪影的可能性较小。然而,在发布者编译、处理和发布文档后,在某些版本的 Firefox 中,图像将被旋转 90° 呈现(因为有时 Firefox 使用图像元数据提供的旋转,而不是编译期间由 LaTeX 设置的旋转)。关键信息:无论人们多么努力,无论人们多么小心,pdf 中都可能出现最奇怪的错误。有时,在将图片包含到 pdf 文档之前手动对其进行后处理是降低风险的唯一方法,但并不能完全避免此类伪影。

对于这个旋转错误,我的务实建议是(如果可能):

  1. 使用 Inkscape 打开原始 matplotlib 输出 pdf
  2. 尝试选择框有时会出现的区域周围的元素(这些框可能是不可见/隐藏的,但通常可以选择并删除它们)。如果您删除所选内容并且重要信息没有消失,则可能是您发现并消除了可能导致问题的幽灵元素。
  3. 将图像保存为 pdf。

如果您可以从数据分析工具中导出原始数据并愿意使用其他绘图工具:一种解决方案可能是使用pgfplots直接在 LaTeX 中创建绘图,根据我的经验,这在字体和渲染工件方面更可靠(并且使整个文档在视觉上更具凝聚力,因为它使用了所有的 LaTeX 设置,如正确的间距等)。

相关内容