我经常需要处理技术图纸(机械工程),它们经常带有彩色线条,无法正确打印。因此,我编写了下面列出的批处理脚本。它使用幽灵脚本将图纸转换为黑白;注意,灰度是不够的,因为它们在激光打印中可能几乎看不见。批处理脚本甚至处理拖放到上面的多个文件。
现在我遇到了一大串看起来有线宽的发际线的图画--在激光打印中几乎看不见。
我试着采用这个剧本,但没有用!
我试过了
-c "save /zz {setlinewidth} bind def /setlinewidth { 10 mul zz} bind def"
-c "/setlinewidth { 10 } bind"在其他方面。
幽灵脚本更改线宽的正确参数是什么?
我还附加了我用来实验的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发布于 2019-04-02 07:54:13
PDF和PostScript是不同的东西,我不清楚你用哪一种作为输入。如果它是PDF,那么你基本上不能改变线的宽度。如果是PostScript,那么,在一定范围内,您可以。
首先要注意的是,PostScript程序完全有可能(也不是很少见)故意地击败您为改变颜色而执行的那种操作符重新定义。程序可以直接从systemdict加载操作符,这将绕过您对操作符的重新定义。您的定义将存储在userdict中(因为您没有指定任何其他字典)。您不能覆盖systemdict中的定义,因为这是只读的。您可以使用-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可能会起作用。请注意,我还没有测试过这个。
这个问题对于Ghostscript和PostScript来说都是主题,因为它涉及到一个PostScript编程问题。它的主题不是‘单色’,'cmd',‘批处理-文件’和(可能) PDF。
但是,无法将这种技巧应用于带有Ghostscript的PDF文件中,同样的潜在问题也同样存在;零宽度线被定义为发际线,并且无论设备的分辨率如何,始终只有一个像素宽。如果可以的话,你应该向创建这些文件的人推荐,除非他们有一个非常好的理由,否则他们不会这么做!
https://stackoverflow.com/questions/55464503
复制相似问题