由于某些需求,要实现在postscript文档中插入eps二维码。经过一番搜索阅读试验,终于成功的在windows和linux上都实现了。整理来给大家分享。
明确一下需求:
有一个已经生成好的postscript格式文件(.ps文件),要在这个postscript文件中插入一个包含特定信息的二维码(eps格式)。
步骤如下:
1. 生成好的postscript文件(test101.ps)
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
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文件的报错。
插入二维码之后的结果
网友评论