Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 在重影脚本中,裁剪标记未设置在正确的位置_Shell_Pdf_Ghostscript_Postscript - Fatal编程技术网

Shell 在重影脚本中,裁剪标记未设置在正确的位置

Shell 在重影脚本中,裁剪标记未设置在正确的位置,shell,pdf,ghostscript,postscript,Shell,Pdf,Ghostscript,Postscript,我尝试在pdf文件中添加裁剪标记。但裁剪标记未设置在右侧或正确角落的顶部。我试图通过postscript获得页面大小并设置标记,但我的postscript获得了新的页面宽度和高度,并设置了标记,但标记位置不正确。 我的鬼命令是:- gswin64c.exe-o E:\output.pdf-dBATCH-dNOPAUSE-dDOPDFMARKS-sDEVICE=pdfwrite-dfexedmedia-dPDFFitPage-dDEVICEWIDTHPOINTS=396-dDEVICEHEIGHT

我尝试在pdf文件中添加裁剪标记。但裁剪标记未设置在右侧或正确角落的顶部。我试图通过postscript获得页面大小并设置标记,但我的postscript获得了新的页面宽度和高度,并设置了标记,但标记位置不正确。 我的鬼命令是:- gswin64c.exe-o E:\output.pdf-dBATCH-dNOPAUSE-dDOPDFMARKS-sDEVICE=pdfwrite-dfexedmedia-dPDFFitPage-dDEVICEWIDTHPOINTS=396-dDEVICEHEIGHTPOINTS=612 test.ps-f E:\comic.pdf

inout或output文件链接

我的作物标记后记是

    <<
/BeginPage {
    /count exch def % of previous showpage calls for this device
} bind
/EndPage {

    /pagewidth  currentpagedevice /PageSize get 0 get def
    /pageheight currentpagedevice /PageSize get 1 get def
    /y pageheight 9 sub def
    /x pagewidth 9 sub def

    newpath
    -1 -1 moveto
    0 9 rlineto
    10 0 rlineto
    0 -10 rlineto
    -10 0 rlineto
    closepath
    gsave
    grestore
    1 setlinewidth
    stroke


    newpath
    x -1 moveto
    0 9 rlineto
    10 0 rlineto
    0 -10 rlineto
    -10 0 rlineto
    closepath
    gsave
    1 setlinewidth
    grestore
    stroke


    newpath
    x y moveto
    0 10 rlineto
    10 0 rlineto
    0 -10 rlineto
    -10 0 rlineto
    closepath
    gsave
    grestore
    1 setlinewidth
    stroke

    newpath
    -1 y moveto
    0 10 rlineto
    10 0 rlineto
    0 -10 rlineto
    -10 0 rlineto
    closepath
    gsave
    grestore
    1 setlinewidth
    stroke


    % return (output=) true only for showpage.
    code 0 eq
}
>> setpagedevice

理想情况下,在运行BeginPage或EndPage过程时,不应该简单地在当前字典中创建新的键/值对。原因是,在执行这些字典时,您不能确切地依赖于哪个字典恰好位于字典堆栈的顶部,而且可能会有所不同

这可能导致未定义您期望存在的键,并可能导致您覆盖字典中已有的键/值对

事实上,在PostScript中,通常认为更好的做法是根本不在字典中定义瞬时变量,而只是将它们存储在堆栈中并从那里访问它们。这否定了覆盖值的可能性,堆栈操作通常比字典操作快,因此也有一点性能优势

EndPage过程执行所有计算并执行笔划,即使它不会将页面传输到设备(这显然是浪费),也应该使用if。您将gsave和grestore作为一对一起使用,这毫无意义,而且在性能方面非常昂贵。这是一个图形状态的保存和恢复,如果在这期间你不做任何事情,那么它就没有效果

最后,您的BeginPage过程定义了/count,但您似乎并没有实际使用它

如果我是你,我会将这些改写为:

/BeginPage {
    userdict /MyDict known    %% is MyDict alreadly present in userdict ?
    {
        userdict /MyDict get  %% If it is, then get it
    }
    {
        userdict begin        %% start userdict (makes it top element on dict stack)
        /MyDict               %% Put key /MyDict on stack
                              %%   stack - /MyDict
        5 dict                %% make a 5 element dictionary
                              %%   stack - /MyDict -dict-
        dup                   %% make a copy (duiplicates a pointer)
                              %%   stack - /MyDict -dict -dict-
        3 1 roll              %% rotate the stack
                              %%   stack -dict /MyDict -dict
        put                   %% Put the top element on the stack in the current
                              %% dictionary, using the key second top on the stack
                              %%    stack -dict-
        end                   %% close userdict
    } ifelse
    begin                     %% make the top element on the stack the current
                              %% dictionary.
    /count exch def           %% store the count ot pages in the currnt dictionary
                              %% using the key /count.
    end                       %% close the current dictionary
}
显然,你可以删除所有的评论,它们纯粹是解释性的。从这一点开始,您可以通过执行以下操作找到与计数关联的值:

userdict /MyDict get /count get
然后:

请注意,我没有测试代码,它只是用于演示

现在真正的问题是,你的笔划放错地方的原因是因为你缩放了页面

-dFitPage通过调整当前转换矩阵来缩放页面内容,使其适应新的页面维度。该点之后的所有内容都将缩放,这包括EndPage过程中的路径构造

展示;尝试在不使用-dFIXEDMEDIA等的情况下执行命令行,您会看到页面显示为原始大小,并且笔划位于正确的位置


为了正确放置笔划,您需要知道应用了什么比例因子,并将坐标值乘以该量的倒数。也就是说,如果比例因子为0.5,即大小的一半,则需要将位置乘以2。

这很有趣。测试仅放置裁剪标记,没有错误,但仍然没有反向缩放,因此不适合即时调整大小。转向两步再蒸馏的决定将取决于需求,因为两步方法现在起作用,而额外的开发可以在未来实现一体化的结果

<<  /EndPage { exch pop   % page number unneeded

0 eq { pop       % ifelse

gsave

currentpagedevice /PageSize get
dup 0 get 9 sub exch 1 get 9 sub

2 array astore       % put in new array

newpath
-1 -1 moveto
0 9 rlineto
10 0 rlineto
0 -10 rlineto
-10 0 rlineto
closepath
1 setlinewidth
stroke

newpath
%    x
dup 0 get
-1 moveto
0 9 rlineto
10 0 rlineto
0 -10 rlineto
-10 0 rlineto
closepath
1 setlinewidth
stroke

newpath
%    x y 
dup aload pop
moveto
0 10 rlineto
10 0 rlineto
0 -10 rlineto
-10 0 rlineto
closepath
1 setlinewidth
stroke

newpath
1 get
%    -1 
%    y
-1 exch
moveto
0 10 rlineto
10 0 rlineto
0 -10 rlineto
-10 0 rlineto
closepath
1 setlinewidth
stroke

grestore

% return (output=) true only for showpage.
true}{pop false}ifelse

}
 >> setpagedevice

%showpage   % shortcut for testing
编辑2:这些重新分色会导致dpi发生变化,因此如果需要300dpi分辨率,也可以使用ghostscript进行更改。以下是有关两步流程结果的一些信息:

$ pdfimages -list comic11.pdf tmp/
tmp/-0000.ppm: page=1 width=2063 height=3150 hdpi=300.00 vdpi=300.00 colorspace=DeviceRGB bpc=8
tmp/-0001.pgm: page=1 width=2063 height=3150 hdpi=300.00 vdpi=300.00 colorspace=DeviceGray bpc=8

$ pdfimages -list comic11-cropmarks.pdf tmp/
tmp/-0000.ppm: page=1 width=2063 height=3150 hdpi=300.00 vdpi=300.00 colorspace=DeviceRGB bpc=8
tmp/-0001.pgm: page=1 width=2063 height=3150 hdpi=300.00 vdpi=300.00 colorspace=DeviceGray bpc=8

$ pdfimages -list comic11-resized.pdf tmp/
tmp/-0000.ppm: page=1 width=2063 height=3150 hdpi=375.09 vdpi=375.09 colorspace=DeviceRGB bpc=8
tmp/-0001.pgm: page=1 width=2063 height=3150 hdpi=375.09 vdpi=375.09 colorspace=DeviceGray bpc=8

这是一个一体化的解决方案。我必须更改ghostscript命令行

编辑:这里有一个postscript all-in-one comic.ps,因为您说页面大小不适用于我之前的尝试:

%!
true setstrokeadjust
0.5 setlinewidth 1.0 0.9 0.9 setrgbcolor
[ 7.7 10 381 591 ] dup rectfill
1 0 0 setrgbcolor rectstroke 0.9 0.9 1.0 setrgbcolor
[ 15 18 366.5 575.5 ] dup rectfill
0.3 setlinewidth 0 0 1 setrgbcolor rectstroke
0 0 0 setrgbcolor
[ 7.7 10 -10 -10 ] rectstroke
[ 7.7 601 -10 10 ] rectstroke
[ 388.5 601 10 10 ] rectstroke
[ 388.5 10 10 -10 ] rectstroke

/centre { dup stringwidth pop 2 div 396 2 div exch sub } def
/Helvetica-BoldOblique 10 selectfont

(ARTWORK MUST EXTEND PAST RED LINES ON ALL PAGES.) centre 500 moveto show
(THIS IS THE TRIM LINE.) centre 478 moveto show
(ARTWORK BEYOND THE TRIM LINE WILL FALL INTO SPINE) centre 456 moveto show
(OR BE CUT OFF. THE ACTUAL CUT MAY VARY UP TO 1/8" FROM) centre 434 moveto show
(THIS LINE TO EITHER SIDE DURING PRODUCTION.) centre 412 moveto show
(BLUE AREA IS THE "SAFE" ZONE.) centre 390 moveto show
(BE SURE ALL TEXT AND IMPORTANT IMAGES ARE) centre 368 moveto show
(KEPT WITHIN THE BLUE AREAS.) centre 346 moveto show
(ALL NON-WHITE BORDERS AND FILLS) centre 324 moveto show
(SHOULD EXTEND TO EDGE OF PAGE. \(WHITE AREA\)) centre 302 moveto show
(TEMPLATE RESOLUTION IS SET TO 300 DPI.) centre 280 moveto show
(THIS IS PRINT-READY AND SHOULD NOT BE CHANGED.) centre 258 moveto show
1 0 0 setrgbcolor
(THESE NOTES ARE ON THE "TEMPLATE" LAYER) centre 136 moveto show
(AND SHOULD BE DELETED BEFORE EXPORTING) centre 114 moveto show
(FINAL FILES FOR PRINT.) centre 92 moveto show
showpage
这只是一个例子。可以编辑postscript以修复任何其他问题。这是我的ghostscript命令行:

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -r300 -dPDFFitPage -dFIXEDMEDIA -dDEVICEWIDTHPOINTS=396 -dDEVICEHEIGHTPOINTS=612 -sOutputFile=comic.pdf -f comic.ps
EDIT3:修复了将上面的postscript矩形叠加到已调整大小的comic11.pdf上,直到匹配为止所找到的数字


EDIT4:将>setpagedevice添加到上述postscript的开头可以使用ps2pdf创建具有正确页面大小的pdf。

代码抛出错误:/typecheck in/-.endpage-或/-beginpage。你能解释一下吗?如果我删除-dFIXEDMEDIA,则对输出pdf没有任何影响,但如果我删除-DpffitPage,则输出pdf大小不变。如果出现错误“tyepecheck”,则表示程序使用了一个运算符,该运算符需要特定类型的数据,例如整数,并且提供了不同类型的数据。很明显,程序中有一个bug,我确实说过它没有经过测试。是的,很明显,如果删除-dPDFFitPage,则大小不会改变,这就是重点。如果您这样做,您将看到您的copr标记位于正确的位置。你的问题是CTM是按比例缩放的,你需要对你的坐标应用逆比例缩放,或者使用你的坐标
为原始页面工作。我试图解决/打字检查错误,但我无法。你能检查一下吗。这对我来说很紧急。如果您有任何其他示例可以使用ghost命令行添加裁剪标记,那么只需使用现有代码,这可能是最简单的。您的要求是什么?有很多pdf文件要转换吗?初始尺寸是否总是相同的496x756?最终尺寸是否始终为396x612?您的命令行总是将解释器设置为创建396x612输出,这样就不必关心输入大小,从而忽略信息。这些示例在将原始页面实际调整为新页面大小之前在页面上放置裁剪标记,而新页面大小显然必须在结束页面之后。我发现一个两步提取过程可以首先放置裁剪标记,然后调整页面大小。这对您的目的有用吗?在正确的位置裁剪标记,但最终PDF大小不符合396x612。因此,尝试从我之前的帖子中的两步转换而不是综合转换是不对的。我可以想出很多方法来做到这一点,只是不知道真正需要什么。我会从头开始,在postscript中做所有事情,然后可以精确地指定尺寸,并创建一个好的pdf。comic11.pdf中有两个图像,如果需要,可以提取pnm和pgm并调整其大小。如果不是这样的话,附言就很容易了。如果你只需要一个有效的pdf,那么试试我的两步回答。
%!
true setstrokeadjust
0.5 setlinewidth 1.0 0.9 0.9 setrgbcolor
[ 7.7 10 381 591 ] dup rectfill
1 0 0 setrgbcolor rectstroke 0.9 0.9 1.0 setrgbcolor
[ 15 18 366.5 575.5 ] dup rectfill
0.3 setlinewidth 0 0 1 setrgbcolor rectstroke
0 0 0 setrgbcolor
[ 7.7 10 -10 -10 ] rectstroke
[ 7.7 601 -10 10 ] rectstroke
[ 388.5 601 10 10 ] rectstroke
[ 388.5 10 10 -10 ] rectstroke

/centre { dup stringwidth pop 2 div 396 2 div exch sub } def
/Helvetica-BoldOblique 10 selectfont

(ARTWORK MUST EXTEND PAST RED LINES ON ALL PAGES.) centre 500 moveto show
(THIS IS THE TRIM LINE.) centre 478 moveto show
(ARTWORK BEYOND THE TRIM LINE WILL FALL INTO SPINE) centre 456 moveto show
(OR BE CUT OFF. THE ACTUAL CUT MAY VARY UP TO 1/8" FROM) centre 434 moveto show
(THIS LINE TO EITHER SIDE DURING PRODUCTION.) centre 412 moveto show
(BLUE AREA IS THE "SAFE" ZONE.) centre 390 moveto show
(BE SURE ALL TEXT AND IMPORTANT IMAGES ARE) centre 368 moveto show
(KEPT WITHIN THE BLUE AREAS.) centre 346 moveto show
(ALL NON-WHITE BORDERS AND FILLS) centre 324 moveto show
(SHOULD EXTEND TO EDGE OF PAGE. \(WHITE AREA\)) centre 302 moveto show
(TEMPLATE RESOLUTION IS SET TO 300 DPI.) centre 280 moveto show
(THIS IS PRINT-READY AND SHOULD NOT BE CHANGED.) centre 258 moveto show
1 0 0 setrgbcolor
(THESE NOTES ARE ON THE "TEMPLATE" LAYER) centre 136 moveto show
(AND SHOULD BE DELETED BEFORE EXPORTING) centre 114 moveto show
(FINAL FILES FOR PRINT.) centre 92 moveto show
showpage
gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -r300 -dPDFFitPage -dFIXEDMEDIA -dDEVICEWIDTHPOINTS=396 -dDEVICEHEIGHTPOINTS=612 -sOutputFile=comic.pdf -f comic.ps