我经常需要处理技术图纸(机械工程),它们经常带有彩色线条,无法正确打印。因此我编写了下面列出的批处理脚本。它使用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
PDF和PostScript是不同的东西,我不清楚你使用哪个作为输入。如果它的PDF那么你基本上不能改变线条的宽度。如果它的PostScript那么,在一定限度内,你可以。
首先要注意的是,PostScript程序完全有可能(并非完全不常见)故意破坏你正在执行的改变颜色的操作符重新定义。程序可以直接从systemdict显式加载运算符,这将绕过运算符的重新定义。您的定义将存储在userdict中(因为您尚未指定任何其他字典)。您不能覆盖systemdict中的teh定义,因为它是只读的。您可以使用-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','batch-file'和(可能)PDF的主题。
然而,没有办法将这个技巧应用于带有Ghostscript的PDF文件,同样的潜在问题也适用;零宽度线被定义为细线,无论设备的分辨率如何,总是一个像素宽。如果你能,你应该向创建这些文件的人推荐他们不这样做,除非他们有一个非常好的理由!