Learn how to create and edit PDF documents in VB.Net applications and websites.  A frich tutorial with code examples.

VB PDF ASP.NET

February 20th 2018 by Veronica Sillar

VB.Net PDF Tutorial

How to Generate and Edit PDF files in VB.Net

In this article we will be looking at an elegant solution to create and edit PDF files with VB.Net Code.

This technique is equally valid for use in ASP.Net Web Apps as well as Console applications, Windows Services and Desktop Programs.

The pre-requisites are a Visual Basic .Net development Environment such as Microsoft Visual Studio Community. We will create solution projects to targeting .Net Framework 4 and above.

VB.Net Pdf library Installation

To get started we will install the popular .Net PDF generation and editing library “IronPDF”.

Nuget Installer Method In Visual Studio, we can right-click on any existing VB.Net project References (targeting Framework 4 or above) in the "Solution Explorer" toolbar in Visual Studio and select "Manage NuGet Packages…" from the dropdown menu.

Search for the “ironpdf” (IronPDF) package and install the latest stable version.

PM > Install-Package IronPdf 

Full details are available on Microsoft's .Net DLL repository: https://www.nuget.org/packages/IronPdf

DLL Method Alternatively, IronPDF can be downloaded as a DLL with an accompanying CHM manual from http://ironpdf.com/packages/IronPdf.zip. This may be installed to a project as a dependency, or globally to the machine’s Global Assembly Cache.

Quick Start - Create your first .Net PDF

Using Visual Basic .Net to create a PDF file for the first time is surprising easy compared to libraries with proprietary design API’s such as iTextSharp.

We can use HTML (with a pixel perfect rending engine based on Google Chromium) to define the content of our PDF and simply render it to a file.

Here is our simplest code to create a PDF in .Net:

Module Module1

    Sub Main()
        Dim renderer = New IronPdf.HtmlToPdf()
        Dim document = renderer.RenderHtmlAsPdf("<h1> My First PDF in VB.Net</h1>")
        document.SaveAs("MyFirst.pdf")
    End Sub

End Module
VB.NET

This will produce a .Net generated PDF file containing your exact text, albeit lacking is design elegance yet.

We can improve upon this code by adding the header line Imports IronPdf. By adding the ending line of code with System.Diagnostics.Process.Start we also open the PDF in the operating system's default PDF viewer to make the project more meaningful.

Imports IronPdf

Module Module1

    Sub Main()
        Dim renderer = New HtmlToPdf()
        Dim document = renderer.RenderHtmlAsPdf("<h1> My First PDF in VB.Net</h1>")
        document.SaveAs("MyFirst.pdf")
        System.Diagnostics.Process.Start("MyFirst.pdf")
    End Sub

End Module
VB.NET

An alternative method would be to render any existing web page from URL to a PDF using the elegant “RenderUrlAsPdf” method from IronPdf.

Imports IronPdf

Module Module1

    Sub Main()
        Dim renderer = New HtmlToPdf()
        Dim document = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf/")
        document.SaveAs("UrlToPdf.pdf")
        System.Diagnostics.Process.Start("UrlToPdf.pdf")
    End Sub

End Module
VB.NET

VB.Net PDF Styling

To style our PDF content in VB.Net, we can make full use of CSS, javascript and images. We may link to local assets, or even to remote or CDN based assets such as Google Fonts.

For advanced designs I suggest we have a 2 stage process.

  1. First we will develop and design our HTML perfectly. This task may involve in-house design staff, splitting the work in half.
  2. Render that file as a PDF using VB.Net and out PDF Library

The VB.Net Code to render the HTML file as a PDF:

This method renders an HTML document as is it were opened as a file (file:// protocol).

Imports IronPdf

Module Module1

    Sub Main()
        Dim renderer = New HtmlToPdf()
        renderer.PrintOptions.CssMediaType = PdfPrintOptions.PdfCssMediaType.Print
        renderer.PrintOptions.PrintHtmlBackgrounds = False
        renderer.PrintOptions.PaperOrientation = PdfPrintOptions.PdfPaperOrientation.Landscape
        renderer.PrintOptions.RenderDelay = 150

        Dim document = renderer.RenderHTMLFileAsPdf("C:\Users\jacob\Dropbox\Visual Studio\Tutorials\VB.Net.Pdf.Tutorial\VB.Net.Pdf.Tutorial\slideshow\index.html")
        document.SaveAs("Html5.pdf")
        System.Diagnostics.Process.Start("Html5.pdf")
    End Sub

End Module
VB.NET

We might also shorten that URL by adding a project relative file path such as:

 Dim document = renderer.RenderHTMLFileAsPdf("..\..\slideshow\index.html")
VB.NET

You can see that the HtmlToPdf renderer has a PrintOptions object which we use in this example to:

  • Set the CSS media type to 'print' so we see no screen-only CSS3 styles
  • Ignore HTML backgrounds
  • Set the PDF's virtual paper to Landscape orientation
  • Add a small delay in rendering for the javascript to finish processing

Our Example HTML File using javascript, CSS3 and images. This HTML creates a dynamic, mobile aware slide-show and was found at https://github.com/leemark/better-simple-slideshow

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>A simple DIY responsive slideshow made with HTML5, CSS3, and JavaScript</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href='http://fonts.googleapis.com/css?family=Open+Sans|Open+Sans+Condensed:700' rel='stylesheet' type='text/css'>
        <link rel="stylesheet" href="demo/css/demostyles.css">
        <link rel="stylesheet" href="css/simple-slideshow-styles.css">
    </head>
    <body>
        <!--[if lt IE 8]>
            <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
        <![endif]-->
        <header>
            <h1>A Better Simple Slideshow</h1>
            <p><span class="desc">A simple DIY responsive JavaScript slideshow.</span> [<a href="https://github.com/leemark/better-simple-slideshow">GitHub<span> repo</span></a>]</p>
        </header>    
        <div class="bss-slides num1" tabindex="1" autofocus="autofocus">
            <figure>
              <img src="demo/img/medium.jpg" width="100%" /><figcaption>"Medium" by <a href="https://www.flickr.com/photos/thomashawk/14586158819/">Thomas Hawk</a>.</figcaption> 
            </figure>
            <figure>
              <img src="demo/img/colorado.jpg" width="100%" /><figcaption>"Colorado" by <a href="https://www.flickr.com/photos/stuckincustoms/88370744">Trey Ratcliff</a>.</figcaption> 
            </figure>
            <figure>
              <img src="demo/img/monte-vista.jpg" width="100%" /><figcaption>"Early Morning at the Monte Vista Wildlife Refuge, Colorado" by <a href="https://www.flickr.com/photos/davesoldano/8572429635">Dave Soldano</a>.</figcaption> 
            </figure>
            <figure>
              <img src="demo/img/sunrise.jpg" width="100%" /><figcaption>"Sunrise in Eastern Colorado" by <a href="https://www.flickr.com/photos/35528040@N04/6673031153">Pam Morris</a>.</figcaption> 
            </figure>
            <figure>
              <img src="demo/img/colorado-colors.jpg" width="100%" /><figcaption>"colorado colors" by <a href="https://www.flickr.com/photos/cptspock/2857543585">Jasen Miller</a>.</figcaption> 
            </figure>
        </div> <!-- // bss-slides -->  
<div class="content">
<h2>What is it?</h2>

<p>It's a fairly basic slideshow, written in javascript. This is a dual-purpose project, it's meant to be something you can drop right into your page and use if you so choose, but it's also meant as an example/tutorial script showing how to build a simple DIY slideshow from scratch on your own. <a href="http://themarklee.com/2014/10/05/better-simple-slideshow/">Here is a tutorial/walkthrough</a>.</p>

<h2>Features</h2>
<ul>
    <li>fully responsive</li>
    <li>option for auto-advancing slides, or manually advancing by user</li>
    <li>multiple slideshows per-page</li>
    <li>supports arrow-key navigation</li>
    <li>full-screen toggle using HTML5 fullscreen api</li>
    <li>swipe events supported on touch devices (requires <a href="https://github.com/hammerjs/hammer.js">hammer.js</a>)</li>
    <li>written in vanilla JS--this means no jQuery dependency (much &hearts; for <a href="https://github.com/jquery/jquery">jQuery</a> though!)</li>
</ul>

<h2>Getting Started</h2>
<ol>
<li><p>HTML markup for the slideshow should look basically like this, with a container element wrapping the whole thing (doesn't have to be a <span class="code">&lt;div&gt;</span>) and each slide is a <span class="code">&lt;figure&gt;</span>.</p>

<script src="https://gist.github.com/leemark/83571d9f8f0e3ad853a8.js"></script> </li>   

<li>Include the script: <span class="code">js/better-simple-slideshow.min.js</span> or <span class="code">js/better-simple-slideshow.js</span></li>
<li>Include the stylesheet <span class="code">css/simple-slideshow-styles.css</span></li>
<li>Initialize the slideshow:
<script src="https://gist.github.com/leemark/479d4ecc4df38fba500c.js"></script>
</li>
</ol>
<h2>Options</h2>

To customize functionality, create an options object, then pass it into <span class="code">makeBSS()</span> as the second argument, as seen below:

<script src="https://gist.github.com/leemark/c6e0f5c47acb7bf9be16.js"></script>

<h2>Demo/Examples</h2>
    <h3>Example #1 (slideshow at top of this page)</h3>
    <p>HTML markup:</p>
    <script src="https://gist.github.com/leemark/19bafdb1abf8f6b4e147.js"></script>
    <p>JavaScript code:</p>
    <script src="https://gist.github.com/leemark/a09d2726b5bfc92ea68c.js"></script>

    <h3>Example #2 (below)</h3>
        <div class="bss-slides num2" tabindex="2">
           <figure>
              <img src="http://themarklee.com/wp-content/uploads/2013/12/snowying.jpg" width="100%" /><figcaption>"Snowying" by <a href="http://www.flickr.com/photos/fiddleoak/8511209344/">fiddleoak</a>.</figcaption> 
           </figure>
            <figure>
                <img src="http://themarklee.com/wp-content/uploads/2013/12/starlight.jpg" width="100%" /><figcaption>"Starlight" by <a href="http://www.flickr.com/photos/chaoticmind75/10738494123/in/set-72157626146319517">ChaoticMind75</a>.</figcaption> 
           </figure>
           <figure>
              <img src="http://themarklee.com/wp-content/uploads/2013/12/snowstorm.jpg" width="100%" /><figcaption>"Snowstorm" by <a href="http://www.flickr.com/photos/tylerbeaulawrence/8539457508/">Beaulawrence</a>.</figcaption> 
           </figure>
            <figure>
              <img src="http://themarklee.com/wp-content/uploads/2013/12/misty-winter-afternoon.jpg" width="100%" /><figcaption>"Misty winter afternoon" by <a href="http://www.flickr.com/photos/22746515@N02/5277611659/">Bert Kaufmann</a>.</figcaption> 
           </figure>
            <figure>
              <img src="http://themarklee.com/wp-content/uploads/2013/12/good-morning.jpg" width="100%" /><figcaption>"Good Morning!" by <a href="http://www.flickr.com/photos/frank_wuestefeld/4306107546/">Frank Wuestefeld</a>.</figcaption> 
           </figure>
        </div> <!-- // bss-slides --> 

<p>HTML markup:</p>
<script src="https://gist.github.com/leemark/de90c78cb73673650a5a.js"></script>

<p>JavaScript code:</p>
<script src="https://gist.github.com/leemark/046103061c89cdf07e4a.js"></script>

</div> <!-- // content -->   
<footer>Example photos are property of their respective owners, all code is <a href="https://github.com/leemark/better-simple-slideshow/blob/gh-pages/LICENSE">freely licensed for your use</a>. <br>Made especially for you by <a href="http://themarklee.com">Mark Lee</a> aka <a href="http://twitter.com/@therealmarklee">@therealmarklee</a> <br><span>&#9774; + &hearts;</span></footer>        
<script src="demo/js/hammer.min.js"></script><!-- for swipe support on touch interfaces -->
<script src="js/better-simple-slideshow.min.js"></script>
<script>
var opts = {
    auto : {
        speed : 3500, 
        pauseOnHover : true
    },
    fullScreen : false, 
    swipe : true
};
makeBSS('.num1', opts);

var opts2 = {
    auto : false,
    fullScreen : true,
    swipe : true
};
makeBSS('.num2', opts2);
</script>
</body>
</html>
HTML

As you can see, the full 'kitchen sink' of HTML web page capabilities are used in this example. The rendering is performed internally by IronPDF using the Chromium HTML engine and v8 javascript engine from Google. They do not need to be installed in your system, the entire package is automatically added to your project when you use IronPDF.

Adding Headers and Footers

As we have a beautiful PDF render working, we may now wish to add attractive headers and footers.

Imports IronPdf

Module Module1

    Sub Main()
        Dim renderer = New HtmlToPdf()
        renderer.PrintOptions.CssMediaType = PdfPrintOptions.PdfCssMediaType.Print
        renderer.PrintOptions.PrintHtmlBackgrounds = False
        renderer.PrintOptions.PaperOrientation = PdfPrintOptions.PdfPaperOrientation.Landscape
        renderer.PrintOptions.RenderDelay = 150

        renderer.PrintOptions.Header.CenterText = "VB.Net PDF Slideshow"
        renderer.PrintOptions.Header.DrawDividerLine = True
        renderer.PrintOptions.Header.FontSize = "13"

        renderer.PrintOptions.Footer.RightText = "page {page} of {total-pages}"
        renderer.PrintOptions.Footer.FontFamily = "Arial"
        renderer.PrintOptions.Footer.FontSize = "9"

        Dim document = renderer.RenderHTMLFileAsPdf("..\..\slideshow\index.html")
        document.SaveAs("Html5WithHeader.pdf")
        System.Diagnostics.Process.Start("Html5WithHeader.pdf")
    End Sub

End Module
VB.NET

There is support for attractive logical headers and footers as shown. You may also add HTML based headers and footers as described in the VB.Net PDF developer object reference online

Please download and explore the source code for this "vb.net html to pdf" project as a VB.Net Visual Studio project

How Can VB.NET create PDFs with Dynamic Content

Historically, PDF 'templating' has been overwhelming task for Software Engineers. Stamping content into PDF templates rarely works, because each case or report will contain content of varying type and length. Fortunately, HTML is exceptional at handling Dynamic Data.

For this we have 2 ways forward:

  1. String Templating of HTML then conversion to PDF using .NET
  2. Rendering out content as an ASP.Net Web Page and then rendering the page as a PDF

Method 1 - ASP.NET - ASPX to PDF using VB.Net Web Forms

Fortunately this solution is surprisingly simple. Any flavor of .Net Web Form (including Razor) can be rendered into a PDF document using this VB.Net code in the Page_Load subroutine in the VB.Net code behind.

The PDF document may be set with a content-disposition to display in-browser, or to act as a file download.

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
        Dim PdfOptions As PdfPrintOptions = New IronPdf.PdfPrintOptions
        PdfPrintOptions.
        IronPdf.AspxToPdf.RenderThisPageAsPDF(AspxToPdf.FileBehaviour.Attachment, "MyPdf.pdf", PdfOptions)
    End Sub
VB.NET

Method 2 - HTML to PDF with String Templating

To create dynamic PDF documents that include instance specific data, we simply create a HTML string to match the data we wish to render as a PDF.

This is probably the largest advantage of the HTML-to-PDF solution in VB.Net - the ability to easily and intuitively create dynamic PDF documents and reports by creating HTML 'on the fly'

The simplest version of this might the the String.Format method from VB.Net

Imports IronPdf

Module Module1

    Sub Main()
        Dim renderer = New HtmlToPdf()

        Dim Html = "Hello {0}"
        String.Format(Html, "World")

        Dim document = renderer.RenderHtmlAsPdf("Html")
        document.SaveAs("HtmlTemplate.pdf")
        System.Diagnostics.Process.Start("HtmlTemplate.pdf")
    End Sub

End Module
VB.NET

As PDFs get more complicated, so the String will get more complicated. We might consider using a String Builder, or even a templating framework such as HandleBars.Net or Razor https://github.com/rexm/Handlebars.Net

Editing PDF Files with VB.Net

IronPDF for VB.Net also allows PDF documents to be edited, encrypted, watermarked or even turned back into plain text:

Merging Multiple PDF files into 1 document in VB

Dim Renderer As var = New IronPdf.HtmlToPdf
Dim PDFs As var = New List(Of PdfDocument)
PDFs.Add(PdfDocument.FromFile("A.pdf"))
PDFs.Add(PdfDocument.FromFile("B.pdf"))
PDFs.Add(PdfDocument.FromFile("C.pdf"))
Dim PDF As PdfDocument = PdfDocument.Merge(PDFs)
PDF.SaveAs("merged.pdf")
VB.NET

Add a cover page to the PDF

PDF.PrependPdf(Renderer.RenderHtmlAsPdf("<h1>Cover Page</h1><hr>"))
VB.NET

Remove the last page from the PDF

PDF.RemovePage((PDF.PageCount - 1))
VB.NET

Encrypt a PDF using 128 Bit Encryption

// Save with a strong encryption password.
PDF.Password = "my.secure.password";
PDF.SaveAs("secured.pdf")
VB.NET

Edit a PDF by stamping additional HTML content to a page in VB

Imports IronPdf

Module Module1

    Sub Main()
        Dim Renderer As IronPdf.HtmlToPdf = New IronPdf.HtmlToPdf
        Dim pdf = Renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf")

        Dim stamp = New HtmlStamp()
        stamp.Html = "<h2>Completed</h2>"
        stamp.Opactity = 50
        stamp.Rotation = -45
        stamp.Top = 10
        pdf.StampHTML(stamp)

        pdf.SaveAs("C:\Path\To\Stamped.pdf")
    End Sub

End Module
VB.NET

Add a page break to a PDF document using HTML

The easiest way to do this is with HTMl and CSS

<div style='page-break-after: always;'>&nbsp;</div>
HTML

Resources and More .Net PDF Tutorials

You may also be interested in:

Conclusion

In this tutorial we discovered 6 ways to achieve VB.Net to PDF results using VB.NET as our programming language of choice.

  • HTML string to PDF
  • Creating a PDF in VB.Net using an HTML string to define its content
  • Rendering existing URLs as PDF files
  • PDF generation from HTML Files
  • HTML Templating in VB.NEt to and then conversion to dynamic PDFs
  • Converting ASP.Net pages with live data such as ASPX into PDF files

For each we used the popular IronPDF library for VB.Net to allow us to turn html directly into PDF documents within .Net projects

.Net Software Engineer Learn how to create and edit PDF documents in VB.Net applications and websites.  A frich tutorial with code examples.

Veronica Sillar

.Net Software Engineer

Veronica is the technical lead for a website development team within a design and web agency in Amsterdam, Netherlands. Her primary focus is a passion for efficient, maintainable VB.Net code.