pdf reader in asp.net c# : How to delete text from pdf with acrobat software SDK dll winforms wpf asp.net web forms Milos_DocumentManagement_DownloadFileAttachment6-part823

61
www.cod
e
-m
a
g
a
z
in
e
.com
D
e
v
e
loping Plugins for Windows Liv
e
Writ
e
r
This time, Writer does not pass you a string reference, 
which means  whatever  is  highlighted in the editor 
gets ignored. Instead you’re given an ISmartContent 
object.  ISmartContent  objects  contain  everything 
about an instance of a plugin’s usage, which includes 
an IProperties property (as used when including set-
tings). However, those properties are for that ISmart-
Content  object  and  only  that  object—they  are  not 
global like you saw before.
From the code snippet, you can see that I have cre-
ated a PluginSettings class, which takes in the IProp-
erties property of the ISmartContent object; this then 
gets passed to the Form, which makes it easier for the 
Form to write the required settings to the PluginSet-
tings class.
G
eneratePublish
H
T
ML Method
In the main plugin class, there are three new meth-
ods that you can override: two of these are com-
pulsory, the third is optional. The fi rst of these is 
the  GeneratePublishHTML  method,  which  is  the 
method where the HTML is what will be published 
to your actual blog. This method is compulsory; you 
have to have it there. This code snippet is a very 
small example of what is required:
public override string GeneratePublishHtml
(ISmartContent content, 
IPublishingContext publishingContext)
{
PluginSettings settings = 
new PluginSettings(content.Properties);
return settings.FinalText;
}
In this snippet, the text that would actually be pub-
lished comes  from a  setting  that you would have 
written to using the CreateContent method.
The  IPublishingContext object  that  gets  passed 
holds information about the type of blog you’re 
plugin, like settings and which bits of the content 
you would like the end user to be able to edit if re-
quired. Knowing what parts you want them to edit 
at a later date will help you determine what settings 
you  need  for  the  plugin.  These  settings  are  held 
within the IProperties property of the ISmartCon-
tent object, which gets passed to the plugin from 
Live Writer.
You will also want to work out where you would 
like the end user to edit the content, whether it’s a 
Form similar to the original Form they used or it’s 
done from the sidebar of Writer.
Lis
t
i
n
g
2 shows the code used in the example pl-
ugin’s PluginSettings class.
To write  a  SmartContentSource  plugin, you  must 
inherit from SmartContentSource, rather than Con-
tentSource:
public class HiddenText : SmartContentSource
O
verride 
C
reate
C
ontent Method
Like ContentSource plugins, you need to override 
the CreateContent method, but this time it’s slightly 
different:
public override DialogResult CreateContent
(IWin32Window dialogOwner, 
ISmartContent newContent)
{
PluginSettings settings = 
new PluginSettings(newContent.Properties);
using (frmMain main = new frmMain(settings))
{
DialogResult result = main.ShowDialog();
return result;
}
}
using System;
using System.Collections.Generic;
using System.Text;
using WindowsLive.Writer.Api;
namespace EditPublish
{
public class PluginSettings
{
IProperties m_properties;
private const string PLACEHOLDER = "PLACEHOLDER";
private const string ACTUALCODE = "ACTUALCODE";
public PluginSettings(IProperties properties)
{
m_properties = properties;
}
public string PlaceHolder
{
get
{
return m_properties.GetString(PLACEHOLDER, "");
}
set
{
m_properties.SetString(PLACEHOLDER, value);
}
}
public string FinalText
{
get
{
return m_properties.GetString(ACTUALCODE, "");
}
set
{
m_properties.SetString(ACTUALCODE, value);
}
}
}
}
Li
s
ting 2: This is th
e
cod
e
for th
e
PluginS
e
ttings cl
a
ss in th
e
Sm
a
rt
C
ont
e
ntSourc
e
plugin.
How to delete text from pdf with acrobat - delete, remove text from PDF file in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Allow C# developers to use mature APIs to delete and remove text content from PDF document
delete text from pdf acrobat; acrobat delete text in pdf
How to delete text from pdf with acrobat - VB.NET PDF delete text library: delete, remove text from PDF file in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET Programming Guide to Delete Text from PDF File
how to delete text in pdf converter; how to delete text from a pdf reader
62
www.cod
e
-m
a
g
a
z
in
e
.com
D
e
v
e
loping Plugins for Windows Liv
e
Writ
e
r
C
reate
E
ditor Method
This  is  the  second  compulsory  method  that  you 
need to override. This method creates the sidebar 
that appears in Live Writer when a SmartContent-
Source object is selected in the Live Writer editor:
public override SmartContentEditor CreateEditor
(ISmartContentEditorSite editorSite)
{
return new ContextEditor();
}
This method is usually just as simple as that. The 
ContextEditor class that I call in this snippet will be 
explained later in the article.
G
enerate
E
ditor
H
T
ML
Sometimes in a plugin, what you want to display in 
the blog entry isn’t always something that you want 
to appear  in the editor of Live Writer,  JavaScript 
functions  for  example.  So  sometimes  you  might 
need to have something else appear in the actual 
Live Writer editing area. For this you need to over-
ride the GenerateEditorHTML method:
public override string GenerateEditorHtml
(ISmartContent content, 
IPublishingContext publishingContext)
{
PluginSettings settings = 
new PluginSettings(content.Properties);
return settings.PlaceHolder;
}
writing to, which  includes a GUID  for the in-
dividual  blog (this  comes  from Live Writer it-
self) and the Service Name, which is whatever 
the current publishing service is (e.g., "Windows 
Live  Spaces",  "LiveJournal",  "WordPress.com", 
etc.).
using System.Windows.Forms;
using WindowsLive.Writer.Api;
namespace EditPublish
{
[WriterPlugin("18d43e01-4549-4fde-8ca6-c7b4b7385fac"
"Insert Placeholder",
PublisherUrl = "http://scottisafooldev.spaces.live.com",
Description = 
"Lets you put in a placeholder for the editor, "+
"to be replaced with other text when published."
ImagePath = "writer.png", 
HasEditableOptions = false)]
[InsertableContentSource("Placeholder")]
public class HiddenText : SmartContentSource
{
public override DialogResult CreateContent
(IWin32Window dialogOwner, 
ISmartContent newContent)
{
PluginSettings settings = 
new PluginSettings(newContent.Properties);
using (frmMain main = new frmMain(settings))
{
DialogResult result = main.ShowDialog();
return result;
}
}
public override SmartContentEditor CreateEditor
(ISmartContentEditorSite editorSite)
{
return new ContextEditor();
}
public override string GeneratePublishHtml
(ISmartContent content, 
IPublishingContext publishingContext)
{
PluginSettings settings = 
new PluginSettings(content.Properties);
return settings.FinalText;
}
public override string GenerateEditorHtml
(ISmartContent content, 
IPublishingContext publishingContext)
{
PluginSettings settings = 
new PluginSettings(content.Properties);
return settings.PlaceHolder;
}
}
}
Li
s
ting 3: This is th
e
cod
e
for th
e
plugin cl
a
ss for th
e
Sm
a
rt
C
ont
e
ntSourc
e
plugin.
Figure 8: Th
e
sid
e
b
a
r in Liv
e
Writ
e
a
pp
e
a
rs on th
e
right-h
a
nd sid
e
wh
e
a
Sm
a
rt
C
ont
e
ntSourc
e
is 
s
e
l
e
ct
e
d.
.NET PDF Document Viewing, Annotation, Conversion & Processing
Redact text content, images, whole pages from PDF file. Annotate & Comment. Edit, update, delete PDF annotations from PDF file. Print.
erase text from pdf file; how to delete text in pdf preview
C# PDF Converter Library SDK to convert PDF to other file formats
Allow users to convert PDF to Text (TXT) file. can manipulate & convert standard PDF documents in other external third-party dependencies like Adobe Acrobat.
delete text pdf files; remove text watermark from pdf
63
www.cod
e
-m
a
g
a
z
in
e
.com
D
e
v
e
loping Plugins for Windows Liv
e
Writ
e
r
Lis
t
i
n
g
3 shows the full code for the example pl-
ugin’s main class.
U
sing 
F
orms
Using  Forms  is  mostly  the  same  as  when  do-
ing  a  basic  ContentSource  plugin,  the  main  dif-
ference  being  that  instead  of  creating  the  fi nal 
As you can see, you get passed the same objects as 
the GeneratePublishHTML method, so you can use 
the same information for putting your HTML code 
into the editor.
This method is the optional method; your plugin 
does not  require  it.  If  this  isn’t  overridden,  Live 
Writer will simply use what is in the GeneratePub-
lishHTML method.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace EditPublish
{
public class frmMain : Form
{
PluginSettings m_settings;
public frmMain(PluginSettings settings)
{
m_settings = settings;
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text != "")
{
m_settings.PlaceHolder = textBox1.Text;
}
else
{
MessageBox.Show("You need to set a placeholder"
"Big Fat Hairy Error"
MessageBoxButtons.OK, 
MessageBoxIcon.Error);
return;
}
if (textBox2.Text != "")
{
m_settings.FinalText = textBox2.Text;
}
else
{
MessageBox.Show("Enter some text"
"Big Fat Hairy Error"
MessageBoxButtons.OK, 
MessageBoxIcon.Error);
return;
}
this.DialogResult = DialogResult.OK;
this.Close();
}
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources 
/// should be disposed; otherwise, false.</param>
protected override void Dispose
(bool disposing)
{
if(disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = 
new System.ComponentModel.ComponentResourceManager
(typeof(frmMain));
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox2 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.SuspendLayout();
// 
// textBox1
// 
this.textBox1.Location = new System.Drawing.Point(13, 124);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(407, 48);
this.textBox1.TabIndex = 0;
// 
// textBox2
// 
this.textBox2.Location = new System.Drawing.Point(13, 203);
this.textBox2.Multiline = true;
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(407, 56);
this.textBox2.TabIndex = 1;
// 
// label1
Li
s
ting 4: Th
e
cod
e
for th
e
m
a
in form in th
e
Sm
a
rt
C
ont
e
ntSourc
e
plugin.
C# powerpoint - PowerPoint Conversion & Rendering in C#.NET
documents in .NET class applications independently, without using other external third-party dependencies like Adobe Acrobat. PowerPoint to PDF Conversion.
pdf editor delete text; pdf text remover
C# Word - Word Conversion in C#.NET
Word documents in .NET class applications independently, without using other external third-party dependencies like Adobe Acrobat. Word to PDF Conversion.
how to delete text in pdf converter professional; deleting text from a pdf
64
www.cod
e
-m
a
g
a
z
in
e
.com
D
e
v
e
loping Plugins for Windows Liv
e
Writ
e
r
// 
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(13, 105);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(168, 13);
this.label1.TabIndex = 2;
this.label1.Text = "Text to appear in the Writer editor:";
// 
// label2
// 
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(13, 185);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(189, 13);
this.label2.TabIndex = 3;
this.label2.Text = "Text to appear in the actual blog entry:";
// 
// label3
// 
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)
(((System.Windows.Forms.AnchorStyles.Top | 
System.Windows.Forms.AnchorStyles.Left) |
System.Windows.Forms.AnchorStyles.Right)));
this.label3.Location = new System.Drawing.Point(13, 9);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(407, 96);
this.label3.TabIndex = 4;
this.label3.Text = resources.GetString("label3.Text");
// 
// button1
// 
t
h
i
s
.
b
u
t
t
o
n
1
.
D
i
a
l
o
g
R
e
s
u
l
t
=
S
y
s
t
e
m
.
W
i
n
d
o
w
s
.
F
o
r
m
s
.
D
i
a
l
o
g
R
e
s
u
l
t
.
C
a
n
c
e
l
;
this.button1.Location = new System.Drawing.Point(264, 272);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 5;
this.button1.Text = "Insert";
this.button1.UseVisualStyleBackColor = true;
t
h
i
s
.
b
u
t
t
o
n
1
.
C
l
i
c
k
+
=
n
e
w
S
y
s
t
e
m
.
E
v
e
n
t
H
a
n
d
l
e
r
(
t
h
i
s
.
b
u
t
t
o
n
1
_
C
l
i
c
k
)
;
// 
// button2
// 
t
h
i
s
.
b
u
t
t
o
n
2
.
D
i
a
l
o
g
R
e
s
u
l
t
=
S
y
s
t
e
m
.
W
i
n
d
o
w
s
.
F
o
r
m
s
.
D
i
a
l
o
g
R
e
s
u
l
t
.
C
a
n
c
e
l
;
this.button2.Location = new System.Drawing.Point(345, 272);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 6;
this.button2.Text = "Cancel";
this.button2.UseVisualStyleBackColor = true;
// 
// frmMain
// 
this.AcceptButton = this.button1;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.button2;
this.ClientSize = new System.Drawing.Size(432, 307);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.textBox1);
t
h
i
s
.
F
o
r
m
B
o
r
d
e
r
S
t
y
l
e
=
S
y
s
t
e
m
.
W
i
n
d
o
w
s
.
F
o
r
m
s
.
F
o
r
m
B
o
r
d
e
r
S
t
y
l
e
.
F
i
x
e
d
S
i
n
g
l
e
;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "frmMain";
this.ShowIcon = false;
this.ShowInTaskbar = false;
t
h
i
s
.
S
t
a
r
t
P
o
s
i
t
i
o
n
=
S
y
s
t
e
m
.
W
i
n
d
o
w
s
.
F
o
r
m
s
.
F
o
r
m
S
t
a
r
t
P
o
s
i
t
i
o
n
.
C
e
n
t
e
r
P
a
r
e
n
t
;
this.Text = "Insert Placeholder Plugin";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
}
}
Li
s
ting 4: 
C
ontinu
e
d
face, it needs to inherit from the SmartContentE-
ditor interface (make sure you’re using Window-
sLive.Writer.API):
public partial class ContextEditor : SmartContentEditor
The constructor for the editor has to be like the fol-
lowing or your plugin could end up with some strange 
behavior:
PluginSettings m_settings;
ISmartContent m_content;
public ContextEditor()
{
InitializeComponent();
this.SelectedContentChanged += 
new EventHandler(
SelectedContentNowChanged);
}
HTML and passing that back, you just save the set-
tings into the PluginSettings class, which will then be 
used in a later method in the plugin’s main class.
Lis
t
i
n
g
4 shows the full  code for the  main Form 
used in this example plugin.
T
he Sidebar (
C
ontext
E
ditor)
When you select a  SmartContentSource within 
the Live Writer editor, the editor activates a side-
bar on the right-hand side of the Live Writer win-
dow, as shown in Figu
r
e
8.
For this, you need to create a new User Control 
to your plugin project. I call mine ContextEditor. 
Now, rather than inherit the UserControl inter-
VB.NET PDF: How to Create Watermark on PDF Document within
create a watermark that consists of text or image (such And with our PDF Watermark Creator, users need no external application plugin, like Adobe Acrobat.
how to edit and delete text in pdf file online; how to delete text from a pdf
C# Windows Viewer - Image and Document Conversion & Rendering in
standard image and document in .NET class applications independently, without using other external third-party dependencies like Adobe Acrobat. Convert to PDF.
delete text pdf; delete text pdf acrobat
65
www.cod
e
-m
a
g
a
z
in
e
.com
D
e
v
e
loping Plugins for Windows Liv
e
Writ
e
r
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using WindowsLive.Writer.Api;
namespace EditPublish
{
public class ContextEditor : SmartContentEditor
{
PluginSettings m_settings;
ISmartContent m_content;
public ContextEditor()
{
InitializeComponent();
this.SelectedContentChanged += 
new EventHandler(
SelectedContentNowChanged);
}
void SelectedContentNowChanged
(object sender, EventArgs e)
{
m_content = SelectedContent;
m_settings = 
new PluginSettings(m_content.Properties);
textBox1.Text = m_settings.PlaceHolder;
textBox2.Text = m_settings.FinalText;
}
private void button1_Click
(object sender, EventArgs e)
{
if (textBox1.Text != "")
{
m_settings.PlaceHolder = textBox1.Text;
}
else
{
MessageBox.Show("No placeholder"
"Big Fat Hairy Error"
MessageBoxButtons.OK, 
MessageBoxIcon.Error);
return;
}
if (textBox2.Text != "")
{
m_settings.FinalText = textBox2.Text;
}
else
{
MessageBox.Show("No text"
"Big Fat Hairy Error"
MessageBoxButtons.OK, 
MessageBoxIcon.Error);
return;
}
OnContentEdited();
}
/// <summary> 
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary> 
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources 
      /// should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary> 
/// Required method for Designer support - do not modify 
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.textBox2 = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.SuspendLayout();
// 
// textBox1
// 
this.textBox1.Location = new System.Drawing.Point(3, 91);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(178, 58);
this.textBox1.TabIndex = 0;
// 
// label1
// 
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(0, 73);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(168, 13);
this.label1.TabIndex = 3;
this.label1.Text = "Text to appear in the Writer editor:";
// 
// textBox2
// 
this.textBox2.Location = new System.Drawing.Point(3, 182);
this.textBox2.Multiline = true;
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(178, 58);
this.textBox2.TabIndex = 4;
// 
// label2
Li
s
ting 5: Th
e
cod
e
for th
e
C
ont
e
xt
E
ditor in th
e
Sm
a
rt
C
ont
e
ntSourc
e
plugin.
C# Excel - Excel Conversion & Rendering in C#.NET
Excel documents in .NET class applications independently, without using other external third-party dependencies like Adobe Acrobat. Excel to PDF Conversion.
how to delete text from pdf document; delete text from pdf preview
VB.NET PowerPoint: VB Code to Draw and Create Annotation on PPT
other documents are compatible, including PDF, TIFF, MS free hand, free hand line, rectangle, text, hotspot, hotspot more plug-ins needed like Acrobat or Adobe
how to erase in pdf text; how to copy text out of a pdf
66
www.cod
e
-m
a
g
a
z
in
e
.com
D
e
v
e
loping Plugins for Windows Liv
e
Writ
e
r
If the user makes a change to the content using the 
sidebar, nothing will change in the editor until you 
call the OnContentEdited() method. You can call 
this from a single button after all changes or each 
time anything is changed; it is up to you as the de-
veloper to decide when to update the editor.
Lis
t
i
n
g
5 shows you the code needed for the sam-
ple plugin’s ContextEditor.
Much Much More…
If you look through the Live Writer APIs, you will 
fi nd so much more that you can do with your plu-
gins, including an excellent screen-scraping method 
that will take a screenshot of a given URL and re-
turn an image. I would highly recommend taking 
a good look at the rest of the API documentation 
on  MSDN  (http://m
s
dn2.mi
c
ro
s
oft.
c
om/en-u
s
/librar
y
/
aa738852.a
s
p
x
).
Notice the EventHandler you have had to listen out 
for. This  is important  as this is  what detects that 
you have selected a different instance of a Smart-
ContentSource object (don’t forget, your user could 
have used your plugin to insert two separate objects 
in their blog entry).
The code for the EventHandler method is also im-
portant to get right:
void SelectedContentNowChanged
(object sender, EventArgs e)
{
m_content = SelectedContent;
m_settings = 
new PluginSettings(m_content.Properties);
textBox1.Text = m_settings.PlaceHolder;
textBox2.Text = m_settings.FinalText;
}
Impo
r
t
a
n
t
 You  must  not  use  SelectedContent.
Properties if you wish to get the IProperties prop-
erty of the ISmartContent—this will not work. This 
is why I assign SelectedContent to a local variable, 
and then use that local variable when passing the 
IProperties object to the PluginSettings class.
As a best practice, you should also use this Even-
tHandler method to either set the current settings 
to what you have in your sidebar or call the meth-
od that applies these settings.
// 
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(0, 164);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(171, 13);
this.label2.TabIndex = 5;
this.label2.Text = "Text to appear in actual blog entry:";
// 
// button1
// 
this.button1.Location = new System.Drawing.Point(3, 255);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 6;
this.button1.Text = "Apply";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
// 
// label3
// 
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)
(((System.Windows.Forms.AnchorStyles.Top | System.
Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label3.BackColor = System.Drawing.Color.White;
this.label3.Font = new System.Drawing.Font("Microsoft 
Sans Serif", 14F, System.Drawing.FontStyle.Regular, 
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label3.Location = new System.Drawing.Point(0, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(190, 32);
this.label3.TabIndex = 7;
this.label3.Text = "Insert Placeholder";
// 
// ContextEditor
// 
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
t
h
i
s
.
A
u
t
o
S
c
a
l
e
M
o
d
e
=
S
y
s
t
e
m
.
W
i
n
d
o
w
s
.
F
o
r
m
s
.
A
u
t
o
S
c
a
l
e
M
o
d
e
.
F
o
n
t
;
this.Controls.Add(this.label3);
this.Controls.Add(this.button1);
this.Controls.Add(this.label2);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.label1);
this.Controls.Add(this.textBox1);
this.Name = "ContextEditor";
this.Size = new System.Drawing.Size(190, 482);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label3;
}
}
Li
s
ting 5: 
C
ontinu
e
d
Sco
/
tt
Lovegrove
67
www.cod
e
-m
a
g
a
z
in
e
.com
Introduction to th
e
Liv
e
S
e
a
rch API
O
N
L
I
N
E
Q
U
I
C
K
I
D
0
8
0
4
1
2
2
Bronwen 
Z
ande
B
ronwen@
s
oul
s
olution
s
.
c
om.au 
+61 402 148 104
Bronw
e
n Z
a
nd
e
is 
a
Dir
e
ctor 
of Soul Solutions, b
a
s
e
d in 
Brisb
a
n
e
, Austr
a
li
a
.
With ov
e
r 10 y
e
a
rs of softw
a
r
e
d
e
v
e
lopm
e
nt 
e
xp
e
ri
e
nc
e
Bronw
e
n’s prim
a
ry focus 
is Microsoft Liv
e
a
nd .N
E
d
e
v
e
lopm
e
nt. Sh
e
is 
a
Windows Liv
e
S
e
rvic
e
s MVP 
a
nd p
a
rt of th
e
cor
e
t
e
a
m th
a
runs th
e
Vi
a
WindowsLiv
e
.com 
community sit
e
for Windows 
Liv
e
t
e
chnologi
e
s.
Wh
e
n not working with 
Windows Liv
e
, Bronw
e
n h
e
lps 
bring tog
e
th
e
r “
G
e
e
k
G
irls” 
from 
a
round th
e
glob
e
a
http://www.gee
k
girlblog
s
.
c
om
.
and non-commercial sites at no cost. The full busi-
ness terms are located at http://de
v
.li
v
e.
c
om.
The fi rst thing you require when using the API is an 
Application ID. You can register and manage your 
Live Search Application IDs at 
the Live Search Developer Cen-
ter  located  at  http:
/
/
dev.live.
com
/
search. Fig
u
r
e
2 shows the 
Developer Center home page.
Once here, you may download 
the SDK or Create and Manage 
Application  IDs.  When  creat-
ing a new Application ID, give 
your  application  a  name  and 
make note of the assigned Application ID as you 
will need to use it in your source code. 
In
t
r
oduc
t
i
on 
t
t
he L
i
ve 
Sea
r
ch API
H
a
v
e
y
o
u
e
v
e
r
w
a
n
t
e
d
t
o
i
m
p
l
e
m
e
n
t
s
e
a
r
c
h
c
a
p
a
b
ili
t
i
e
s
o
n
y
o
u
r
o
w
n
W
e
b
s
i
t
e
b
u
t
d
i
d
n
t
w
a
n
t
t
o
i
m
p
l
e
m
e
n
t
t
h
e
l
o
g
i
c
a
n
d
d
e
a
l
w
i
t
h
i
s
s
u
e
s
s
u
c
h
a
s
s
t
o
r
a
g
e
a
n
d
i
n
d
e
x
i
n
g
?
The
Live
Search
team
now
offers
two
different
ways
to
utilize
Search
on
your
site:
using
the
Live
Search
Box
or
using
the
Windows
Live
Search
A
PI.
I
f you aren’t familiar with Live Search, it is locat-
ed at  http:
/
/
www.live.com. Fig
u
r
e
1 shows the 
Live Search  home page. In addition to a stan-
dard search service, Live Search offers searches in 
various categories such as images, news, maps, and 
more.
The Live Search Box  allows  a 
user  to  harness  the  power  of 
Live  Search  without  writing 
any code. It provides a fast, cus-
tomizable  search  for  any  Web 
site.  You  can  fi nd  details  on 
how to get started with this op-
tion  at  http:
/
/
search.live.com
/
siteowner. From this site, follow 
the wizard and copy the HTML code provided into 
your site.
This article focuses on the Live Search Web Service 
and how it allows developers to create applications 
that return results from the Live Search Engine.
L
i
ve 
S
earch Web 
S
erv
i
ce
The  Live  Search  Web  Service  is  an  Extensible 
Markup  Language  (XML)  service  with  a  Simple 
Object Access Protocol (SOAP) API that allows us-
ers to create a custom search engine that can query 
for Web results, images, news, phonebook listings, 
feeds, and meta tags.  You should use this service 
when you are a developer who is comfortable con-
suming Web Services and you want more program-
matic control over what you are searching for and 
how you want to display your results.
You can fi nd the fully documented online SDK at 
http://m
s
dn2.mi
c
ro
s
oft.
c
om/en-u
s
/librar
y
/bb251794.
a
s
p
x
 The  documentation  describes  the  require-
ments, class libraries for the Live Search Web Ser-
vice, and the terms of use and contains sample code 
demonstrating use of the Live Search Web Service.
Before You 
S
tart
One of the benefi ts of using the Live Search Web 
Service  is  that  the  terms  of  use  allow  for  up  to 
25,000 queries a  day for use  in both commercial 
need to use it in your source code.
de.
.
R
e
a
d
t
h
i
s
e
n
t
i
r
e
a
r
t
i
c
l
e
o
n
l
i
n
e
a
t
h
t
t
p
:
/
/
w
w
w
.
c
o
d
e
-
m
a
g
a
z
i
n
e
.
c
o
m
/
f
o
c
u
s
/
w
l
Liv
e
S
e
ar
c
h W
e
b S
e
rvi
c
e
allow
s
for up to 25,000 
qu
e
ri
e
s
a day for 
u
s
e
in both 
c
omm
e
r
c
ial and 
non-
c
omm
e
r
c
ial 
s
it
e
s
at no 
c
o
s
t.
Fa
s
t Fa
c
t
s
Figure 1: Th
e
Liv
e
S
e
a
rch hom
e
p
a
g
e
.
Fi
1
Th Li S
hh
68
www.cod
e
-m
a
g
a
z
in
e
.com
G
e
tting St
a
rt
e
d with th
e
Windows Liv
e
Tools
O
N
L
I
N
E
Q
U
I
C
K
I
D
0
8
0
4
1
0
2
V
i
kas Ahu
j
a
Program Manager, Window
s
Li
v
e De
v
eloper Platform, 
Mi
c
ro
s
oft 
C
orporation
With ov
e
r t
e
n y
e
a
rs of 
e
xp
e
ri
e
nc
e
d
e
liv
e
ring IT 
solutions, Vik
a
s liv
e
s in 
R
e
dmond with his wif
e
. H
e
pr
e
viously work
e
d with th
e
Microsoft.com W
e
b sit
e
, h
e
ld 
diff
e
r
e
nt positions in qu
a
lity 
a
ssur
a
nc
e
a
nd is curr
e
ntly 
h
a
ndling progr
a
m m
a
n
a
g
e
m
e
nt 
for th
e
Windows Liv
e
D
e
v
e
lop
e
r Pl
a
tform.
Ge
t
t i
ng S
t
a
r
t
ed w
i
t
t
he 
W
i
ndows L
i
ve Too
l
s
Wi
n
d
o
w
s
Li
v
e
T
o
o
l
s
f
o
r
Mi
c
r
o
s
o
f
t
Vi
s
u
a
l
S
t
u
d
i
o
e
n
a
b
l
e
s
d
e
v
e
l
o
p
e
r
s
t
o
i
n
c
o
r
p
o
r
a
t
e
a
s
e
t
o
f
Wi
n
d
o
w
s
Li
v
e
s
e
r
v
i
c
e
s
i
n
t
o
t
h
e
ir
W
e
b
s
i
t
e
s
u
s
i
n
g
Vi
s
u
a
l
S
t
u
d
i
o
a
n
d
A
S
P
.
NET
.
Using
the
Contacts
A
SP.NET
Server
Control,
your
users
can
easily
share
their
contacts
between
Windows
Live
and
your
Web
site.
With
the
SilverlightStreamingMediaPlayer
A
SP.NET
Server
Control,
you
can
show
videos
on
your
Web
site
from
your
Silverlight
Streaming
account
with
just
drag-and-
drop.
The
IDLoginStatus
and
IDLoginView
A
SP.NET
Server
Controls
provide
Windows
Live
ID
authentication
at
your
Web
site
for
your
users.
Microsoft
released
its
second
community
technology
preview
(CTP)
in
December,
2007.
Y
ou
can
download
this
CTP
from
http:
/
/
dev.live.com
/
tools.
NET Windows Live Web Site” project template in 
the File | New Web Site dialog box (Fig
u
r
e
1). Also, 
you can fi nd these controls list-
ed as “Windows Live Tools” in 
the Toolbox.
C
reat
i
ng Your F
i
rst 
Pro
j
ect w
i
th the 
W
i
ndows 
L
i
ve Too
l
s
To  start your fi rst project  that 
integrates  Windows  Live  ser-
vices,  navigate  to  File  |  New 
Web Site, and select the “ASP.
NET  Windows  Live  Web 
Site” template. Fill out the de-
tails  to  proceed  with  project  creation.  Open  the 
Default.aspx Web page in designer mode by choos-
ing “View Designer” from the context menu in the 
Solution Explorer.
This article will drill down into each of the newly 
introduced controls and what they offer  for  your 
Web site.
C
ontacts
Have you ever wondered why you have to enter a 
new shipping address for each Web site whenever 
you buy a gift for a friend
?
What if you could share 
the shipping address across multiple Web sites us-
ing a central address book
?
The Contacts control 
is a solution that allows you to safely transfer your 
contact information between Windows Live Con-
tacts (a  user’s single address book  between Win-
dows Live Messenger and Windows Live Hotmail) 
and the shopping Web site. Also, the Contacts con-
trol can help a Web site build viral communication 
channels where users can message one another the 
T
hrough this  CTP, Microsoft  is  releasing  four 
ASP.NET  Server  Controls:  Contacts,  IDLo-
ginStatus,  IDLoginView, 
and  SilverlightStreamingMe-
diaPlayer. To help you develop 
Windows  Live  Web  sites,  Mi-
crosoft  has  created  a  project 
template  as  well.  This  release 
only works with Visual Studio 
2008  and  Visual  Web  Devel-
oper  2008  Express  Edition  at 
this time.
Installation  of  the  Windows 
Live  Tools  is  straightforward. 
After  installation  is  complete, 
Visual Studio displays an “ASP.
Window
s
Liv
e
Tool
s
bring
s
s
e
t of Window
s
Liv
e
s
e
rvi
c
e
s
right into your Vi
s
ual Studio 
d
e
v
e
lopm
e
nt 
e
nvironm
e
nt.
You 
c
an 
s
tart int
e
grating 
Window
s
Liv
e
Conta
c
t
s
Window
s
Liv
e
I
Auth
e
nti
c
ation, and Silv
e
rlight 
Str
e
aming 
s
e
rvi
c
e
s
into your W
e
s
it
e
.
Fa
s
t Fa
c
t
s
Figure 1: ASP.N
E
T Windows Liv
e
W
e
b Sit
e
t
e
mpl
a
t
e
.
69
www.cod
e
-m
a
g
a
z
in
e
.com
G
e
tting St
a
rt
e
d with th
e
Windows Liv
e
Tools
Set the 
• 
PrivacyStatementURL to a Web page
/
link that  describes the  privacy  statement for 
your Web site.
Set the 
• 
View property to List.
Set the 
• 
DataDesired property to specify which 
data elements need to be fetched from Win-
dows Live Contacts.
Provide  client
/
server-side  event  handlers  to 
• 
receive the data and handle the shipping pro-
cess for the purchased items.
Next,  I’ll  show  you  how  to  modify  the  project 
to  allow  users  to  share  their  contacts  data  on 
Default.aspx.  You can get  the complete reference 
to the data elements allowed for the DataDesired 
property  at  http:
/
/
dev.live.com
/
tools
/
contactsapi.
aspx. Set the following values for the DataDesired 
property in the property grid for the Contacts con-
trol: fi rstname, lastname, personalstreet, personal-
city, personalstate, personalcountry, and personal-
postalcode.
Once data is transferred by the Contacts control, 
you can process the data in the OnClientData or 
OnServerData event handlers.
The event handler for OnClientData (in JavaScript) 
can look like the following:
<script type="text/javascript">
function Contacts1_OnClientData(sender, args)
{
var s = args.contacts.length+ " records\r\n";
for (var i = 0; i < args.contacts.length; i++){
for (var j in args.contacts[i]){
s += j + ": " + args.contacts[i][j]+"\r\n";
}
s += "\r\n";
}
alert(s);
}
</script>
Once you  execute this code,  you will notice that 
an alert comes up, which enumerates the data ele-
ments and their values (Fig
u
r
e
3). The OnClient-
Data event handler receives the transferred con-
tacts as an array of objects. Each object represents 
one contact selected by the user for transfer. Each 
contact object has data elements corresponding to 
the DataDesired property. If a certain data element 
does not exist for a contact, it will not be returned.
context of the Web site. For example, a shopping 
Web site can specify a promotion message that their 
users can send one another from the Web site.
The Contacts  control  offers three  different  views 
to best suit your needs: Tile, TileList, and List. In 
Tile
/
TileList views, Web site users can start an IM 
conversation or open an e-mail with a pre-defi ned 
message
/
custom greeting from the Web site, such 
as “Let’s discuss this topic.” List view allows users 
to  select  and  share  their Windows Live  Contacts 
across  multiple  Web  sites  and  centralize  address 
book management in one place. It’s an off-the-shelf 
address book pre-fi lled with data for any Web site 
on the Internet.
The user maintains control of the data and has the 
authority to choose to share or not share their data 
with your Web site.
I’ll show you how easy it is to use Windows Live 
Contacts in your Web site. Drag-and-drop the Con-
tacts  ASP.NET Server  Control  from  the  Toolbox 
onto  the  Default.aspx  Web  page.  The  drag-and-
drop  operation  adds the  privacyPolicy.htm fi le to 
your  project  (you can  replace  this  fi le  with  your 
own  privacy  policy statement). Run the  Web site 
by entering Ctrl+F5. Visual Studio, after compiling 
the Web site, launches the browser and displays De-
fault.aspx. You will need to sign in using your Win-
dows Live ID. After you are signed-in, the Contacts 
control renders your contacts from messenger and 
Hotmail.
Fig
u
r
e
2 shows the Contacts control with 
its default settings.
Sharing 
C
ontacts 
D
ata
The Contacts control maintains secure data isola-
tion between Windows Live Contacts and your Web 
site.
The control fetches your user’s contacts data from 
Windows Live servers via a secure HTTPS connec-
tion. The user selects the contacts that they want 
to share with your Web site, initiates the sharing of 
data, and reviews what data is being shared. Only 
then is any data released to your Web site.
Another key aspect that requires special mention is 
the privacy statement for your Web site. The
Con-
tacts
control
req
u
ires
that
yo
u
provide
a
privacy
statement
URL. The Contacts control renders a 
privacy statement URL to the user while transfer-
ring contact information to your Web site. In your 
privacy statement, you must clearly state the usage 
of the data being transferred. You can either dis-
card this data after use or store it in your servers for 
future usage. If you choose to store the data, you 
should clearly state this in your privacy statement 
and provide a means for the user to review or delete 
the stored data.
To enable  sharing contacts data for  the  shipping 
address scenario as mentioned earlier, you would 
need to:
Figure 2: Th
e
C
ont
a
cts control 
(Til
e
List vi
e
w).
Figure 3: Al
e
rt m
e
ss
a
g
e
showing 
cont
a
ct d
e
t
a
ils.
A key aspect to note 
i
s that the user 
i
i
n contro
l
of the
i
r data.
You  can  also  specify  similar  processing  logic  in 
server-side code. The Contacts control offers a cor-
responding server-side event for processing data re-
ceived from the transfer (Lis
t
i
n
g
1).
70
www.cod
e
-m
a
g
a
z
in
e
.com
G
e
tting St
a
rt
e
d with th
e
Windows Liv
e
Tools
Writing 
C
ontacts 
D
ata
The Contacts control allows you to write into a user’s 
address book. For example, a Web page may allow 
users to transfer Contacts data from their Web site 
to Windows Live Contacts. When modifi cations are 
being attempted to a user’s address book, an alert is 
raised notifying the user. Users are then required to 
review the modifi cation and approve. Once approved, 
the modifi cations are transmitted to Windows Live 
servers via a secure HTTPS connection. Again, the 
user is in control of their data in this case as well.
For example, adding a contact to a signed-in user’s 
address book is very simple.  The Contacts  control 
provides the CreateContact  method, which takes a 
list of contacts (List<Contact>). The Microsoft.Live.
ServerControls namespace contains the defi nition 
of  the Contact  class. The Contact  class  has mem-
ber  properties  that  represent  a  contact’s  data  ele-
ments. A complete list of data elements is available at 
http://de
v
.li
v
e.
c
om/tool
s
/
c
onta
c
t
s
api.a
s
p
x
.
To demonstrate this, refer to Lis
t
ing
2 and Lis
t
ing 3. 
Lis
t
ing
2 shows Default.aspx and Lis
t
ing
3 shows 
Default.aspx.cs. Default.aspx has a Contacts control, 
an update panel, a text box where users can input 
e-mail for the contact to be added, and three button 
controls: adding a contact, adding a list of contacts, 
and deleting contacts.
The declaration for the Contacts control on the de-
fault.aspx Web page would look like:
<live:Contacts ID="Contacts1" runat="server"
DataDesired="fi rstname, lastname,
personalstreet, personalcity,
personalstate, personalcountry,
personalpostalcode"
Height="500px"
PrivacyStatementURL="~/privacyPolicy.htm"
View="List"
Width="250px"
OnClientData="Contacts1_OnClientData"
OnServerData="Contacts1_OnServerData" />
protected void Contacts1_OnServerData(object sender, 
ServerDataEventArgs e)
{
foreach (Microsoft.Live.ServerControls.Contact objContact in e.Contacts)
{
//Implement custom processing for the contacts received
CustomProcessingForContact(objContact.FirstName,
objContact.LastName,
objContact.PersonalStreet,
objContact.PersonalState,
objContact.PersonalPostalCode,
objContact.PersonalCountry);
}
}
Li
s
ting 1: Th
e
O
nS
e
rv
e
rD
a
t
a
e
v
e
nt h
a
ndl
e
r.
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="Microsoft.Live.ServerControls"
Namespace="Microsoft.Live.ServerControls" TagPrefi x="live" %>
<html xmlns=http://www.w3.org/1999/xhtml
xmlns:devlive="http://dev.live.com">
<head runat="server">
<title>CoDe Magazine Article</title>
</head>
<body>
<form id="frmDemoArticle" runat="server">
<asp:ScriptManager ID="scmMgr" runat="server">
</asp:ScriptManager>
<script type="text/javascript">
function Contacts1_OnClientData(sender, args)
{
var s = args.contacts.length+ " records\r\n";
for (var i = 0; i < args.contacts.length; i++){
for (var j in args.contacts[i]){
s += j + ": " + args.contacts[i][j]+"\r\n";
}
s += "\r\n";
}
alert(s);
}
function Contacts1_OnClientCommit(sender, args){
alert('Contacts1_OnClientCommit event signaled');
}
</script>
<div>
<live:Contacts ID="Contacts1" runat="server"
DataDesired="fi rstname, lastname, personalstreet,
personalcity, personalstate, personalcountry,
personalpostalcode"
Height="350px" Width="250px" View="List"
PrivacyStatementURL="~/privacyPolicy.htm"
OnClientData="Contacts1_OnClientData"
OnClientCommit="Contacts1_OnClientCommit"
OnServerData="Contacts1_OnServerData"
OnServerCommit="Contacts1_OnServerCommit" />
<br />
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:TextBox ID="txtEmail" runat="server"
Height="26px" Width="160px">
</asp:TextBox>&nbsp;&nbsp;
<asp:Button ID="btnAdd" runat="server"
Height="26px" Text="Add Contact"
onclick="btnAdd_Click" />
<br /><br />
<asp:Button ID="btnAddList" runat="server"
Text="Add List of Contacts"
onclick="btnAddList_Click" />&nbsp; &nbsp;
<asp:Button ID="btnDeleteList" runat="server"
Text="Delete List of Contacts"
onclick="btnDeleteList_Click" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAdd"
EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="btnAddList"
EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="btnDeleteList"
EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
Li
s
ting 2: D
e
f
a
ult.
a
spx.
Documents you may be interested
Documents you may be interested