Как мне заставить этот постскрипт код работать снова - PullRequest
1 голос
/ 01 октября 2019

У меня есть следующий фрагмент кода PostScript. Что он делает, так это считывает имя файла PDF из массива ConvertItem, получает информацию о странице для этого через getfirstpagesize и сохраняет полученные значения обратно в массиве ConvertItem (8 - 9). Раньше это прекрасно работало до ghostscript 9.27. В этой версии pdfdict устарела.

/ConvertItems
[
     [ (...) (...) <...> (...) (...) () 0 0 0 0 0 0 ]
] def

/getfirstpagesize
{
    1 1 1
    {
        pdfgetpage /MediaBox pget dup pop
        {
            /MediaBox exch def
            /PageWidth MediaBox 2 get def
            /PageHeight MediaBox 3 get def
        } if

        (First page - width [) print PageWidth 10 string cvs print
        (], height [) print PageHeight 10 string cvs print
        (]\n) print
    } for
} bind def

------- snip -------

ConvertItem 0 get (r) file"
pdfdict begin"
pdfopen begin"
getfirstpagesize"
ConvertItem 8 PageWidth put"
ConvertItem 9 PageHeight put"
currentdict pdfclose"
end % temporary dict"
end % pdfdict"

------- snip -------

Я попытался решить эту проблему, используя pdfrunbegin и pdfrunend, как это

------- snip -------

ConvertItem 0 get (r) file
runpdfbegin
getfirstpagesize
ConvertItem 8 PageWidth put
ConvertItem 9 PageHeight put
runpdfend
(*First page - width [) print ConvertItem 8 get 10 string cvs print
(], height [) print ConvertItem 9 get 10 string cvs print
(]\n) print

------- snip -------

Но когда я пытаюсь напечатать значения ConvertItem 8 и 9, они всегда равны 0, поэтому кажется, что runpdfend очищает память, которая используется совместно с этими значениями. Поэтому мой вопрос: есть ли способ обойти это?

1 Ответ

1 голос
/ 01 октября 2019

Ну, похоже, что runpdfbegin сохраняет память интерпретатора и восстанавливает ее после выполнения runpdfend. По этой причине значение «сбрасывается» до значения devault. Чтобы обойти эту проблему, переменные PageWidth и PageHeight должны быть сохранены в globaldict, он не сбрасывается при восстановлении памяти интерпретатора.

/getfirstpagesize
{
    1 1 1
    {
        pdfgetpage dup
        /MediaBox pget
        {
            /MediaBox exch def
            true setglobal
            globaldict begin
            /PageWidth MediaBox 2 get def
            /PageHeight MediaBox 3 get def
            false setglobal
            end
        } if

        pop

        (First page - width [) print PageWidth 10 string cvs print
        (], height [) print PageHeight 10 string cvs print
        (]\n) print
    } for
} bind def
...