devexpress pdf viewer control asp.net : Delete pages from pdf reader application SDK cloud html winforms azure class 045-300-part96

Paper 45-30 
A Matter of Presentation: Generating PowerPoint Slides from  
Base
®
SAS using Dynamic Data Exchange 
Koen Vyverman, SAS Netherlands  
ABSTRACT 
The creation of PowerPoint slides with SAS content using DDE in a Base SAS environment has long been 
considered impossible. Unlike MS Word and MS Excel, the PowerPoint application does not come with a scripting 
language like WordBasic or the Excel 4 macro language that would allow DDE to talk to it in a client/server fashion. 
The job can be done, though, by using DDE to Excel as an intermediate agent to pull the strings of PowerPoint. A set 
of easy SAS macros is introduced to perform a number of basic PowerPoint operations. As a sample application, a 
SAS catalog of graphs is exported to a stand-alone PowerPoint presentation. No specific technical knowledge is 
required from the reader, at least not beyond a basic understanding of the SAS macro language. A slight degree of 
familiarity with DDE to Excel concepts should prove enlightening, though.  
INTRODUCTION 
Quite a lot has been published already about interacting with MS Excel workbooks and MS Word documents from 
SAS by using the DATA step and Dynamic Data Exchange (DDE): the TS325 document (SAS Institute, 1999) offers 
a general introduction; a SUGI (Vyverman, 2002) and a SESUG (Vyverman 2003) paper dive into the depths of DDE 
from/to Excel; another SUGI paper (Viergever & Vyverman, 2003) explores the wonderful world of Word via DDE; 
and an intriguing applications development paper (Vyverman, 2005) (in these SUGI 30 proceedings) focuses more 
on certain practical applications of DDE, rather than on the technical aspects. So all this time, the missing part of the 
MS Office puzzle has been the PowerPoint application. 
Why has no one ever written a paper about DDE and PowerPoint? Because the PowerPoint application is not DDE-
compliant. Word has the old WordBasic scripting language, Excel still recognizes the Excel 4.0 macro language 
(X4ML), and both are precursors to the later Visual Basic macro language in the MS Office suite. Both Word and 
Excel can accept commands from SAS via a DDE fileref. Unfortunately, PowerPoint has no similar tools for 
applications developers, and so it was long assumed that creating PowerPoint slides straight from a piece of SAS 
code was impossible. 
As you can see from this paper, with a little tinkering, you can create a workaround. Like most workarounds, it is not 
very aesthetically pleasing, but it works: PowerPoint slides with SAS content can be created from a Base SAS 
program. The trick is to talk from SAS to the Excel application via DDE and include PUT statements that cause Excel 
to send the necessary keystrokes to the PowerPoint application. 
This paper takes you through a small, yet practical, example of this workaround. First, we set up some data and 
graphics, and then we start up Excel and PowerPoint from SAS. Finally, we present a DATA step with PUT 
statements and explain, step-by-step, how the appropriate keystrokes are sent from Excel to PowerPoint.  
The example code was developed and tested on a Microsoft Windows 2000 Professional operating environment, 
running SAS 9.1 in conjunction with MS Office 2000, English version. The language is significant: Excel and 
PowerPoint keystrokes might vary with different languages and different versions of the software. This paper merely 
explains the concept. You might need to modify the code for your operating environment. For more information about 
DDE, see the introductory parts of the paper (Vyverman, 2002). 
THE PROBLEM 
A common topic on the SAS-L mailing list is this: how to generate business graphs and charts in SAS and 
automatically put them into PowerPoint slides. The usual advice is to create the presentation in PowerPoint and give 
links to the images (that is, to the charts you already output from SAS or to blank placeholders). When you generate 
new charts with SAS, you overwrite the previous files with identically named files, and the next time the presentation 
is opened, the new images appear. This works fine if the number of charts in the presentation is always the same. If 
not, further manual work on the presentation is required, either to remove unused slides or to add slides. The 
challenge is to automate the PowerPoint presentation from SAS and eliminate most of the manual work in 
PowerPoint.   
Coders' Corner
SUGI 30
0
Delete pages from pdf reader - copy, paste, cut PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Easy to Use C# Code to Extract PDF Pages, Copy Pages from One PDF File and Paste into Others
acrobat extract pages from pdf; add remove pages from pdf
Delete pages from pdf reader - VB.NET PDF Page Extract Library: copy, paste, cut PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Detailed VB.NET Guide for Extracting Pages from Microsoft PDF Doc
extract pages from pdf; delete pages out of a pdf file
PREPARATIONS TO EXPORT SAS GRAPHICS TO POWERPOINT 
To prepare for our example, we create a SAS catalog that contains a number of GRSEG entries, export those entries 
to JPEG images, start Excel from SAS, and start PowerPoint from SAS. 
DATA PREPARATIONS 
For starters, we create a small data set as follows: 
data wine_consumption; 
length 
year           8 
grape       $ 10 
consumption    8 
label 
year='Year' 
grape='Grape' 
consumption='Consumption' 
infile datalines4 dlm='#'; 
input 
year        :8. 
grape       :$char10. 
consumption :8. 
datalines4; 
2002 #Shiraz      #  9 
2002 #Zinfandel   # 18 
2002 #Chardonnay  #  6 
2003 #Shiraz      # 10 
2003 #Zinfandel   # 16 
2003 #Chardonnay  #  8 
2004 #Shiraz      # 10 
2004 #Zinfandel   #  9 
2004 #Chardonnay  # 15 
;;;; 
run; 
For three consecutive years, the data set WORK.WINE_CONSUMPTION lists the number of bottles imbibed for three 
types of grapes. We then produce a bar chart for each year, with the grape type as categories on the horizontal axis: 
proc sort data=wine_consumption; 
by year; 
run; 
proc gchart data=wine_consumption 
gout=work.sasgraphs 
by year; 
vbar grape / sumvar=consumption 
sum 
discrete 
autoref 
clipref 
frame 
missing 
name="graph" 
width=20 
coutline=black; 
run; 
quit; 
Coders' Corner
SUGI 30
0
VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
doc.Save(outPutFilePath). How to VB.NET: Delete Consecutive Pages from PDF. doc.Save(outPutFilePath). How to VB.NET: Delete Specified Pages from PDF.
cut pages from pdf; delete page from pdf file
C# PDF Page Delete Library: remove PDF pages in C#.net, ASP.NET
doc.Save(outPutFilePath); Demo Code: How to Delete Consecutive Pages from PDF in C#.NET. Demo Code: How to Delete Specified Pages from PDF in C#.NET.
cut pages out of pdf; copy pdf page to powerpoint
This produces three GRSEG entries in a SAS/GRAPH catalog, WORK.SASGRAPHS. The entries are GRAPH (2002 
data), GRAPH1 (2003 data), and GRAPH2 (2004 data). We turn these entries into JPEG files with the following code: 
goptions 
reset=all 
border 
device=jpeg 
gaccess=gsasfile 
xpixels=950 
ypixels=550 
cback=cxfff7ce 
proc greplay nofs igout=work.sasgraphs; 
filename gsasfile 'D:\Koen\SAS\SUGI30 Paper Corders Corner\Pictures\2002.jpg'; 
replay graph; 
run; 
filename gsasfile clear; 
filename gsasfile 'D:\Koen\SAS\SUGI30 Paper Corders Corner\Pictures\2003.jpg'; 
replay graph1; 
run; 
filename gsasfile clear; 
filename gsasfile 'D:\Koen\SAS\SUGI30 Paper Corders Corner\Pictures\2004.jpg'; 
replay graph2; 
run; 
filename gsasfile clear; 
quit; 
EXCEL PREPARATIONS 
Because DDE is a client/server protocol, the Excel application must be running. We start Excel with the method 
introduced by Roper (2000): 
options 
noxsync 
noxwait 
xmin 
filename sas2xl dde 'excel|system'; 
data _null_; 
length fid rc start stop time 8; 
fid=fopen('sas2xl','s'); 
if (fid le 0) then do; 
rc=system('start excel'); 
start=datetime(); 
stop=start+10; 
do while (fid le 0); 
fid=fopen('sas2xl','s'); 
time=datetime(); 
if (time ge stop) then fid=1; 
end; 
end; 
rc=fclose(fid); 
run; 
Now, we must define a macro that will be called later. While troubleshooting some errors, we found a critical point—
right after activating the PowerPoint application from Excel—where it is necessary to briefly pause Excel before it is 
safe to begin sending keystrokes. We don't know why a pause is needed, but if it is not done, nothing works.  
To achieve a one-second pause, we define a fairly trivial Excel macro. First, we add an old-style X4ML macro sheet 
to the DDE fileref SAS2XL: 
Coders' Corner
SUGI 30
0
C# PDF File & Page Process Library SDK for C#.net, ASP.NET, MVC
VB.NET Page: Insert PDF pages; VB.NET Page: Delete PDF pages; VB.NET Annotate: PDF Markup & Drawing. XDoc.Word for XImage.OCR for C#; XImage.Barcode Reader for C#
convert selected pages of pdf to word online; delete pages from pdf acrobat
C# PDF Page Insert Library: insert pages into PDF file in C#.net
how to merge PDF document files by C# code, how to rotate PDF document page, how to delete PDF page using C# .NET, how to reorganize PDF document pages and how
add and remove pages from pdf file online; extract pages from pdf file online
data _null_; 
file sas2xl; 
put '[error(false)]'; 
put '[workbook.insert(3)]'; 
run; 
The default name of the inserted macro sheet is Macro1. We define a cell range on the Macro1 sheet as a DDE 
triplet-style fileref xlmacro, and write the code there for the macro to pause Excel: 
filename xlmacro dde "excel|macro1!r1c1:r10c1" notab lrecl=200; 
data _null_; 
file xlmacro; 
put '=wait(now()+"00:00:01")'; 
put '=halt(true)'; 
run; 
filename xlmacro clear; 
We determined the one-second waiting period by trial-and-error. Conceivably, a longer pause might be necessary in 
your operating environment. If you get any errors, you can try modifying the above to 00:00:05 or more. 
POWERPOINT PREPARATIONS 
Finally, we start the PowerPoint application: 
data _null_; 
rc=system('start powerpnt'); 
rc=sleep(2); 
run; 
Here, powerpnt is the name of the PowerPoint executable file, as installed in C:\Program Files\Microsoft 
Office\Office. The SAS session is put to sleep for two seconds, to allow PowerPoint to start up. As before, it might be 
necessary to increase the number of seconds. Also, observe that you cannot use the elegant Roper method here: 
PowerPoint is not a DDE-compliant server, so it will not trigger an escape from the Roper DO WHILE loop after it 
has been successfully launched. This is a bit of a pain, forcing us to revert to the old method of putting the SAS 
session to sleep for a while. The Roper method would actually work in terms of firing up PowerPoint, but the DO 
WHILE loop would continue executing until the maximum waiting time has elapsed. So you’re better off determining 
an optimal SLEEP value by means of a few trials. 
For this example, we performed an additional, one-time step in PowerPoint. We created a custom template, 
'Template for Graphics Catalog.pot', with fewer text boxes than the default templates. This reduces the lines of SAS 
code needed to demonstrate the technique. 
EXCEL X4ML KEYSTROKES FOR POWERPOINT 
With the SAS data and graphics ready, and with Excel and PowerPoint ready for directions, we can make Excel talk 
to PowerPoint. Each SEND.KEYS X4ML function is wrapped in a PUT statement to send an individual keystroke, or a 
combination of keystrokes, from Excel to PowerPoint. The keystrokes work through all the dialog boxes to create a 
PowerPoint presentation, to apply an existing design template, to complete text boxes for titles, and to add SAS 
graphics.  
This example code is repetitive and could be simplified by using SAS macros to generate keystrokes dynamically. 
That, however, is left as an exercise for you. To modify the example code, see Table 1 for frequently used keyboard 
keystrokes and their representation in the argument string of the SEND.KEYS function.  
Coders' Corner
SUGI 30
0
VB.NET PDF Page Insert Library: insert pages into PDF file in vb.
Page: Insert PDF Pages. |. Home ›› XDoc.PDF ›› VB.NET PDF: Insert PDF Page. Add and Insert Multiple PDF Pages to PDF Document Using VB.
cut pages out of pdf online; delete page from pdf file online
VB.NET PDF delete text library: delete, remove text from PDF file
Visual Studio .NET application. Delete text from PDF file in preview without adobe PDF reader component installed. Able to pull text
extract pages from pdf files; extract pages from pdf file online
Key 
Code 
BACKSPACE 
"{BACKSPACE}" or "{BS}" 
BREAK 
"{BREAK}" 
CAPS LOCK 
"{CAPSLOCK}" 
CLEAR 
"{CLEAR}" 
DELETE or DEL 
"{DELETE}" or "{DEL}" 
DOWN 
"{DOWN}" 
END 
"{END}" 
ENTER (numeric keypad) 
"{ENTER}" 
ENTER 
"~" (tilde) 
ESC 
"{ESCAPE} or {ESC}" 
HELP 
"{HELP}" 
HOME 
"{HOME}" 
INS 
"{INSERT}" 
LEFT 
"{LEFT}" 
NUM LOCK 
"{NUMLOCK}" 
PAGE DOWN 
"{PGDN}" 
PAGE UP 
"{PGUP}" 
RETURN 
"{RETURN}" 
RIGHT 
"{RIGHT}" 
SCROLL LOCK 
"{SCROLLLOCK}" 
TAB 
"{TAB}" 
UP 
"{UP}" 
Table 1. Single Keystrokes 
Furthermore, to emulate the pressing of keys in combination with the ALT, SHIFT, CTRL, and command keys, key-
codes can be preceded by certain modifiers. See Table 2.  
To combine Key with... 
Precede Code with... 
SHIFT 
"+" (plus sign) 
CTRL 
"^" (caret) 
ALT or OPTION 
"%" (percent sign) 
COMMAND 
"*" (asterisk) 
Table 2. Combination Keystrokes  
EXAMPLE CODE 
Each numbered line is explained following the code. 
data _null_; 
file sas2xl; 
put '[app.activate("microsoft excel - book1")]'; 
put '[app.activate("microsoft powerpoint")]';01 
put '[run("macro1!r1c1")]';02 
put '[send.keys("{tab}",true)]'03 
'[send.keys("{tab}",true)]' 
'[send.keys("{tab}",true)]' 
'[send.keys("{return}",true)]' 
'[send.keys("^{n}",true)]'04 
'[send.keys("{return}",true)]' 
'[send.keys("%oy",true)]'05 
'[send.keys("Template for Graphics Catalog",true)]' 
'[send.keys("{return}",true)]' 
'[send.keys("{tab}",true)]'06 
'[send.keys("{return}",true)]' 
'[send.keys("Wine Consumption Statistics",true)]' 
'[send.keys("^{return}",true)]'07 
'[send.keys("Name: Kilo Volt",true)]' 
'[send.keys("{return}",true)]' 
Coders' Corner
SUGI 30
0
C# PDF Page Rotate Library: rotate PDF page permanently in C#.net
batch changing PDF page orientation without other PDF reader control. NET, add new PDF page, delete certain PDF page, reorder existing PDF pages and split
extract pages from pdf reader; copy one page of pdf
C# PDF delete text Library: delete, remove text from PDF file in
Delete text from PDF file in preview without adobe PDF reader component installed in ASP.NET. C#.NET PDF: Delete Text from Consecutive PDF Pages.
delete blank pages from pdf file; deleting pages from pdf in reader
'[send.keys("Company: Dinosaurs R Us",true)]' 
'[send.keys("^{m}",true)]'08 
'[send.keys("{right}",true)]' 
'[send.keys("{down}",true)]' 
'[send.keys("{down}",true)]' 
'[send.keys("{return}",true)]' 
'[send.keys("{tab}",true)]'09 
'[send.keys("{return}",true)]' 
'[send.keys("2002 Number of Bottles",true)]' 
'[send.keys("%ipf")]'10 
'[send.keys("D:\Koen\SAS\SUGI30 Paper Corders Corner\Pictures\2002.jpg")]' 
'[send.keys("{return}")]' 
'[send.keys("%oi")]'11 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("{tab}")]' 
'[send.keys("0.5")]' 
'[send.keys("{tab}")]'12 
'[send.keys("{tab}")]' 
'[send.keys("1.40")]' 
'[send.keys("^{pgdn}")]'13 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("{tab}")]' 
'[send.keys("{tab}")]' 
'[send.keys("{tab}")]' 
'[send.keys("90")]' 
'[send.keys("{return}")]' 
'[send.keys("^{m}",true)]'14 
'[send.keys("{return}",true)]' 
'[send.keys("{tab}",true)]' 
'[send.keys("{return}",true)]' 
'[send.keys("2003 Number of Bottles",true)]' 
'[send.keys("%ipf")]' 
'[send.keys("D:\Koen\SAS\SUGI30 Paper Corders Corner\Pictures\2003.jpg")]' 
'[send.keys("{return}")]' 
'[send.keys("%oi")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("{tab}")]' 
'[send.keys("0.5")]' 
'[send.keys("{tab}")]' 
'[send.keys("{tab}")]' 
'[send.keys("1.40")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("{tab}")]' 
'[send.keys("{tab}")]' 
'[send.keys("{tab}")]' 
'[send.keys("90")]' 
'[send.keys("{return}")]' 
'[send.keys("^{m}",true)]'15 
'[send.keys("{return}",true)]' 
'[send.keys("{tab}",true)]' 
'[send.keys("{return}",true)]' 
'[send.keys("2004 Number of Bottles",true)]' 
'[send.keys("%ipf")]' 
'[send.keys("D:\Koen\SAS\SUGI30 Paper Corders Corner\Pictures\2004.jpg")]' 
'[send.keys("{return}")]' 
'[send.keys("%oi")]' 
Coders' Corner
SUGI 30
0
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("{tab}")]' 
'[send.keys("0.5")]' 
'[send.keys("{tab}")]' 
'[send.keys("{tab}")]' 
'[send.keys("1.40")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("^{pgdn}")]' 
'[send.keys("{tab}")]' 
'[send.keys("{tab}")]' 
'[send.keys("{tab}")]' 
'[send.keys("90")]' 
'[send.keys("{return}")]' 
'[send.keys("%fa")]'16 
'[send.keys("D:\Koen\SAS\SUGI30 Paper Corders Corner\Output\PPT from 
SAS.ppt")]' 
'[send.keys("{return}")]' 
'[send.keys("%fx")]'17 
run; 
DETAILS 
01 When using the SEND.KEYS X4ML function in Excel, keystrokes are sent to the active application. Therefore, to 
ensure that we send keystrokes to PowerPoint, we activate the PowerPoint application. 
02 As explained in the section “Preparations to Export SAS Graphics to PowerPoint”, by trial-and-error, it was 
discovered that we need to pause the Excel application briefly at this point. So we use the RUN function to 
execute the Excel macro that was prepared previously, and Excel sleeps for a second. 
03 Now we begin to send keystrokes to PowerPoint. Note that the SEND.KEYS function has a second argument. It 
is a Boolean value that, when specified as TRUE, causes Excel to wait for the keys to be processed before 
continuing. We added the Boolean control to some of the keystrokes and not to others. Our empirical criterion 
was: Does it work? If not, add TRUE. See Tables 1 and 2 for SEND.KEYS values. 
What we do here in the code is equivalent to pressing the TAB key three times and the RETURN key one time. 
This is done to get rid of the dialog box that popped up when PowerPoint was launched (Figure 1). The dialog 
box prompts the user to create a new presentation or to open an existing one. We want nothing of it. Three 
TABs and a RETURN is the same as clicking the Cancel button. Note that this dialog box can be suppressed by 
default (at least in PowerPoint 2000), so this step might not be necessary. 
Coders' Corner
SUGI 30
0
Figure 1. Three TABs and a RETURN Cancel the Startup Dialog Box 
04 With the dialog box gone, we perform a CONTROL-N. This creates a new presentation and brings up a dialog 
box that prompts us to choose a layout for the first slide (Figure 2). Because the default layout is a Title Slide, 
we merely send a RETURN key to select it. The result is shown in Figure 3. 
Figure 2.  The First New Slide Dialog Box, with the Title Slide Layout Selected by Default 
Coders' Corner
SUGI 30
0
Figure 3.  Blank Presentation with a Single Slide of the Title Slide Layout 
05 The ALT-O-Y keystroke brings up the dialog box to apply a design template (Figure 4) to the current 
presentation. For the purpose of exporting a SAS/GRAPH catalog, the next line of code selects a special design 
template, ‘Template for Graphics Catalog.pot’. This template was built manually in PowerPoint, and tailored to 
suit the problem of exporting SAS graphics to PowerPoint. It consists of a title slide layout and a main slide 
layout. The title slide layout has two text boxes. The main slide layout has a single text box for a caption or chart 
title and lots of empty space for a graphic element. The design template is stored in one of the locations where 
PowerPoint usually stores templates. These locations might vary across systems. To find them, Windows 
searches for files with the PowerPoint Template extension .pot. The result of applying the design template to our 
presentation is shown in Figure 5. 
Figure 4.  The Apply Design Template Dialog Box  
Coders' Corner
SUGI 30
0
10 
Figure 5.  Results of Applying the Design Template to the New Presentation 
06 A TAB followed by a RETURN highlights the contents of the first text box on the title slide—where it says ‘Click 
to add title’. Sending a text string replaces the contents of the text box. 
07 The CTRL-RETURN combination keystroke moves the focus to the next text box on the slide, and highlights the 
contents. Sending a text string replaces the contents ‘Click to add subtitle’.  Pressing RETURN creates a new 
line within the text string. The result of this step is shown in Figure 6. Our title slide is now complete. 
Figure 6.  The Title Slide after Customization 
Coders' Corner
SUGI 30
0
Documents you may be interested
Documents you may be interested