如何更改PDF / PostScript文件中的线宽

时间:2019-04-01 22:33:53

标签: pdf ghostscript postscript

我经常需要处理技术图纸(机械工程),它们通常带有彩色线条,无法正确打印。因此,我写了下面列出的批处理脚本。它使用ghostscript将图形转换为黑白。请注意,灰度是不够的,因为在激光打印上可能几乎看不到灰度。 批处理脚本甚至可以处理拖放到其上的多个文件。

现在,我遇到了大量的图纸,这些图纸似乎具有细线的线宽–在激光打印上几乎看不到。

我试图采用该脚本,但无济于事!

我尝试过

-c "save /zz {setlinewidth} bind def /setlinewidth { 10 mul zz} bind def"

-c "/setlinewidth { 10 } bind"

还有其他

ghostscript更改线宽的正确参数是什么?

我还附加了用于实验的PostScript文件。

非常感谢!!

L。

::  PDFmono.bat
@echo off
if [%1]==[] goto :eof

set GS_EXEC=gswin64c.exe

:loop

set INPUT_FILE=%1
set INTERMEDIATE_FILE=%temp%\%~n1.ps
set OUTPUT_FILE=%~dp1\%~n1_mono%~x1
echo ==============================================================================
echo Converting PDF to monochrome:
echo %INPUT_FILE%
echo ------------------------------------------------------------------------------

%GS_EXEC% ^
    -sOutputFile="%INTERMEDIATE_FILE%" ^
    -sDEVICE=ps2write ^
    -dNOPAUSE -dBATCH -dSAFER ^
    "%INPUT_FILE%"

%GS_EXEC% ^
    -sOutputFile="%OUTPUT_FILE%" ^
    -sDEVICE=pdfwrite ^
    -c "/setrgbcolor { pop pop pop 0 setgray } def /setcmykcolor { pop pop pop pop 0 setgray } def /sethsbcolor { pop pop pop 0 setgray } def" ^
    -dNOPAUSE -dBATCH -dSAFER ^
    "%INTERMEDIATE_FILE%"

del "%INTERMEDIATE_FILE%"
echo ------------------------------------------------------------------------------
echo Done! Monochrome PDF saved as
echo %OUTPUT_FILE%
echo ==============================================================================

shift
if not [%1]==[] goto loop

1 个答案:

答案 0 :(得分:2)

PDF和PostScript是不同的东西,对于我不清楚您使用哪个作为输入。如果是PDF,则您基本上无法更改线宽。如果它的PostScript在一定范围内,则可以。

首先要注意的是,PostScript程序完全有可能(并非完全不常见)故意破坏您正在执行的更改颜色的操作员重新定义。程序可以直接从systemdict显式加载运算符,这将绕过您对运算符的重新定义。您的定义将存储在userdict中(因为您尚未指定任何其他字典)。您不能在systemdict中覆盖定义,因为这是只读的。您可以使用-dWRITESYSTEMDICT,但我强烈建议您不要使用-dWRITESYSTEMDICT,因为这是一个巨大的安全漏洞。

重新定义setlinewidth无效的原因几乎可以肯定是由于PostScript程序将执行类似0 setlinewidth之类的事实。在PostScript中将其定义为在设备上绘制最窄的线,通常为一个像素宽。

看看你的两个例子;

将0乘以10得出...零!这不会改变线宽。请注意,您还执行了保存,但没有执行恢复,这很浪费。您不需要保存。

在第二个示例中,您将原始参数留在了堆栈上,因此有可能破坏了程序的执行,并且由于没有调用系统setlinewidth,因此实际上并未更改图形状态。这也将10留在堆栈上。

类似的东西:

%% Grab a copy of the current setlinewidth
%%
/system_setlinewidth /setlinewidth load def

%% Define a version of setlinewidth which expands hairlines
%%
/setlinewidth {
  dup            %% copy the linewidth parameter
  0 eq           %% Test if its zero, defined as a hairline (consumes the copy)
  {
    pop 10       %% discard the linewidth and replace it with 10
  }
  system_setlinewidth  %% Still need to actually execute the setlinewidth
} bind def

可能会起作用。请注意,我尚未对此进行测试。关于文件,如果您不能将其粘贴到此处,则将其放在公共位置(例如DropBox),然后将URL放入问题中。供将来参考。

该问题对于Ghostscript和PostScript都是完全主题化的,因为它涉及PostScript编程问题。对于“ monchrome”,“ cmd”,“批处理文件”和(可能是)PDF,它不是主题。

尽管没有办法将这种欺骗手段应用到具有Ghostscript的PDF文件中,但同样存在潜在的问题;零宽度线定义为细线,无论设备的分辨率如何,其宽度始终为一个像素。如果可以的话,您应该向创建这些文件的人员推荐,除非他们有充分的理由,否则不要这样做!