首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改PDF/PostScript文件中行的宽度

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

Stack Overflow用户
提问于 2019-04-01 22:33:53
回答 1查看 628关注 0票数 0

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

现在我遇到了一大串看起来有线宽的发际线的图画--在激光打印中几乎看不见。

我试着采用这个剧本,但没有用!

我试过了

代码语言:javascript
复制
-c "save /zz {setlinewidth} bind def /setlinewidth { 10 mul zz} bind def"

-c "/setlinewidth { 10 } bind"

在其他方面。

幽灵脚本更改线宽的正确参数是什么?

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

非常感谢!

L.

代码语言:javascript
复制
::  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
EN

回答 1

Stack Overflow用户

发布于 2019-04-02 07:54:13

PDF和PostScript是不同的东西,我不清楚你用哪一种作为输入。如果它是PDF,那么你基本上不能改变线的宽度。如果是PostScript,那么,在一定范围内,您可以。

首先要注意的是,PostScript程序完全有可能(也不是很少见)故意地击败您为改变颜色而执行的那种操作符重新定义。程序可以直接从systemdict加载操作符,这将绕过您对操作符的重新定义。您的定义将存储在userdict中(因为您没有指定任何其他字典)。您不能覆盖systemdict中的定义,因为这是只读的。您可以使用-dWRITESYSTEMDICT,但我强烈建议您不要使用,因为这是一个巨大的安全漏洞。

您重新定义setlinewidth不起作用的原因几乎肯定是因为PostScript程序将执行类似于0 setlinewidth的程序。这在PostScript中被定义为在设备上画出最窄的线,通常是一个像素宽。

看看你的两个例子:

将0乘以10的结果。零!不会改变线宽。请注意,您还执行了保存,但没有执行还原,这是浪费。你不需要拯救。

在第二个示例中,您将原始参数留在堆栈中,因此可能破坏了程序的执行,而且您没有真正更改图形状态,因为您没有调用setlinewidth。这也将10留在堆栈中。

类似于:

代码语言:javascript
复制
%% 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文件中,同样的潜在问题也同样存在;零宽度线被定义为发际线,并且无论设备的分辨率如何,始终只有一个像素宽。如果可以的话,你应该向创建这些文件的人推荐,除非他们有一个非常好的理由,否则他们不会这么做!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55464503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档