将 PDF 转换为 EPS 时,如何防止 pdftops 栅格化字体和透明区域?

将 PDF 转换为 EPS 时,如何防止 pdftops 栅格化字体和透明区域?

编译以下代码

% Circle.tex
\documentclass[cmyk]{minimal}
\usepackage{pstricks}
\pagestyle{empty}

\topmargin=-72.27pt
\oddsidemargin=-72.27pt
\topskip=0pt
\parindent=0pt

\def\Constant{1}
\paperwidth=2\dimexpr\Constant cm\relax
\paperheight=2\dimexpr\Constant cm\relax

\special{papersize=\the\paperwidth,\the\paperheight}

\begin{document}
\pspicture(-\Constant,-\Constant)(\Constant,\Constant)
\rput(0,0){$E\not=mc^2$}
\pscircle*[linecolor=blue,opacity=0.5](0,0){1}
\endpspicture
\end{document}

rem batch.bat takes a file name without extension.
latex %1
dvips -D10000 -t unknown %1
gswin32c -dCompatibilityLevel=1.5 -r10000 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=%1.pdf %1.ps
pdftops -eps %1.pdf

将产生如下图表。

在此处输入图片描述

当我从以下主 TeX 输入文件中导入图表时,

% Main.tex
\documentclass[cmyk]{minimal}
\usepackage{graphicx}

\begin{document}
\includegraphics{Circle.eps}
\end{document}

并使用相同的批处理文件对其进行编译,得到如下结果。

在此处输入图片描述

问题

使用以下批次之一进行编译Circle.tex

rem MethodA.bat takes a file name without extension.
latex %1
dvips -D10000 -E %1 -o %1-temp.eps
epstool --copy --bbox %1-temp.eps %1.eps
gswin32c -dCompatibilityLevel=1.5 -dEPSCrop -r10000 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=%1.pdf %1.eps
rem MethodB.bat takes a file name without extension.
latex %1
dvips -D10000 %1 -o %1-temp.ps
ps2eps %1-temp.ps
epstool --copy --bbox %1-temp.eps %1.eps
gswin32c -dCompatibilityLevel=1.5 -r10000 -dEPSCrop -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=%1.pdf %1.eps

Main.tex使用进行编译batch.bat可以修复此问题。因为转换是按相反顺序进行的,即先转换 EPS,然后转换为 PDF。

因此,问题的根源在于,pdftops只要 PDF 包含透明区域,它就会栅格化 EPS。因此,问题是:

是否有一个选项或开关可以避免使用时出现锯齿状轮廓pdftops

笔记:

我坚持使用,batch.bat因为它通常非常节省时间和媒体存储。 产生的锯齿状 EPSbatch.bat显然比MethodA.bat和产生的锯齿状 EPS 更大MethodB.bat。真是悲伤的一天!

答案1

做不到。PostScript 语言不支持任意不透明度(仅支持完全不透明和完全透明)。请参阅此维基百科参考

Ghostscript但是,语言确实支持任意不透明度,作为语言的扩展(额外的命令,例如.setopacityalpha)。请参阅这里了解详情。这就是 pstricks 制作看似透明的 eps 文件的方法。

在你提出的几十个关于数字转换的问题中,我不记得你曾经解释过为什么您希望生成 eps 版本的图形(顺便说一句,这使得回答所有这些问题变得更加困难)。如果您的原因只是在 latex->dvips->ps2pdf 工作流程中使用图形,您可以保证转换为 pdf 将使用 ghostscript,那么该.setopacityalpha方法是合适的(尽管如果这是您的目标,为什么不首先使用带有 pdftex 的 pdf 图像?或者至少添加-Ppdf到您的 dvips 调用中以制作 pdf 优化的 eps?)。但是,人们通常想要 eps 图形的原因是他们将图形提供给不接受 pdf 的某些出版商,在这种情况下,出版商几乎肯定也不会接受 ghostscript 特定的扩展,并且该.setopacityalpha方法也会失败。如果您碰巧知道出版商使用 Adob​​e Distiller,那么还有另一种方法可以生成透明扩展的 EPS,通过pdfmark如所述这里。您可以要求 pstricks 使用pdfmark不透明度方法,方法是替换pstricks.condistiller.cfg(与 pstricks 一起分发)。(您必须要求您的发布商/AllowTransparency true在其 joboptions 文件中进行设置)。

如果您需要严格符合标准的 EPS 文件,并且该文件可与所有 PostScript 引擎配合使用,那么您要么完全避免透明度,要么使用批处理文件中提供的类似 ps2pdf 后跟 pdftoeps 方法的程序,这将对图像的透明部分进行光栅化。(我认为 pdftops 的下一个版本至少会允许您指定光栅化分辨率)。当然,由于光栅化,EPS 通常会更大。

答案2

谢谢你的提问。很高兴得知 EPS 光栅化是由于缺乏对透明度的支持而导致的。

就我而言,出版商的要求迫使我将我的图表从 PDF 转换为 EPS。我发现这可以使用 Adob​​e Acrobat 软件实现无像素化(pdftops 有您提到的问题)。我选择了Save As...,然后Format -> Encapsulated Postscript。在 下,Settings...我注意到该General -> Binary选项略微减小了文件大小。在 OS X 上,我发现Color Management -> Color Profile -> Apple RGB保留了屏幕显示颜色。输出的 EPS 文件比 PDF 源文件大,但在我看来,其他方面看起来是一样的。

相关内容