Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
416 views
in Technique[技术] by (71.8m points)

pdf - How can I make a program overlay text on a postscript file?

I have some graphs in postscript format, generated by gnuplot. I need to place some identifying information on the graph. How can I script some instructions to do that? I want to write a number at the top right corner of the graph (a .ps file).

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Ok, the example file you linked to is well behaving (and has not re-defined the showpage operator).

So I'm now assuming the following:

  1. All your .ps files are similar to your example file.
  2. All your .ps files are 1 page only (like .eps files).
  3. All your filenames are like constructed as gnp-NNN.ps (like gnp-544.ps is).
  4. The number you want to appear in the top right corner is NNN from the filename.

I also assume you have Ghostscript installed, and it is the most recent version, 8.71. I'm currently on Windows -- if you're on Linux/Unix, just replace gswin32c.exe by gs and all line endings ^ by .

Test PDF Output

Now try this command first:

gswin32c.exe ^
 -o gnp-with-number-544.pdf ^
 -sDEVICE=pdfwrite ^
 -g5030x5320 ^
 -c "/Helvetica-Italic findfont 15 scalefont setfont 453 482 moveto (544) show" ^
 -f gnp-544.ps

and see if the resulting gnp-with-number-544.pdf looks like you want it.

The -c "..." is used to pass PostScript snippets to Ghostscript and make it process these together with the main .ps file which has then to follow as next parameter, with -f ....

You can modify parameters:

  • Replace the /Helvetica-Italic fontname by /Helvetica, /Courier, /Times, Helvetica-Bold or whatever you've available and prefer.
  • Or modify the fontsize: 15 here means 15 points (in PDF 72 points == 1 inch).
  • Or change the position: 453 482 moves the PostScript currentpoint to "453 points to the left, 482 points to the top" (with the oringin 0,0 set to the bottom left corner).
  • Or tweak the media size: -g5030x5320 gives you 503x532 points (due to the default resolution of 720 dpi used by -sDEVICE=pdfwrite.
  • Or set the string being printed to (File No. 544) show or whatever you want.

You could also add quite a few parameters to tweak the quality of the output file (resolution, font embedding etc.), but these ones will do for now.

Change to PostScript Output

Should you need PostScript output for some reason instead of PDF, change the command like this:

gswin32c.exe ^
 -o gnp-with-number-544.ps ^
 -sDEVICE=ps2write ^
 -g5030x5320 ^
 -c "/Helvetica-Italic findfont 15 scalefont setfont 453 482 moveto (544) show" ^
 -f gnp-544.ps

Batch-convert Lots of Files

Now, how to batch-convert this? For this last step, I'm assuming:

  1. your NNN numbering scheme is not using leading 0s.
  2. your range of files to be converted is gnp-1.ps..gnp-1000.ps.
  3. you want PDF output with the numbers added, not PS.

On Windows, create an addnumbers-make-pdf.bat file with this content:

gswin32c.exe ^
-o gnp-with-number-%1.pdf ^
-sDEVICE=pdfwrite ^
-g5030x5320 ^
-c "/Helvetica-Italic findfont 15 scalefont setfont 453 482 moveto (%1) show" ^
-f gnp-%1.ps

Now run this command in a cmd.exe console:

for /l %i in (1,1,100) do (addnumbers-make-pdfvim.bat %i)

On Linux, create an addnumbers-make-pdf.sh Bash shell script with this content:

#!/bin/bash
gs 
-o gnp-with-number-${1}.pdf 
-sDEVICE=pdfwrite 
-g5030x5320 
-c "/Helvetica-Italic findfont 15 scalefont setfont 453 482 moveto (${1}) show" 
-f gnp-${1}.ps

Now run this command in a shell:

for i in $(seq 1 1000); do addnumbers-make-pdf.sh ${i} ; done

Update:
Hah!, it even works ;-) I just tested it on Windows. Here is a screenshot with the original and the overlayed file (as PDFs):
alt text


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...