web api pdf : Reader add text to pdf SDK software project winforms wpf web page UWP

Specific NetOffice notes 
Range, Offset, Resize 
(This may change with Netoffice libraries) 
You can use Application.Range(strAddress) to get a range from any qualified address. 
Be aware that with the ExcelApi.Range type, you MUST change all occurrences of 
.Offset to .get_Offset and .Resize to .get_Resize. 
Dim xCell As NetOffice.ExcelApi.Range, oCell As Object 
ws.Range("B2:D4").Select() '  3 rows, 2 columns 
xCell = Selection 
oCell = Selection 
'Object references work like in VBA 
oCell: Range $B$2:$D$4  
oCell.offset(1, 1): Range $C$3:$E$5 as expected 
oCell.get_offset(1,1): Range $C$3:$E$5 as expected 
'ExcelApi references are different 
xCell: Range $B$2:$D$4 
xCell.offset(1, 1): Range $B$2 ' cell in row 1, col 1 of B2:D4 
xCell.get_offset(1,1): Range $C$3:$E$5 as expected 
xCell.offset(1, 1) is evaluated like this in NetOffice 
rg=xcell            ' B2:D4 
rg=rg.Offset    ' B2:D4 
rg=rg(1,1)        ' B2 
Enumerations and .xl* Constants 
With NetOffice, first import the NetOffice.ExcelApi.Enums module. Then prefix 
enumerated constants with their type, eg XlDirection.xlUp rather than simply xlUp. 
The prefix can be added in VBA as well which may avoid ambiguities like xlVisible 
and xlSheetVisible. 
Change all occurrences of "As Range" in your VBA to "As Excel.Range" and this will 
work the same in both VBA and VB.Net 
.Characters property gives an error 
Class 'NetOffice.ExcelApi.Characters' cannot be indexed because 
it has no default property. 
.Characters(Start:=1, Length:=lPos).Font.ColorIndex = 38 
This is a byproduct of the way the default properties are accessed in Netoffice. As of 
1.5.1, there is no workaround yet. 
To use the global Application object 
1) Do this in a Public Module GlobalHelper 
Property Application As Netoffice.ExcelApi.Application 
2) Do this in a Public module 
Public Module Globals 
' connect the global Application to the Excel instance via ExcelDna 
ReadOnly Property Application As Application 
Reader add text to pdf - SDK software project:C# Create PDF from Text to convert txt files to PDF in, ASP.NET, WinForms, WPF application
Online C# Demo code for Creating PDF from Text
Reader add text to pdf - SDK software project:VB.NET Create PDF from Text to convert txt files to PDF in, ASP.NET, WinForms, WPF application
Empower VB.NET Users to Create PDF File from Text
Application = ExcelDnaUtil.Application 
End Get 
End Property 
End Module 
I need Netoffice.ExcelApi. or I get  
'error BC30561: 'Application' is ambiguous, imported from the namespaces or types 
'System.Windows.Forms, NetOffice.ExcelApi'.  
In VBA, drawing objects are a collection but in Netoffice they are a COMObject 
For Each obj In ws.DrawingObjects gives Error 155 Expression is of type 
'LateBindingApi.Core.COMObject', which is not a collection type. 
' instead use: 
For Each obj In CType(ws, Object).DrawingObjects 
For Netoffice it is also necessary to change some properties to the Excel-Dna get_ 
There may be more. 
VBA accepts a variable number of parameters, eg for .Offset you can specify only a 
row offset and the column offset defaults to 0. They must be specified in Excel-Dna 
so after the search/replace for the .get_ names, some parameters may have to be 
completed. The only one I found irritating was .get_Address which needs five 
parameters so I decided to create a function Range_Address which handles the 
optional parameters and will also convert 0/1 to False/True as required when that kind 
of lazy shortcut was taken when writing the VBA code. 
To do a search and replace of <expression>.Address(…  
Visual Studio regular expressions: Find and Replace 
Notepad++ regular expressions: Search for any text followed by a space or bracket 
then any text followed by .address( and replace it by the first two subexpressions then 
Range_Address( then the text just before .address, which should be the range object 
(.*)([ \(])(.*?)(\.address\() 
Replace with: 
\1\2 Range_Address(\3, 
To index into the wb.Names collection, use .get_Name(index) 
SDK software project:C# PDF insert image Library: insert images into PDF in, ASP
image to PDF in preview without adobe PDF reader installed. How to insert and add image, picture, digital photo scanned signature or logo into PDF document page
SDK software project:C# PDF insert text Library: insert text into PDF content in
adding text to PDF in preview without adobe reader installed in ASP XDoc.PDF for .NET empowers C# developers to add multiple text processing functions
.Sort via the PIA needs at least the first key specified; and orientation if you want it 
sorted top to bottom, eg  
rg.currentregion.sort( Key1:=rg, 
Orientation:=xlSortOrientation.xlSortColumns ) 
The .Sort method in NetOffice was a headache because every possible parameter must 
be specified, unlike VBA where they can be omitted. Isolate this into its own sub: 
ws.Cells(1, 2 ).CurrentRegion.Sort(header:=XlYesNoGuess.xlYes, _ 
key1:=ws.Cells(1, 3 ), order1:=XlSortOrder.xlDescending, _ 
key2:=ws.Cells(1, 2 ), order2:=XlSortOrder.xlDescending, _ 
key3:=ws.Cells(1, 1 ), order3:=XlSortOrder.xlAscending, _ 
dataOption1:=XlSortDataOption.xlSortNormal, _ 
dataOption2:=XlSortDataOption.xlSortNormal, _ 
dataOption3:=XlSortDataOption.xlSortNormal, _ 
matchCase:=False, orderCustom:=Nothing, _ 
orientation:=XlSortOrientation.xlSortColumns, _ 
sortMethod:=XlSortMethod.xlPinYin, type:=Nothing
This has seventeen parameters. If you want to specify one near the end of the list, like 
AddToMRU, in VBA you can simply use named parameters, in VB.Net you must 
specify them all up to that point. You cannot omit them by using two commas in 
succession. You can pass Nothing for all values except 'format' and 'origin' which 
must have some real value, eg 
Workbooks.Open(filename:=strFilename, updateLinks:=False, readOnly:=False, _ 
format:=5, password:=Nothing, writeResPassword:=Nothing, _ 
ignoreReadOnlyRecommended:=Nothing, origin:=2, addToMru:=False, _ 
converter:=Nothing, corruptLoad:=Nothing, delimiter:=Nothing, _ 
editable:=False, local:=Nothing, notify:=Nothing) 
'format:=5 any value from 1-6 will do if it's not a text file 
You cannot specify Format:=Nothing or origin:=Nothing, get: 
System.Runtime.InteropServices.COMException (0x800A03EC): Unable to get the Open 
property of the Workbooks class 
The FileFilter argument consists of pairs of file filter strings followed by the MS-DOS 
wildcard file filter specification, eg "All Files (*.*),*.*". If you omit the comma, 
Excel silently errors and the ExcelDna app hangs. 
SDK software project:VB.NET PDF insert image library: insert images into PDF in
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
SDK software project: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.
Stage 4: Creating an add-in with Ribbon commands 
The above examples show an old Excel 2003 style menu button. It's time to create an 
addin with a Ribbon button that does more work with Excel. 
We shall create an add-in to list the names of sheets to a worksheet named $TOC 
Create the standard ExcelDna project with the name WorkbookTOC. 
Project > Add Reference > navigate to the Excel 2010 version of the PIA, in this case 
Project > Add New Item, Module, name it WorkbookTOC.vb. 
Enter the following test code; we will replace it with real code later. 
Public Module WorkbookTOC 
Sub CreateTableOfContents() 
End Sub 
End Module 
Edit the standard .dna text file you created named WorkbookTOC.Dna and copy in 
the text below. The ExternalLibrary WorkbookTOC.dll will be created when you 
build the project. The CustomUI contains the Ribbon markup which adds a group to 
the Excel Ribbon with one button with a standard MSO image and an onAction that 
calls a standard ExcelDna method that in turn calls (with no parameter) the macro 
named in the tag. 
<DnaLibrary Language="VB" Name="Table of Contents Add-in" 
<ExternalLibrary Path="WorkbookTOC.dll" /> 
<!--Note the <CustomUI> with a capital ‘C’ tag that encloses the 
with a small ‘c’ tag that saved in the .xll. --> 
<customUI xmlns=""> 
<ribbon startFromScratch="false"> 
<tab idMso="TabReview"> 
<group id="WorkbookTOC" label="TOC" insertAfterMso="GroupEditingExcel"> 
<button id="CreateTableOfContents" tag="CreateTableOfContents" 
onAction="RunTagMacro" label="&amp;Table of Contents"  
screentip="Insert Table of Contents worksheet" size="large" 
imageMso="TableOfFiguresInsert" /> 
To support the Excel 2007/2010 ribbon, add a Class module Ribbon.vb with a Public 
class for the Ribbon handler.   
The ExcelRibbon-derived class must also be marked as ComVisible(True), or in the 
project properties, advanced options, the ComVisible option must be checked. This is 
not the ‘Register for COM Interop’ option, which mu st never be used with ExcelDna. 
SDK software project: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
SDK software project: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.
Imports ExcelDna.Integration 
Imports System.Runtime.InteropServices      ' for <ComVisible(True)>  
<ComVisible(True)> _ 
Public Class Ribbon    ' must be Public 
Inherits CustomUI.ExcelRibbon 
End Class 
If you use any other onAction procedure than "RunTagMacro", put it inside the 
Ribbon class because only subs in this class are visible to the Ribbon onAction. It is 
also the only way to pass the calling Ribbon control to the sub, for example: 
<ComVisible(True)> _ 
Public Class Ribbon 
Inherits ExcelRibbon 
Sub RunControlID(ByVal ctl As IRibbonControl) 
End Sub 
Sub RunControlIDWithTag(ByVal ctl As IRibbonControl
ExcelDnaUtil.Application.Run(ctl.Id, ctl.Tag) 
End Sub 
End Class 
Test the project with F5. After enabling the macros, you should see a button to the 
right of the Review group that displays the test message. If you don't, look at the 
Ribbon troubleshooting guide
Having got the skeleton right, now we'll add the code to create the TOC. 
It should look like this: 
SDK software project: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.
SDK software project:VB.NET PDF Text Add Library: add, delete, edit PDF text in
Read: PDF Image Extract; VB.NET Write: Insert text into PDF; Add Image to PDF; VB.NET Protect: Add Password to C#; XImage.OCR for C#; XImage.Barcode Reader for
Imports ExcelDna.Integration         ' for ExcelDnaUtil, ExcelCommand, XlCall, etc 
Imports Microsoft.Office.Interop.Excel  ' Interface types from PIA eg Workbook, Range 
'instead of Imports ExcelDna.Integration.ExcelDnaUtil create this global helper 
' because 'Application' is ambiguous between ExcelDnaUtil and Interop.Excel 
Public Module Globals 
' connect the global Application to the Excel instance via ExcelDna 
ReadOnly Property Application As Application 
Application = ExcelDnaUtil.Application 
End Get 
End Property 
End Module 
Public Module WorkbookTOC 
Const WS_TOC_NAME = "$TOC" 
Sub CreateTableOfContents() 
Dim wsDoc As Worksheet = Nothing 
'Structured Error Handling (SEH): 
If Application.ActiveWorkbook Is Nothing Then 
Exit Sub 
End If 
If SheetExists(WS_TOC_NAME) Then 
End If 
wsDoc = Application.Worksheets.Add() 
wsDoc.Name = WS_TOC_NAME 
Catch ex As Exception 
Dim Message As String = ex.Message 
If StrComp(Message, "See inner exception(s) for details.", vbTextCompare) = 0 Then 
Message = ex.InnerException.Message 
End If 
Message = Message & vbLf & ex.StackTrace 
MsgBox(Message, MsgBoxStyle.Exclamation, ex.Source) 
End Try 
End Sub 
Sub CreateTableOfSheetsInfo(ByVal wsDoc As Worksheet
Dim wbCheck As Workbook 
Dim ws As Worksheet, lRow As Long 
Dim lSheet As Long, lCol As Long, rgFound As Range, sTemp As String 
wbCheck = wsDoc.Parent 
On Error GoTo OnError 
Application.EnableCancelKey = XlEnableCancelKey.xlErrorHandler 
Application.Calculation = XlCalculation.xlCalculationManual 
Application.Cursor = XlMousePointer.xlWait 
Application.ScreenUpdating = False 
' Simplified version of columns, add CodeName or other stats if you like 
If SheetIsEmpty(wsDoc) Then 
lRow = 1 
lRow = wsDoc.Cells.SpecialCells(XlCellType.xlCellTypeLastCell).Row + 1 
End If 
lCol = 1 
' using Array() UDF for VBA compatibility 
WriteHeadings(wsDoc.Cells(lRow, lCol), _ 
SDK software project:C# PDF Sticky Note Library: add, delete, update PDF note in
Evaluation library and components enable users to annotate PDF without adobe PDF reader control installed. Able to add notes to PDF using C# source code in
SDK software project:C# PDF Text Add Library: add, delete, edit PDF text in, ASP
Read: PDF Image Extract; VB.NET Write: Insert text into PDF; Add Image to PDF; VB.NET Protect: Add Password to C#; XImage.OCR for C#; XImage.Barcode Reader for
Array("Sheet""Type""Sheet Tab Name", "Visibility""Contents""Sum Total"
wsDoc.Cells(lRow, lCol).AddComment(CStr(Now())) 
For lSheet = 1 To wbCheck.Sheets.Count 
lRow = lRow + 1 
lCol = 0 
lCol = lCol + 1 
wsDoc.Cells(lRow, lCol).Value = lSheet 
lCol = lCol + 1 
wsDoc.Cells(lRow, lCol).Value = TypeName(wbCheck.Sheets(lSheet)) 
'Tab name with hyperlink to ws 
lCol = lCol + 1 
'ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, Address:= "F:\DOCS\TEST\ex1u.xls", _ 
'   SubAddress:="'Budget 08'!C69", TextToDisplay:="C69" 
' must specify all named parameters up to last one used, unlike VBA 
If TypeName(wbCheck.Sheets(lSheet)) = "Worksheet" Then 
wsDoc.Hyperlinks.Add(anchor:=wsDoc.Cells(lRow, lCol), _ 
address:=wbCheck.FullName, _ 
subAddress:=QuotedName(wbCheck.Sheets(lSheet).name) & "!A1", _ 
screenTip:=wbCheck.Sheets(lSheet).Name, _ 
textToDisplay:="'" & wbCheck.Sheets(lSheet).Name) 
End If 
Select Case wbCheck.Sheets(lSheet).Visible 
Case XlSheetVisibility.xlSheetHidden   ' was .xlHidden 
sTemp = "Hidden" 
Case XlSheetVisibility.xlSheetVeryHidden ' was . xlVeryHidden 
sTemp = "Very Hidden" 
Case Else 
sTemp = "Visible" 
End Select 
lCol = lCol + 1 
wsDoc.Cells(lRow, lCol).Value = sTemp 
lCol = lCol + 1 
' this section only for worksheets 
If TypeName(wbCheck.Sheets(lSheet)) = "Worksheet" Then 
ws = wbCheck.Sheets(lSheet) 'WS is type Worksheet 
If (ws Is wsDoc) Then ' skip THIS sheet being created 
wsDoc.Cells(lRow, lCol).Value = "(This sheet)" 
'Contents of first occupied cell 
If Not SheetIsEmpty(ws) Then  '  ws.UsedRange.Cells.Count > 0 Then 
' protect against empty sheet giving nonsense usedrange $U$1:$T$58 
rgFound = ws.Cells(1, 1) 
sTemp = CStr(rgFound.Value) 
' .text may show #### if narrow column and .value of date>2M may give 
overflow err 6 
If Len(sTemp) = 0 Then 
' don't use not IsEmpty(rgFound.Value) because single apostrophe  
'   or ="" return false, we want some text 
rgFound = FindFirst(ws.UsedRange, "*"XlFindLookIn.xlFormulas, 
' find anything starting top left used range 
If Not rgFound Is Nothing Then 
sTemp = CStr(rgFound.Value) 
End If 
End If 
wsDoc.Cells(lRow, lCol).Value = "'" & sTemp 
End If 
'Sum Total 
lCol = lCol + 1 
With wsDoc.Cells(lRow, lCol) 
.Formula = ("=sum(" & QuotedName(ws.Name) & "!" & ws.UsedRange.Address(True
True) & ")"
.Value = .Value ' convert to values; remove this if you want it to recalc 
.NumberFormat = "General" ' in case dates in source 
End With 
' #Rows, #Cols in used range (may not be real last occupied cell) 
rgFound = ws.Cells.SpecialCells(XlCellType.xlCellTypeLastCell) 
If Not SheetIsEmpty(ws) Then ' show blanks if empty sheet 
lCol = lCol + 1 
wsDoc.Cells(lRow, lCol).Value = rgFound.Row 
lCol = lCol + 1 
wsDoc.Cells(lRow, lCol).Value = rgFound.Column 
End If 
End If ' being checked 
ElseIf TypeName(wbCheck.Sheets(lSheet)) = "Chart" Then 
With wbCheck.Sheets(lSheet) 
If .HasTitle Then 
sTemp = "Chart Title:" & "'" & .ChartTitle.Text & "'" 
sTemp = "No Chart Title" 
End If 
sTemp = sTemp & ", " & .SeriesCollection.Count & " Series" 
End With 
wsDoc.Cells(lRow, lCol).Value = "'" & sTemp 
' not a worksheet, or Chart, what is it? Dialog? Macro? 
End If 
Next lSheet 
GoTo Exitproc 
Select Case ErrorHandler() 
Case vbYes, vbRetry : Stop : Resume 
Case vbNo, vbIgnore : Resume Next 
Case Else : Resume Exitproc ' vbCancel 
End Select 
On Error GoTo 0 ' restore any screenupdating etc 
Application.Calculation = XlCalculation.xlCalculationAutomatic 
Application.Cursor = XlMousePointer.xlDefault 
Application.ScreenUpdating = True 
End Sub 
Function SheetExists(ByVal sName As StringAs Boolean  ' check for any type of sheet - 
worksheet, chart 
On Error Resume Next 
SheetExists = (StrComp(sName, Application.ActiveWorkbook.Sheets(sName).Name, 
vbTextCompare) = 0) ' 0=matches 
End Function 
Function SheetIsEmpty(ByVal ws As WorksheetAs Boolean '-As Worksheet 
Dim rg As Range 
rg = ws.UsedRange 
If rg.CountLarge() = 1 Then  ' only 1 cell, probably A1 
SheetIsEmpty = IsEmpty(CStr(rg.Value)) 
SheetIsEmpty = False 
End If 
End Function 
Function Array(ByVal ParamArray items() As ObjectAs Array 
Return items 
End Function 
Sub WriteHeadings(ByVal StartCell As RangeByVal aHeadings As Object
With StartCell.Resize(1, UBound(aHeadings) - LBound(aHeadings) + 1) 
.Value = aHeadings 
.Font.Bold = True 
End With 
End Sub 
Private Function IsEmpty(ByVal p1 As StringAs Boolean ' for VBA compatibility 
Return String.IsNullOrEmpty(p1) 
End Function 
Function FindFirst(ByVal rgSearch As RangeByVal vWhat As ObjectByVal lLookIn As Long
ByVal lLookAt As LongAs Range 
On Error Resume Next ' should check for err=0 or err=1004 being only two expected 
' After:=rg.SpecialCells(xlCellTypeLastCell) means the first found could be first cell 
in range 
FindFirst = rgSearch.Find(What:=vWhat, 
After:=rgSearch.SpecialCells(XlCellType.xlCellTypeLastCell), _ 
LookIn:=lLookIn, LookAt:=lLookAt, _ 
SearchOrder:=XlSearchOrder.xlByRows, SearchDirection:=XlSearchDirection.xlNext, 
MatchCase:=False', SearchFormat:=False) 
Debug.Assert(Err.Number = 0 Or Err.Number = 1004 Or Application.ThisWorkbook.IsAddin) 
End Function 
Function ErrorHandler() 
Dim sErrMsg As String 
sErrMsg = "Error " & Err.Number & IIf(Erl() = 0, """ at line " & Erl()) & " " & 
ErrorHandler = MsgBox(sErrMsg, vbAbortRetryIgnore, "Error"
End Function 
Function QuotedName(ByVal sName As StringAs String ' return a  name properly quoted 
QuotedName = "'" & Replace(sName, "'""'" & "'") & "'" ' Dec'08 --> 'Dec''08', My 
Budget --> 'My Budget' 
End Function 
End Module 
Tips and workarounds 
One of my Excel VBA add-ins had 13,000 lines of code and took about two weeks 
(full-time equivalent) to convert to VB.Net using Visual Studio 2010, Excel-Dna 0.29 
and NetOffice 1.50. Bear in mind that the supporting libraries are being constantly 
updated so check for changes in more recent version of Excel-Dna and NetOffice. The 
following list of tips and gotchas was built up from that experience. 
Fix these first in VBA before doing the migration 
The first group are changes that are safe to make in VBA but will make the transition 
to VB.Net much safer. Fix any issues with Option Base 1 and ByRef first. 
Option Base and Array() 
In VBA, the default lower bound of an array dimension is 0 (zero). Using Option 
Base, you can change this to 1. In Visual Basic .NET, the Option Base statement is 
not supported, and the lower bound of every array dimension must be 0. Additionally, 
you cannot use ReDim as an array declaration. One thing to keep in mind when 
working with Office collections from Visual Basic .NET is that the lower array 
bounds of most Office collections begin with 1. 
When I was converting some old code with Option base 1 I found it easy to make 
mistakes when converting to the 0-based arrays of so I replaced the array by a 
class that contained the properties I had been storing in an array. The VBA function 
Array() can be replicated by defining an Array() function in a GlobalHelpers.vb 
Function Array(ByVal ParamArray items() As ObjectAs Array 
Return items 
End Function 
Or by using literal array syntax  
Dim aHeadings() As String = {"Sheet", "Type", "Sheet Tab Name”} 
When returning variant arrays from ranges, the only types you will get are String, 
Boolean, Number, or Error. Dates are returned as numbers. 
ByVal and ByRef 
VBA defaults to ByRef; VB.Net to ByVal. When passing parameters in VBA, be sure 
to explicitly specify ByRef so this can be preserved when the module is imported into 
VS2010. I used to do that for primitive type variables (String, Long, etc) but found I 
had omitted to do it for Object and Array types. This leads to bugs that can only be 
detected by executing test cases and comparing output with the VBA output. It would 
be nice if VS2010 Express could warn us of variables passed byref but changed in the 
sub. Is this done by tools like Migration Partner and Aivosto Project Analyzer? 
‘Variant’ is no longer a supported type: use the ‘O
bject’ type instead. Or simply Dim 
with no type, which is ugly but compatible with both VBA and VB.NET. If there are 
multiple parameters to a function, and some are declared eg As String, then all must 
be declared, so use As Object where you had nothing in VBA. 
There is no Range type in Excel-Dna so if you are not using NetOffice or the PIA use 
Dim rg As Object.  
Documents you may be interested
Documents you may be interested