前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS-利用SAS制作CRF注释

SAS-利用SAS制作CRF注释

作者头像
Setup
发布2022-03-14 14:21:07
3.1K0
发布2022-03-14 14:21:07
举报
文章被收录于专栏:SAS程序分享号号号

在临床编程中,经常会遇到制作注释CRF的场景。今天小编来分享一下,如何利用SAS实现注释CRF的制作。

原理

PDF的注释是可以利用PDF阅读器进行导入和导出的,利用SAS产生可导入PDF的注释文件(.xfdf)。xfdf文件内其实也是XML语言,如下图。

拿一个已经制作完成的注释CRF,将注释导出成XFDF文件,利用Notepad打开,仔细观察一下,其实很容易发现XFDF内部语句的规律。譬如<freetext>标签内的Color控制注释框的背景颜色,Page控制注释框所在页码,Rect控制注释框坐标位置(注释框长度和高度等)。当知道了每一个注释框都有类似的规律,就可以很简单的利用程序来自动生成XFDF文件了。

例子

下面来分享一下具体示例,可以利用Excel制作一个模板,填入相应的固定参数,利用SAS程序按照相应规律输出即可。

Excel模板

Excel模板列说明

关于注释框的位置,可以输入注释框一个点的位置(左上角),根据文本框的内容长度来自动计算注释框的坐标。这一步可以利用Excel公式直接得出。下面来看下我这个模板的相应的SAS程序。

代码语言:javascript
复制
/****************************************************************************************************************************************
宏名称    : AutoaCRF

目的      : 半自动化生成注释CRF(SDTM标准注释CRF)

参数说明    : inpath   调用模板
        outpath  输出xfdf位置,输出到空白CRF同一路径下
        BlackCRF 空白CRF  (对应需要注释的CRF的名称)
        
        利用Adobe PDF 阅读器导入生成xfdf即可完成注释CRF



%AutoaCRF(inpath=D:\studies\SAS开发\1.半自动化注释CRF\Exm\注释CRF模板.xlsx
        ,outpath=D:\studies\SAS开发\1.半自动化注释CRF\Exm\Exm_aCRF.xfdf
        ,BlackCRF=Exm_aCRF.PDF);

________________________________________________________________________________________________________________________

__________________________________________________________________________________________________________________________
版本     日期           修改人             修改描述
---     -----------    ------------     ----------------------------------------------------------------------------------
1.0     2022.02.21      Setup          创建
****************************************************************************************************************************************/

%macro AutoaCRF(inpath=
        ,outpath=
        ,BlackCRF=);


proc import out = havetemp01
    datafile = "&inpath."
    dbms = excel replace;
    range = "Sheet1$";
    dbdsopts = "firstobs=1";
run;

data head;
length text $20000.;
text='<?xml version="1.0" encoding="UTF-8"?><xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve"><annots>';
run;
data end;
length text $20000.;
text='</annots><ids original="AutoaCRF" modified="AutoaCRF"/></xfdf>';


%if %length(&BlackCRF) %then %do;
text='</annots><f href="'||"&BlackCRF."||'"/><ids original="AutoaCRF" modified="AutoaCRF"/></xfdf>';
%end;

run;

data havetemp01;
    set havetemp01;
       _COL2=tranwrd(tranwrd(tranwrd(tranwrd(tranwrd(_COL2,'&','&amp;'),'>','&gt;'),'<','&lt;'),'"','&quot;'),"'",'&apos;');
/*     _COL5 ;_COL6;*/
     XY=_COL5;
run;

data havetemp02;
  set havetemp01;
  if ^missing(_COL2) and ^missing(_COL3);
  length text text1 $20000.;
  SID=compress(strip(RANUNI(_n_)));
  datetime=compress(put(today(),yymmdd10.),'-')||compress(put(time(),time8.),':');
  text=strip('<freetext width="1" date="D:'||strip(datetime)||'" name="'||strip(SID)||'" ' )||' color="'||strip(_COL3)||'" page="'||strip(_COL0)||'" rect="'||strip(XY)||'" subject="AutoaCRF" title="AutoaCRF">';
  if _COL1="域" or upcase(_COL1)="DOMAIN" then do;
  text1='<contents-richtext><body xmlns="http://www.w3.org/1999/xhtml" xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/" xfa:APIVersion="Acrobat:11.0.7" xfa:spec="2.0.2" style="font-size:16.0pt;text-align:center;color:#000000;font-weight:bold;font-style:italic;font-family:Arial;font-stretch:normal"><p dir="ltr"><span>'||strip(_COL2)||'</span></p></body></contents-richtext><defaultappearance>0 0 0 rg</defaultappearance><defaultstyle>font: Helvetica,sans-serif 12.0pt; text-align:left; color:#000000 </defaultstyle></freetext>';
  end;

  else do;
    text1='<contents-richtext><body xmlns="http://www.w3.org/1999/xhtml" xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/" xfa:APIVersion="Acrobat:11.0.0" xfa:spec="2.0.2" style="font-size:10.0pt;text-align:left;color:#FF0000;font-weight:bold;font-style:italic;font-family:Arial;font-stretch:normal"><p dir="ltr">'||strip(_COL2)||'</p></body></contents-richtext><defaultappearance>0 0 0 rg /Arial,BoldItalic 10 Tf</defaultappearance><defaultstyle>font: italic bold Arial,sans-serif 10.0pt; text-align:left; color:#000000 </defaultstyle></freetext>';
  end;
  text=strip(text)||strip(text1);
  keep text;

run;

data final;
  set head havetemp02 end;
run;
data _null_;
   set final;
   file "&outpath." lrecl=20000   encoding=utf8;;
   put text ;
run;
%mend;

%AutoaCRF(inpath=D:\studies\SAS开发\1.半自动化注释CRF\Exm\注释CRF模板.xlsx
        ,outpath=D:\studies\SAS开发\1.半自动化注释CRF\Exm\Exm_aCRF.xfdf
        ,BlackCRF=Exm_aCRF.PDF);
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SAS程序分享号号号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档