open pdf file in c# web application : How to add text to pdf SDK software service wpf windows winforms dnn 031-20080-part85

1
Paper 031-2008
PROC REPORT:
Compute Block Basics – Part I Tutorial
Arthur L. Carpenter
California Occidental Consultants
ABSTRACT
One of the unique features of the REPORT procedure is the Compute Block.  Unlike most other SAS procedures, PROC
REPORT has the ability to modify values within a column, to insert lines of text into the report, to create columns, and to
control the content of a column.  Through compute blocks it is possible to use a number of SAS language elements, many
of which can otherwise only be used in the DATA step.  
While powerful, the compute block can also be complex and potentially confusing.  This tutorial introduces basic compute
block concepts, statements, and usages.  It discusses a few of the issues that tend to cause folks consternation when first
learning how to use the compute block in PROC REPORT.
This paper is being presented in conjunction with the Hands-on Workshop PROC REPORT: Compute Block Basics –Part
II Practicum (Paper 188-2008)
KEYWORDS
PROC REPORT, Compute Block, LINE,  Report Row Phase
INTRODUCTION
While the topic of compute blocks in the REPORT step is not particularly difficult or advanced, the discussion of compute
blocks must necessarily assume that the reader has a basic understanding of the REPORT step itself.  In the discussion
that follows, an understanding of the COLUMN, DEFINE, BREAK, and RBREAK statements and their relationships to each
other is assumed.  The reader should also be aware of the different define usages of report items.
There are two basic types of compute blocks; those that are associated with a location (the option BEFORE or AFTER
follows the COMPUTE keyword), and those associated only with a report item.  While the structure and execution of these
two types of compute blocks is similar, how they are used and the timing of their execution can be quite different.
The compute block starts with the COMPUTE statement and terminates with the ENDCOMP statement.  Usually the
compute block is placed in the REPORT step after the DEFINE statements.  The syntax of the compute block looks
something like:
compute <location> <report_item> </ options>;
one or more SAS language elements
endcomp;
The components of the COMPUTE statement include:
location
Specifies when the compute block is to execute and ultimately what is to be done with the result of
the compute block.  Accepted values include BEFORE and AFTER.  When a location is specified
without also specifying a report_item , the location will be at the start (BEFORE) or at the end
(AFTER) of the report.
report_item
When the result of the compute block is associated with a variable or report item, its name is
supplied here.  This report_item  variable can be any variable on the COLUMN statement.  When
report_item is a variable that either groups or orders rows (usage of GROUP or ORDER) you may
also use BEFORE and AFTER to apply the result at the start or end of each group. 
Beyond the Basics
SAS Global Forum 2008
08
8
How to add text to pdf - insert text into PDF content in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
XDoc.PDF for .NET, providing C# demo code for inserting text to PDF file
how to add text field to pdf; add text to pdf document online
How to add text to pdf - VB.NET PDF insert text library: insert text into PDF content in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Providing Demo Code for Adding and Inserting Text to PDF File Page in VB.NET Program
how to add text field to pdf form; adding text to a pdf document acrobat
2
Using Proc REPORT
Blank Line After Region
weight in pounds
region  Gender          n       mean
1       M               4        195
2       F               6  109.66667
M               4        105
3       F               5      127.8
M               5      163.8
4       F               4        143
M              10      165.6
The LINE statement has
been used to insert a blank
line AFTER each regional
group.
options
Several options are available that can be used to determine the appearance and location of the
result of the compute block.
SAS language elements
Any number of SAS language elements can be used within the compute block.  These include the
use of executable statements, logical processing (IF-THEN/ELSE), and most of the functions
available in the DATA step.
The compute block can be placed anywhere within the REPORT step, however generally compute blocks are grouped
following the DEFINE statements.
USING THE LINE STATEMENT
One of the more interesting programming statements within the compute block is the LINE statement.  This statement is
roughly analogous to the PUT statement in the DATA step and can be used to introduce lines of text into the report.
Inserting a Blank Line
In the following example a blank line has been inserted AFTER each level of the grouping variable (REGION). 
* Blank Line using COMPUTE;
title1 'Using Proc REPORT';
title2 'Blank Line After Region';
proc report data=rptdata.clinics
(where=(region in('1' '2' '3' '4'))) 
nowd;
column region sex wt,(n mean);
define region / group format=$6.;
define sex    / group format=$6. 'Gender';
define wt     / analysis;
compute after region;
line ' ';
endcomp;
run;
Because the COMPUTE statement contains the location specification AFTER and also designates the report item
REGION, we have effectively requested that the results of the compute block (a blank space) be written after each group
of the grouping variable REGION.
Adding Lines of Text
In the previous example the LINE statement added a blank line, the LINE statement is more commonly used to add lines of
text at specific locations in the report.  
Beyond the Basics
SAS Global Forum 2008
08
8
C# PDF insert image Library: insert images into PDF in C#.net, ASP
C#.NET PDF SDK - Add Image to PDF Page in C#.NET. How to Insert & Add Image, Picture or Logo on PDF Page Using C#.NET. Add Image to PDF Page Using C#.NET.
add text pdf acrobat; add editable text box to pdf
VB.NET PDF insert image library: insert images into PDF in vb.net
try with this sample VB.NET code to add an image As String = Program.RootPath + "\\" 1.pdf" Dim doc New PDFDocument(inputFilePath) ' Get a text manager from
how to enter text into a pdf; acrobat add text to pdf
3
Using Proc REPORT
Footnote Using LINE
weight in pounds
region  Gender          n       mean
1       M               4        195
2       F               6  109.66667
M               4        105
3       F               5      127.8
M               5      163.8
4       F               4        143
M              10      165.6
Weight taken during
the entrance exam.
This report was generated
with the system option
NOCENTER in effect
(notice the titles).  Even so
the results of the LINE
statement will be centered
unless a column
specification is provided.
In the following example the text is written as a footnote at the end of the report.  We can specify the options BEFORE and
AFTER to indicate the location, and since in this case no grouping variable appears on the COMPUTE statement, the
AFTER applies to the whole REPORT.
* Text Line using COMPUTE;
title1 'Using Proc REPORT';
title2 'Footnote Using LINE';
proc report data=rptdata.clinics
(where=(region in('1' '2' '3' '4'))) 
nowd;
column region sex wt,(n mean);
define region / group format=$6.;
define sex    / group format=$6. 'Gender';
define wt     / analysis;
compute after region;
line ' ';
endcomp;
compute after;
line @20 'Weight taken during';
line @20 'the entrance exam.';
endcomp;
run;
In these LINE statements the @ is used, as it is in the DATA step PUT statement, to designate the column number.   If a
specific column is not specified with the @, and no justification options are specified, text generated by the LINE statement
will be centered.  This is a different default behavior than the PUT statement in the DATA step.
When writing to ODS destinations other than LISTING, proportional fonts may make exact placement of values difficult,
and may require you to use a trial-and-error approach, and to make things more interesting some destinations ignore the
@ altogether. 
Writing Formatted Values
Formatted variable values can be placed on the report using the LINE statement, and these values can be placed
BEFORE or AFTER each group.  In the following example the user defined format $REGNAME provides a text name for
the first four regions.  These names are than added to the report through the use of a LINE statement and a compute
block. 
proc format;  
value $regname
Beyond the Basics
SAS Global Forum 2008
08
8
VB.NET PDF Password Library: add, remove, edit PDF file password
VB: Add Password to PDF with Permission Settings Applied. This VB.NET example shows how to add PDF file password with access permission setting.
add text pdf acrobat professional; how to insert text in pdf using preview
C# PDF Password Library: add, remove, edit PDF file password in C#
C# Sample Code: Add Password to PDF with Permission Settings Applied in C#.NET. This example shows how to add PDF file password with access permission setting.
adding text to pdf file; how to add text to a pdf in acrobat
4
Three compute blocks
are used to generate the
three types of text.  A
formatted region name
BEFORE each region
ì
, a blank line after
each region summary 
í
,
and footnote text at the
end of the report 
î
.
'1' = 'New England'  
'2' = 'New York'
'3' = 'Maryland' 
'4' = 'South East'; 
run;
* Text Line using COMPUTE;
title1 'Using Proc REPORT';
title2 'Formatted Values';
footnote1 'at the bottom';
proc report data=rptdata.clinics(where=(region in('1' '2' '3' '4'))) 
nowd;
column region sex wt,(n mean);
define region / group format=$6.;
define sex    / group format=$6. 'Gender';
define wt     / analysis;
compute before region;
line @3 region $regname8.; ì
endcomp;
compute after region;
line ' '; í
endcomp;
compute after; 
line @20 'Weight taken during'; î
line @20 'the entrance exam.';
endcomp;
run;
The format $REGNAME could have also been used in the DEFINE statement, however in this case we wanted to show the
unformatted value as well as the formatted group header.
USING SAS LANGUAGE ELEMENTS
Much of the power of the DATA step is available within the compute block.  This radically increases the flexibility of the
REPORT step as most of the SAS language elements, such as, routines, functions, arithmetic operations, and executable
Using Proc REPORT
Formatted Values
weight in pounds
region  Gender          n       mean
New England ì
1       M               4        195
New York
2       F               6  109.66667
M               4        105
í
Maryland
3       F               5      127.8
M               5      163.8
South East
4       F               4        143
M              10      165.6
Weight taken during î
the entrance exam.
Beyond the Basics
SAS Global Forum 2008
08
8
VB.NET PDF Text Extract Library: extract text content from PDF
With this advanced PDF Add-On, developers are able to extract target text content from source PDF document and save extracted text to other file formats
how to add text fields in a pdf; adding text fields to pdf
C# PDF Text Extract Library: extract text content from PDF file in
How to C#: Extract Text Content from PDF File. Add necessary references: RasterEdge.Imaging.Basic.dll. RasterEdge.Imaging.Basic.Codec.dll.
how to add text box in pdf file; add text box in pdf
5
The label for the variable
WT contains the units
(pounds), so a new
column header is also
required.
Using Proc REPORT
Converting Weight to Kg
first           Weight
last name   name    Gender   in Kg
Halfner     John    M        70.45
Johnson     Randal  M        91.36
Rodgers     Carl    M        81.36
Cordoba     Juan    M        60.45
Baron       Roger   M        72.73
Adams       Mary    F        70.45
Rymes       Carol   F        59.55
Most        Mat     M        70.45
Jackson     Ted     M        91.36
Maxim       Kurt    M        81.36
Perez       Mathew  M        60.45
East        Clint   M        72.73
Batell      Mary    F        70.45
Rumor       Stacy   F        59.55
statements can also be used within the compute block.  These include DO loops, assignment and sum statements,
ARRAYs, and IF-THEN/ELSE processing.  
Most of the functions and routines that do not work in the compute block are those that utilize either the DATA step’s
Program Data Vector, PDV, or the processing of the DATA step itself.  Examples include the LAG function and the
RETAIN statement.  As was already discussed, the LINE statement replaces the PUT. 
The use of %INCLUDE statements, macro variables, and macro invocations work the same in compute blocks as they do
in other parts of SAS.  In the case of %INCLUDE statements and elements of the macro language, it is less a matter of
these items working in a compute block, and is more accurately simply a property of Base SAS and how these elements
apply to all procedures.
The following example demonstrates, in a simple way, some of this power.  This compute block performs a transformation
of weight from pounds to Kilograms.  The conversion is done in a compute block with the same name as the variable
(report item) that is being modified.  The assignment statement in the compute block is of the same form as you would
expect to find in the DATA step.
title1 'Using Proc REPORT';
title2 'Converting Weight to Kg';
proc report data=rptdata.clinics(where=(region in('4'))) 
nowd;
column lname fname sex wt;
define lname  / display;
define fname  / display;
define sex    / display format=$6. 'Gender';
define wt     / display 'Weight in Kg'
format=6.2;
compute wt;
* Convert pounds to KG;
wt = wt/2.2;
endcomp;
run;
Beyond the Basics
SAS Global Forum 2008
08
8
VB.NET PDF Text Add Library: add, delete, edit PDF text in vb.net
How to VB.NET: Add Text to PDF Page. Add necessary references: This is a piece of VB.NET demo code to add text annotation to PDF page.
how to insert text in pdf using preview; how to insert text into a pdf with acrobat
C# PDF Text Add Library: add, delete, edit PDF text in C#.net, ASP
A best PDF annotation SDK control for Visual Studio .NET can help to add text to PDF document using C#. C#.NET Demo Code: Add Text to PDF Page in C#.NET.
how to add text to a pdf file in acrobat; add text to pdf
6
REPORT ITEM NAMING RULES
When coding within the compute block, report items and temporary variables will need to be addressed.  How they are
addressed or named in the compute block depends on what the report item is and how it is being used.  There are four
different ways of naming report items within a compute block.
Explicitly by Name
While you can have a compute block for any report item (variable on the COLUMN statement), the naming conventions of
the report items that are addressed within the compute block are not nearly as straight forward as they would seem to be in
the previous two examples.  These are about the simplest cases in which the name of the column is used directly
(explicitly).
The variable name can be used directly when the variable has a define type of GROUP, ORDER, COMPUTED, or
DISPLAY.  Temporary variables, variables that are created and only used in a compute block, are also always addressed
directly by variable name.
The REPORT step also creates an automatic temporary variable named _BREAK_.  This variable is also addressed
directly and is available during the execution of the compute block. 
Using a Compound Name
Compound variable names are needed, when a variable has a define usage of ANALYSIS.  Whether requested or not, a
statistic is always calculated for analysis variables.  The compound name is a combination of the variable name and the
statistic that it has been used to calculate.  The general form is variablename.statistic, and an example of a compound
name might be:
wt.mean
When a statistic is not otherwise specified it is assumed to be SUM.
By Specifying an Alias
An alias can be specified in the COLUMN statement when you want to use a single analysis variable in more than one way
- generally to calculate more than one statistic.  When used in a compute block, aliases are named explicitly. The following
COLUMN statement generates a series of aliases for the HT analysis variable.
columns region ht ht=htmin  ht=htmax 
ht=htmean ht=htmedian;
In the compute block the alias is addressed directly as in:
compute after;
line @3 'Minimum height is ' htmin 6.1;
endcomp;
Indirectly Using the Absolute Column Number
Sometimes as the report is constructed a given column may not have a specific name.  This is especially the case when a
variable, with the define type of ACROSS, creates a series of columns.  These, and indeed any column in the report, can
be referenced by using the absolute column number as an indirect column reference.  This column number is included in a
pseudo variable name which is always of the form
_Cxx_
where the 
xx
is the column number as read from left to right on the report.  Keep in mind that the column count includes
any columns that may ultimately not be printed e.g. those columns defined with NOPRINT or NOZERO.
In the following example SEX is an across variable with WT nested within each distinct value of SEX.  With REGION as
Beyond the Basics
SAS Global Forum 2008
08
8
VB.NET PDF Text Box Edit Library: add, delete, update PDF text box
VB.NET PDF - Add Text Box to PDF Page in VB.NET. Add Annotation – Add Text Box Overview. Adding text box is another way to add text to PDF page.
adding text pdf file; how to add text to pdf
7
Mean Weight in Kg
patient Sex
F       M
region  Weight  Weight
1          .     88.64
10       33.68   80.45
2        22.66   47.73
3        26.40   74.45
4        29.55   75.27
5        30.21   80.45
6        38.64   93.33
7          .     68.64
8        72.73     .
9        36.57   86.59
In the compute block
_C2_ refers to the mean
weight of females, while
_C3_ refers to the mean
weight of males.  The
order is based on the
ORDER= option which
has a default value of
INTERNAL.
the only other variable in the COLUMNS statement, WT appears in _C2_ and _C3_.
Title1 'Mean Weight in Kg';
proc report data=sasclass.clinics nowd;
columns region sex,wt;
define region / group f=$6.;
define sex / across '  patient Sex';
define wt / mean 'Weight' f=6.2;
compute wt;
_c2_ = _c2_/2.2;
_c3_ = _c3_/2.2;
endcomp;
run;
COMPUTE BLOCK EVENT SEQUENCING
An understanding of the sequencing of events when processing a REPORT step become even more important when the
step includes one or more compute blocks.
When you have multiple compute blocks they can appear in any order in your REPORT step.  The order that you include
the blocks does not effect when they are executed.  I usually try to group my compute blocks after my BREAK and
RBREAK statements, and I also try to order them nominally in the same order as they will execute.  This arrangement
helps me with my coding, but does not change how the compute blocks work.
Report Step Phases
The REPORT step executes in three distinct phases.  Having at least a passing understanding of these phases helps the
compute block programmer understand why some things work while others do not.
Evaluation Phase
REPORT begins by evaluating all of the REPORT step statements. If any compute blocks are present the SAS
language elements and LINE statements are set aside for later.
Setup Phase
Next, after the statements have been evaluated, the Setup Phase uses the MEANS/SUMMARY engine to sort the
input data for ORDER and GROUP variables and computes any summarizations.  When summarizations or
statistics are calculated, the results are held in the computed summary information which is stored in memory.
Report Row Phase
In this phase, REPORT builds each report row using data from the input data set and/or, when needed, the
computed summary information. If any compute blocks are present they are executed during this phase. REPORT
sends each completed row (one row at a time) to all the ODS destinations (LISTING, PDF, etc.) that are currently
open.
Beyond the Basics
SAS Global Forum 2008
08
8
8
Compute Block Events
As the report is generated (one row at a time - top to bottom and left to right - during the report row phase), the various
compute blocks are executed at the appropriate time.  Remember that compute blocks are tied both vertically and
horizontally to locations in the report, and the location controls the timing of when the compute block will be executed. 
These ties are specified on the COMPUTE statement.  Vertical ties are established by using the timing options BEFORE
and AFTER, and horizontal ties are made by the specification of report items in the COLUMN statement.
When a compute block is tied to a specific report item (like a variable name) on the COLUMN statement, it will be executed
for each report row. The execution will take place when REPORT processes that specific column, and any given row is
processed from left to right based on the order of the items on the COLUMN statement.  In the following step, because
SEX is to the left of WEIGHT on the COLUMN statement, the compute block for SEX will be executed before the compute
block for WEIGHT. 
proc report .......;
column region sex weight;
.....
compute weight;
.....
endcomp;
compute sex;
.....
endcomp;
.....
run;
Although it would make no difference to the processing of the step, I would reorder the code to place the compute blocks in
the order that they will be processed.  The step would become:
proc report .......;
column region sex weight;
.....
compute sex;
.....
endcomp;
compute weight;
.....
endcomp;
.....
run;
Compute blocks that are defined with BEFORE or AFTER on the COMPUTE statement will be executed at the time that
the specified event takes place.  When BEFORE or AFTER appears on the COMPUTE statement and there is no report
item, the compute block will be executed only once - BEFORE or AFTER the report. 
Including a BEFORE or AFTER on a compute statement is sufficient to generate a row in the computed summary
information during the setup phase.  That report row may or may not be written out to the final report depending on the
BREAK and RBREAK specifications.  In either case as the report rows are processed during the report row phase, the
compute block is executed as its associated report row is processed. 
The COMPUTE BEFORE statement
compute before;
will generate what will be the first row in the computed summary information, while the COMPUTE AFTER statement
compute after;
would generate the last row in the computed summary information and would be the last compute block to execute.
Beyond the Basics
SAS Global Forum 2008
08
8
9
When you have a report item that is a grouping/ordering variable, you can specify the COMPUTE statement with both the
BEFORE/ AFTER and the report item.   This allows you to execute the compute block when values of the grouping
variable change.  The processing opportunities are roughly similar to FIRST. and LAST. processing in the DATA step.  The
following COMPUTE statement sets up a compute block that will be executed just before each new value of REGION.
compute before region;
It is not at all unusual to have compute blocks that execute both BEFORE and AFTER in the same REPORT step. 
Compute blocks that execute before the report or group are very useful for initializing variables, while compute blocks that
execute after the report or group are more generally used for summaries.
Using a compute block with a BEFORE or AFTER does not require a corresponding BREAK or RBREAK statement. 
However when both are present in the same step the compute block and its corresponding BREAK or RBREAK statement
share a common row in the computed summary information.  Remember that the compute block itself does not transfer
information to the report (unless it contains a LINE statement).  The compute block can be used to modify information on
the computed summary information, and if there is a corresponding BREAK/RBREAK statement with a SUMMARIZE
option then that information can also be written to the final report.
CREATING AND MODIFYING COLUMNS
One of the great strengths of PROC REPORT is its ability to create columns based on calculations carried out during the
execution of the procedure.  Columns that are not on the incoming data set can be created and displayed within the PROC
REPORT step.  Often this can eliminate one or more DATA steps.  The compute block provides the power and flexibility to
mold the column in a variety of ways. 
Compute blocks can be used to create both numeric and character variables, and an extensive number of the SAS
language elements that give the DATA step much of its power and functionality are also available for use in the compute
block. 
Coordinating with the COLUMN and DEFINE Statements
Variables on the data set that is to be processed by PROC REPORT are named on the COLUMN statement and the way
that these variables are to be used is specified on the DEFINE statement.   This is also true for report item columns
created through the use of the compute block.  In addition, the name of the computed variable will also appear on the
COMPUTE statement.  
When a column is created through a compute block, the new column is named and that column name is used on both the
COLUMN statement and on a DEFINE statement.  Since a new column with have a define usage of COMPUTE, it cannot
also be a grouping or order variable, therefore the BEFORE/AFTER locations cannot be specified on the COMPUTE
statement.  Since the name of the computed report item will appear on the COLUMN, DEFINE, and COMPUTE
statements, it is this name that is used to create and coordinate the link between the three statements.
In the following example the patients weights are to be displayed in both pounds and kilograms (the earlier example
converts to kilograms without creating a new column).  Since the units for the variable WT are in pounds, a new column
containing the weight in kilograms will need to be created.  This is accomplished in a compute block which creates the
computed variable WTKG. 
* Creating a new column with a compute block;
title1 'Using The COMPUTE Block';
title2 'Adding a Computed Column';
proc report data=rptdata.clinics nowd split='*';
column lname sex (' Weight *--' wt wtkg); ì
define lname   / order   width=18 'Last Name*--';
define sex     / display width=6  'Gender*--';
define wt      / display format=6. 'Pounds*--';
define wtkg í  / computed î format=9.2 'Kilograms*--';
compute wtkg; ï
wtkg = wt / 2.2; ð
endcomp; ñ
Beyond the Basics
SAS Global Forum 2008
08
8
10
Using The COMPUTE Block
Adding a Computed Column
Weight
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
Last Name           Gender  Pounds  Kilograms
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ  ƒƒƒƒƒƒ  ƒƒƒƒƒƒ  ƒƒƒƒƒƒƒƒƒ
Adams               F          155      70.45
Adamson             F          158      71.82
Alexander           M          175      79.55
Antler              M          240     109.09
Atwood              M          105      47.73
Banner              M          175      79.55
Baron               M          160      72.73
Batell              F          155      70.45
. . . . portions of the table not shown . . . .
run;
ì
The name (WTKG) for the new column is added
to the COLUMN statement.
í
The DEFINE statement associated with the new
column (WTKG) has a define type of COMPUTED
î
.
ï
The COMPUTE statement contains the name of
the computed variable.
ð
The new variable (WTKG) is calculated by
dividing the weight (WT) in pounds by 2.2.
ñ
Compute blocks are terminated with an
ENDCOMP statement.
The resulting table shows both the weight in
pounds and kilograms.
Calculations Based on Statistics
In the previous example explicit names were used for the variables in the compute block.  WT had a usage of DISPLAY,
and WTKG was computed.  In the following example the mean for each region is calculated and it is from this mean that
we create a column in Kilograms.  Since statistics are being calculated, WT must by necessity have a define usage of
ANALYSIS.  This means that a compound column name (WT.MEAN 
í
) is used in the compute block.
* Calculations based on statistics;
title1 'Using The COMPUTE Block';
title2 'Calculations Based on a Statistics Column';
proc report data=rptdata.clinics nowd split='*';
column region (' Weight *--' wt wtkg);
define region  / group   width=7 
'Region*--';
define wt      / analysis mean 
format=8.1 
'Pounds*--'; ì
define wtkg    / computed format=9.2 
'Kilograms*--';
compute wtkg;
wtkg = wt.mean / 2.2; í
endcomp;
run;
ì
The mean weight (in pounds) is calculated for WT across the group variable (REGION).
í
The weight in Kilograms is calculated by converting it from the mean weight in pounds.  Notice that the compound name,
WT.MEAN reflects the calculated statistic (in pounds).
Beyond the Basics
SAS Global Forum 2008
08
8
Documents you may be interested
Documents you may be interested