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

问题描述 投票:0回答:1

我经常需要处理技术图纸(机械工程),它们经常带有彩色线条,无法正确打印。因此我编写了下面列出的批处理脚本。它使用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 ghostscript postscript
1个回答
2
投票

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文件,同样的潜在问题也适用;零宽度线被定义为细线,无论设备的分辨率如何,总是一个像素宽。如果你能,你应该向创建这些文件的人推荐他们不这样做,除非他们有一个非常好的理由!

© www.soinside.com 2019 - 2024. All rights reserved.