Как изменить ширину строк в файле PDF / PostScript - PullRequest
0 голосов
/ 02 апреля 2019

Мне регулярно приходится обращаться с техническими чертежами (машиностроение), и они часто бывают с цветными линиями, которые не могут быть напечатаны должным образом. Поэтому я написал пакетный скрипт, указанный ниже. Он использует ghostscript для преобразования рисунков в черно-белые; обратите внимание, что оттенки серого недостаточно, поскольку они могут быть едва видны на лазерной печати. Пакетный сценарий даже обрабатывает несколько файлов, перетаскиваемых на него.

Теперь я сталкиваюсь с большой группой рисунков, которые, кажется, имеют ширину линии роста волос - едва видимые на лазерном принте.

Я пытался принять сценарий, но безрезультатно!

Я пытался

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

-c "/setlinewidth { 10 } bind"

среди прочих.

Каковы правильные параметры ghostscript для изменения ширины линий?

Я также приложил файл PostScript, с которым я экспериментирую.

Большое спасибо !!!

Л.

::  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 Ответ

2 голосов
/ 02 апреля 2019

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

Возможно, будет работать.Обратите внимание, что я не проверял это.Что касается файлов, если вы не можете вставить их сюда, поместите их где-нибудь в открытый доступ (например, DropBox) и укажите URL в вопросе.Для дальнейшего использования.

Вопрос полностью актуален как для Ghostscript, так и для PostScript, поскольку он затрагивает вопрос программирования на PostScript.Это не по теме для 'monchrome', 'cmd', 'batch-file' и (возможно) PDF.

Нет способа применить этот трюк к файлу PDF с помощью Ghostscript, и то же самоепотенциальная проблема применима;Линии нулевой ширины определяются как волоски и всегда имеют ширину в один пиксель, независимо от разрешения устройства.Если вы можете, вы должны порекомендовать людям, создающим эти файлы, что они этого не делают, если у них нет очень веских причин!

...