[原]postscript中插入eps

作者: 锦城牛仔 | 来源:发表于2019-08-14 10:00 被阅读6次

    由于某些需求,要实现在postscript文档中插入eps二维码。经过一番搜索阅读试验,终于成功的在windows和linux上都实现了。整理来给大家分享。


    明确一下需求:

    有一个已经生成好的postscript格式文件(.ps文件),要在这个postscript文件中插入一个包含特定信息的二维码(eps格式)。

    步骤如下:

    1. 生成好的postscript文件(test101.ps)


    test101.ps包括一个像素化的直升飞机图片,文件内容如下:

    %!PS-Adobe-3.0

    /Helicopter

    <dd ff 00 ff 54 1f 80 03 fb f9 00 1e> def

    150 400 translate

    144 144 scale

    16 6 1 [6 0 0 6 0 0] {Helicopter} image

    showpage

    test101.ps绘制的图片

    2. 用zint生成eps二维码

    zint --notext -b 58 -o epsfile.eps -d "testqrcode"

    -d "testqrcode" 表示testqrcode是二维码包含的字符串。

    -o epsfile.eps 表示生成的二维码文件名为epsfile.eps。

    -b 58 表示生成二维码

    zint 生成的二维码

    生成的epsfile.eps内容如下:

    %!PS-Adobe-3.0 EPSF-3.0

    %%Creator: Zint 2.4.2

    %%Title: Zint Generated Symbol

    %%Pages: 0

    %%BoundingBox: 0 0 21 21

    %%EndComments

    /TL { setlinewidth moveto lineto stroke } bind def

    /TC { moveto 0 360 arc 360 0 arcn fill } bind def

    /TH { 0 setlinewidth moveto lineto lineto lineto lineto lineto closepath fill } bind def

    /TB { 2 copy } bind def

    /TR { newpath 4 1 roll exch moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath fill } bind def

    /TE { pop pop } bind def

    newpath

    0.00 0.00 0.00 setrgbcolor

    1.00 1.00 1.00 setrgbcolor

    21.00 0.00 TB 0.00 21.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 0.00 TB 0.00 7.00 TR

    TB 8.00 1.00 TR

    TB 10.00 2.00 TR

    TB 15.00 1.00 TR

    TB 17.00 1.00 TR

    TB 19.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 1.00 TB 0.00 1.00 TR

    TB 6.00 1.00 TR

    TB 8.00 1.00 TR

    TB 10.00 1.00 TR

    TB 17.00 2.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 2.00 TB 0.00 1.00 TR

    TB 2.00 3.00 TR

    TB 6.00 1.00 TR

    TB 8.00 4.00 TR

    TB 13.00 1.00 TR

    TB 18.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 3.00 TB 0.00 1.00 TR

    TB 2.00 3.00 TR

    TB 6.00 1.00 TR

    TB 8.00 2.00 TR

    TB 12.00 2.00 TR

    TB 16.00 3.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 4.00 TB 0.00 1.00 TR

    TB 2.00 3.00 TR

    TB 6.00 1.00 TR

    TB 8.00 2.00 TR

    TB 12.00 1.00 TR

    TB 14.00 2.00 TR

    TB 17.00 1.00 TR

    TB 20.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 5.00 TB 0.00 1.00 TR

    TB 6.00 1.00 TR

    TB 10.00 4.00 TR

    TB 15.00 4.00 TR

    TB 20.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 6.00 TB 0.00 7.00 TR

    TB 8.00 2.00 TR

    TB 12.00 1.00 TR

    TB 17.00 1.00 TR

    TB 19.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 7.00 TB 8.00 1.00 TR

    TB 10.00 4.00 TR

    TB 15.00 2.00 TR

    TB 18.00 3.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 8.00 TB 1.00 1.00 TR

    TB 3.00 1.00 TR

    TB 6.00 6.00 TR

    TB 14.00 2.00 TR

    TB 17.00 1.00 TR

    TB 19.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 9.00 TB 2.00 1.00 TR

    TB 4.00 2.00 TR

    TB 8.00 1.00 TR

    TB 13.00 1.00 TR

    TB 16.00 3.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 10.00 TB 0.00 1.00 TR

    TB 2.00 5.00 TR

    TB 8.00 1.00 TR

    TB 10.00 2.00 TR

    TB 13.00 2.00 TR

    TB 17.00 3.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 11.00 TB 0.00 1.00 TR

    TB 2.00 1.00 TR

    TB 5.00 1.00 TR

    TB 7.00 1.00 TR

    TB 10.00 1.00 TR

    TB 12.00 7.00 TR

    TB 20.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 12.00 TB 0.00 5.00 TR

    TB 6.00 4.00 TR

    TB 12.00 2.00 TR

    TB 15.00 1.00 TR

    TB 17.00 1.00 TR

    TB 19.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 13.00 TB 10.00 3.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 14.00 TB 0.00 7.00 TR

    TB 8.00 1.00 TR

    TB 10.00 1.00 TR

    TB 12.00 1.00 TR

    TB 14.00 7.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 15.00 TB 0.00 1.00 TR

    TB 6.00 1.00 TR

    TB 8.00 3.00 TR

    TB 12.00 1.00 TR

    TB 14.00 1.00 TR

    TB 20.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 16.00 TB 0.00 1.00 TR

    TB 2.00 3.00 TR

    TB 6.00 1.00 TR

    TB 10.00 3.00 TR

    TB 14.00 1.00 TR

    TB 16.00 3.00 TR

    TB 20.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 17.00 TB 0.00 1.00 TR

    TB 2.00 3.00 TR

    TB 6.00 1.00 TR

    TB 8.00 1.00 TR

    TB 11.00 1.00 TR

    TB 14.00 1.00 TR

    TB 16.00 3.00 TR

    TB 20.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 18.00 TB 0.00 1.00 TR

    TB 2.00 3.00 TR

    TB 6.00 1.00 TR

    TB 9.00 1.00 TR

    TB 14.00 1.00 TR

    TB 16.00 3.00 TR

    TB 20.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 19.00 TB 0.00 1.00 TR

    TB 6.00 1.00 TR

    TB 8.00 1.00 TR

    TB 11.00 1.00 TR

    TB 14.00 1.00 TR

    TB 20.00 1.00 TR

    TE

    0.00 0.00 0.00 setrgbcolor

    1.00 20.00 TB 0.00 7.00 TR

    TB 9.00 1.00 TR

    TB 12.00 1.00 TR

    TB 14.00 7.00 TR 

    showpage   

    3. 修改test101.ps插入epsfile.eps文件

    核心代码是:

    save /showpage {} bind def (epsfile.eps) run restore

    阅读了参考文档之后,在插入eps前后要做状态保存和恢复。

    %!PS-Adobe-3.0

    /BeginEPSF { %def

        /b4_Inc_state save def                  %Save state for cleanup

        /dict_count countdictstack def          %Count objects on dict stack

        /op_count count 1 sub def              %Count objects on operand stack

        userdict begin                          %Push userdict on dict stack

        /showpage { } def                      %Redefine showpage, { } = null proc

        0 setgray 0 setlinecap                  % Prepare graphics state

        1 setlinewidth 0 setlinejoin

        10 setmiterlimit [ ] 0 setdash newpath

        /languangelevel where                  %If level not equal to 1 then

        {pop languangelevel                    %set strokeadjust and

        1 ne                                    %overprint to their defaults

          {false setstrokeadjust false setoverprint

          } if

        } if

    } bind def

    /EndEPSF { %def

        count op_count sub {pop} repeat        %Clean up stacks

        countdictstack dict_count sub{end} repeat

        b4_Inc_state restore

    } bind def

    BeginEPSF

    20 20 translate

    10 10 scale

    %-10 -10 translate

    %%BeginDocument: epsfile.eps

    save /showpage { } bind def (epsfile.eps) run restore

    %%EndDocument

    EndEPSF

    /Helicopter

    <dd ff 00 ff 54 1f 80 03 fb f9 00 1e> def

    150 400 translate

    144 144 scale

    16 6 1 [6 0 0 6 0 0] {Helicopter} image

    showpage

    4. 用ps2pdf生成pdf文件:

    ps2pdf -I. G:\teemmp\test101\test101.ps

    -I参数指定ghostscript的搜索路径(-I.)

    注意,将test101.ps和epsfile.eps放在同一个目录下。这一步要加上-I参数,并且指定当前路径.,否则会出现ghostscript不能找到epsfile.eps文件的报错

    插入二维码之后的结果

    相关文章

      网友评论

        本文标题:[原]postscript中插入eps

        本文链接:https://www.haomeiwen.com/subject/iigbjctx.html