[2 days left] What’s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now


Add reference to itextsharp.dll in MS Access

Posted on 2009-05-14
Medium Priority
Last Modified: 2013-11-25
I am hoping to programatically merge PDF files and add bookmarks using itextsharp.dll or itextdonet.dll.

The problem I'm having is that I can't even add a reference to either dll.

Can I use this dll in VBA projects or do I need to create a VB6 project create then a DLL from VB6 and reference the VB6 dll in VBA projects?

Here are the attempts I have made to use the dlls after copying the dlls to C:\windows\system32\:

1) Register the dll
    regsvr32 C:\WINDOWS\system32\itextsharp.dll
   Error = C:\WINDOWS\system32\itextsharp.dll was loaded, but the DllRegisterServer entry point was not found. This file can not be registered.

2) From the Access VBA window Tools/References/Browse
    Chose the dll from C:\windows\system32\
Error = "Can't add a reference to the specified file"
Question by:barefoot_kiwi
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Assisted Solution

michael1174 earned 80 total points
ID: 24388129
It looks like this DLL was written in .NET, and can only be called from .NET.  I would suggest writing a C# console app using this DLL, and then from Access call the c# console app with command line arguments.
LVL 85
ID: 24389967
Or find a library or control that works in Access.

Accepted Solution

barefoot_kiwi earned 0 total points
ID: 24445617
The DLL was written in C#. Since I have no idea what a console app in C# is I changed my perspective to solve the problem. The following code is a working prototype using web page in aspx that will be upgraded to accept dynamic file listings in future. The function combines a collection of pdf files into one pdf file and adds a bookmark (chapter) for each file that is added. It also appends the page number to the center of each page from page 2 to page n.

Web.config file
<add namespace="itextsharp"/>
<add namespace="itextsharp.text"/>
<add namespace="itextsharp.text.pdf"/>
<add namespace="itextsharp.text.pdf.PdfReader"/>
<add namespace="iTextSharp.text.rtf"/>
<add namespace="iTextSharp.text.rtf.HeaderFooter"/>
Partial Class _Default
    Inherits System.Web.UI.Page
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strSource(3) As String
        Dim strDest As String = "C:\Inetpub\wwwroot\iText\docs\book.pdf"
        strSource(0) = "C:\data\Title Page.pdf"
        strSource(1) = "C:\data\Programs By Date.pdf"
        strSource(2) = "C:\data\Programs By Type.pdf"
        strSource(3) = "C:\data\LHM Programs.pdf"
        MergePdfFiles(strSource, strDest)
    End Sub
    Function MergePdfFiles(ByVal pdfFiles() As String, ByVal outputPath As String) As Boolean
        Dim result As Boolean = False
        Dim pdfCount As Integer = 0 'total input pdf file count
        Dim f As Integer = 0 'pointer to current input pdf file
        Dim fileName As String = String.Empty 'current input pdf filename
        Dim reader As iTextSharp.text.pdf.PdfReader = Nothing
        Dim pageCount As Integer = 0 'cureent input pdf page count
        Dim pdfDoc As iTextSharp.text.Document = Nothing 'the output pdf document
        Dim writer As PdfWriter = Nothing
        Dim cb As PdfContentByte = Nothing
        Dim strBookMark As String = ""
        'Declare a variable to hold the imported pages
        Dim page As PdfImportedPage = Nothing
        Dim rotation As Integer = 0
        'Declare a font to used for the bookmarks
        Dim bookmarkFont As iTextSharp.text.Font = iTextSharp.text.FontFactory.GetFont(iTextSharp.text.FontFactory.HELVETICA, _
        1, iTextSharp.text.Font.BOLD, iTextSharp.text.Color.WHITE)
            pdfCount = pdfFiles.Length
            If pdfCount > 1 Then
                'Open the 1st pad using PdfReader object
                fileName = pdfFiles(f)
                reader = New iTextSharp.text.pdf.PdfReader(fileName)
                'Get page count
                pageCount = reader.NumberOfPages
                'Instantiate an new instance of pdf document and set its margins. This will be the output pdf.
                'NOTE: bookmarks will be added at the 1st page of very original pdf file using its filename. The location
                'of this bookmark will be placed at the upper left hand corner of the document. So you'll need to adjust
                'the margin left and margin top values such that the bookmark won't overlay on the merged pdf page. The 
                'unit used is "points" (72 points = 1 inch), thus in this example, the bookmarks' location is at 1/4 inch from
               'The font colour is white so the user doesn't see it, change it using variable bookmarkFont 
                'left and 1/4 inch from top of the page.
                pdfDoc = New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1), 18, 18, 18, 18)
                'Instantiate a PdfWriter that listens to the pdf document
                writer = PdfWriter.GetInstance(pdfDoc, New IO.FileStream(outputPath, IO.FileMode.Create))
                'Set metadata and open the document
                With pdfDoc
                    .AddAuthor("Your name here")
                    .AddCreator("Your program name here")
                    .AddSubject("Whatever subject you want to give it")
                    'Use the filename as the title... You can give it any title of course.
                    'Add keywords, whatever keywords you want to attach to it
                    .AddKeywords("Report, Merged PDF, " & IO.Path.GetFileName(outputPath))
                End With
                'Instantiate a PdfContentByte object
                cb = writer.DirectContent
                'Now loop thru the input pdfs
                While f < pdfCount
                    'Declare a page counter variable
                    Dim i As Integer = 0
                    'Loop thru the current input pdf's pages starting at page 1
                    While i < pageCount
                        i += 1
                        'Get the input page size
                        'Create a new page on the output document
                        'If it is the 1st page, we add bookmarks to the page
                        If i = 1 Then
                            'First create a paragraph using the filename as the heading
                            strBookMark = Replace(IO.Path.GetFileName(fileName), ".pdf", "")
                            Dim para As New iTextSharp.text.Paragraph(strBookMark, bookmarkFont)
                            'Then create a chapter from the above paragraph
                            Dim chpter As New iTextSharp.text.Chapter(para, f + 1)
                            'Finally add the chapter to the document
                        End If
                        'Now we get the imported page
                        page = writer.GetImportedPage(reader, i)
                        'Read the imported page's rotation
                        rotation = reader.GetPageRotation(i)
                        'Then add the imported page to the PdfContentByte object as a template based on the page's rotation
                        If rotation = 90 Then
                            cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(i).Height)
                        ElseIf rotation = 270 Then
                            cb.AddTemplate(page, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(i).Width + 60, -30)
                            cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0)
                        End If
                        Dim footPhraseImg As Phrase = New Phrase("Page ", FontFactory.GetFont(FontFactory.HELVETICA, 10, iTextSharp.text.Font.NORMAL))
                        Dim footer As HeaderFooter = New HeaderFooter(footPhraseImg, True)
                        footer.Border = iTextSharp.text.Rectangle.NO_BORDER
                        footer.Alignment = Element.ALIGN_RIGHT
                        pdfDoc.Footer = footer
                    End While
                    'Increment f and read the next input pdf file
                    f += 1
                    If f < pdfCount Then
                        fileName = pdfFiles(f)
                        reader = New iTextSharp.text.pdf.PdfReader(fileName)
                        pageCount = reader.NumberOfPages
                    End If
                End While
                'When all done, we close the documwent so that the pdfwriter object can write it to the output file
                result = True
            End If
        Catch ex As Exception
        End Try
        Return result
    End Function
End Class

Open in new window


Expert Comment

ID: 33629942
I successfully implemented the solution proposed by michael1174, however I have one question.  Is one limited to 256 characters when calling the console app with arguments. In other words if I have a ton of fields to fill in on a given PDF, am I at all limited to the number I may pass to my console app as arguments?

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In Part II of this series, I will discuss how to identify all open instances of Excel and enumerate the workbooks, spreadsheets, and named ranges within each of those instances.
Instead of error trapping or hard-coding for non-updateable fields when using QODBC, let VBA automatically disable them when forms open. This way, users can view but not change the data. Part 1 explained how to use schema tables to do this. Part 2 h…
In this fourth video of the Xpdf series, we discuss and demonstrate the PDFinfo utility, which retrieves the contents of a PDF's Info Dictionary, as well as some other information, including the page count. We show how to isolate the page count in a…
Add bar graphs to Access queries using Unicode block characters. Graphs appear on every record in the color you want. Give life to numbers. Hopes this gives you ideas on visualizing your data in new ways ~ Create a calculated field in a query: …
Suggested Courses

649 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question