<div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">Thanks everyone for the ideas. Lots to think about!  Not recreating all the lines, boxes, and other adornments on the form makes sense.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">We are a small government agency and do not have a decent, full-fledged electronic medical record.  We are about to resume (hopefully large-scale) blood lead testing for children. We were doing it pre-pandemic, and I remember the workflow, data management, and preparations for billing being very tedious.  I've created a REDCap project to manage most of the operation. R has a nice capability to interface with REDCap via an API. R is the only programming language I have any facility with. As the saying goes, "If all you have is a hammer, everything looks like a nail."</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">--Chris</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Apr 5, 2024 at 9:09 AM <<a href="mailto:karl@aspodata.se">karl@aspodata.se</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Karl:<br>
> Chris:<br>
> > I dream of using R, Rmarkdown, knittr, and pdflatex to pull individual<br>
> > records from a database and generate a form like page 1 here:<br>
> > <br>
> > <a href="https://www.cigna.com/static/www-cigna-com/docs/form-cms1500.pdf" rel="noreferrer" target="_blank">https://www.cigna.com/static/www-cigna-com/docs/form-cms1500.pdf</a><br>
<br>
PostScript example follows:<br>
<br>
$ pdfimages form-cms1500.pdf a<br>
$ pnmtops -imagewidth=8.5 a-0000.ppm > form-cms1500.eps<br>
pnmtops: generating color Postscript program.<br>
$ cat <a href="http://pre.ps" rel="noreferrer" target="_blank">pre.ps</a> form-cms1500.eps <a href="http://end.ps" rel="noreferrer" target="_blank">end.ps</a> > <a href="http://tt.ps" rel="noreferrer" target="_blank">tt.ps</a><br>
$ gv -watch -scale=4 <a href="http://tt.ps" rel="noreferrer" target="_blank">tt.ps</a><br>
<br>
You can use gv to find coordinates of where to place your text,<br>
they are shown in gv top-left. To the left, under som buttons,<br>
there is a "greyer" area with a light gray rectangle in it.<br>
Press left mouse button in the ligth gray area and move to move<br>
around on the page.<br>
<br>
The <a href="http://pre.ps" rel="noreferrer" target="_blank">pre.ps</a> and <a href="http://end.ps" rel="noreferrer" target="_blank">end.ps</a> files as below.<br>
<br>
If you want pdf files instead, do:<br>
ps2pdf <a href="http://tt.ps" rel="noreferrer" target="_blank">tt.ps</a><br>
<br>
For information about postscript, search for adobes PLRM2.pdf or PLRM3.pdf<br>
<br>
=========== <a href="http://pre.ps" rel="noreferrer" target="_blank">pre.ps</a>, mostly from appendix H.7 "EPS Example" PLRM2.pdf<br>
%!PS-Adobe-3.0<br>
%%BoundingBox: 0 0 612 792<br>
%%Creator: form-cms1500-generator<br>
%%Title: (form-cms1500)<br>
%%CreationDate: 05/04/24 (14:16)<br>
%%Pages: 1<br>
%%DocumentFonts: Helvetica Times-Italic<br>
%%DocumentNeededFonts: Helvetica Times-Italic<br>
%%EndComments<br>
<br>
%%BeginProlog<br>
/BeginEPSF { %def<br>
/b4_Inc_state save def                     % Save state for cleanup<br>
/dict_count countdictstack def             % Count objects on dict stack<br>
/op_count count 1 sub def                  % Count objects on operand stack<br>
userdict begin                             % Push userdict on dict stack<br>
/showpage { } def                          % Redefine showpage, { } = null proc<br>
0 setgray 0 setlinecap                     % Prepare graphics state<br>
1 setlinewidth 0 setlinejoin<br>
10 setmiterlimit [ ] 0 setdash newpath<br>
/languagelevel where                       % If level not equal to 1 then<br>
{pop languagelevel                         % set strokeadjust and<br>
1 ne                                       % overprint to their defaults.<br>
{false setstrokeadjust false setoverprint<br>
} if<br>
} if<br>
} bind def<br>
<br>
/EndEPSF { %def<br>
count op_count sub {pop} repeat  % Clean up stacks<br>
countdictstack dict_count sub {end} repeat<br>
b4_Inc_state restore<br>
} bind def<br>
%%EndProlog<br>
<br>
%%BeginSetup<br>
%%IncludeFont: Helvetica Times-Italic<br>
%%EndSetup<br>
%%Page: 1 1<br>
%%BeginPageSetup<br>
/pgsave save def<br>
%%EndPageSetup<br>
<br>
%EndProlog<br>
<br>
BeginEPSF<br>
%%BeginDocument: form-cms1500<br>
=========== <a href="http://end.ps" rel="noreferrer" target="_blank">end.ps</a><br>
%%EndDocument<br>
EndEPSF<br>
<br>
pgsave restore<br>
<br>
/Helvetica findfont 10 scalefont setfont<br>
22.5 675 moveto (X) show<br>
<br>
/Times-Italic findfont 12 scalefont setfont<br>
22.5 653 moveto (Karl Hammar) show<br>
<br>
showpage<br>
%%EOF<br>
===========<br>
<br>
Regards,<br>
/Karl Hammar<br>
<br>
<br>
</blockquote></div>