Sales & Administration

Where is the answer to my sales related query?

Almost certainly on this page or on our purchase page...

You may also be interested in our license page...

How do your license agreements work?

You can find out about licensing on our license page...

Why doesn't my license key work?

Probably because the license key is not for the product you are using.

You will have been issued a license key via email. Check the product and version referenced in the email and ensure that these match up with the product and version you are using.

It is not uncommon for purchasing departments to get confused between different versions of a product. So you may have asked your purchasing department to buy ImageGlue ASP but they may have purchased ImageGlue .NET instead.

How do I claim a refund under your 30-day money back guarantee?

Provided you purchase direct from us, there is an unconditional 30-day money back guarantee on all our products.

If you accidentally purchase the wrong product you can apply for a refund under our 30-day money back guarantee. You may wish to wait for the refund to be issued before placing an order for the correct product or if time is critical you may wish to place another order before applying for your refund.

For a refund we need a fax on headed notepaper from the person who was issued the license stating the order reference number (or license key) and that a refund is required. The fax needs to state that all records of the license key have been destroyed and that any physical deliverable has or will be destroyed. This assurance needs to be current - not something which will be done in the future. Fax numbers can be found on our About Us page (in the "Contact" section).

Our money back guarantee is valid for 30 days only. Confirmation of destruction must be received within this period for a refund to be given.

I have lost my license key and receipt. How can I get a copy?

License and receipt emails are typically issued via our automated system at MyCommerce or Cleverbridge. So by searching for emails from MyCommerce (also known as ShareIt and Element5) or Cleverbridge, rather than websupergoo, you should be able to locate your license key and purchase information.

If you purchased via Cleverbridge and you cannot locate the license key or receipt email then you can request a copy from Cleverbridge.

If you purchased via MyCommerce and you cannot locate the license key or receipt email then you can log onto your account and retrieve your license key that way. There are a variety of logon options available, one of which should be suitable.

If you cannot get sufficient information to log on to your account you may need to contact MyCommerce or Cleverbridge and ask them if they can help. In general they can provide much more timely help than we can on matters such as these.

If MyCommerce or Cleverbridge are unable to help then please contact us. Let us know what you have said to them and in what way they have been unable to aid you. Provide us with information which will allow us to uniquely identify your license and we will see if we can locate it for you. Ideally we would like an order reference number or license key. However if you do not have those, then names, email addresses, zip codes and rough dates are all good.

Please note that we can help locate individual orders if you can provide us with information which will allow us to uniquely identify them. However we cannot locate multiple licenses so we cannot provide you with, for example, all the licenses ever purchased by your company.

I need a free license. How do I get one?

Please read the free license page carefully and apply via the methods you find there.

What support options are open to me?

It is important to us that you feel happy using our software. If you find something that doesn't seem quite right, please tell us and we'll do something about it.

We don't expect you to have any problems with our software and if you have any queries we will do our best to answer them promptly. However if you need an extra level of security we offer a Platinum Level Support program offering a priority channel through to our engineers.

You can purchase Platinum Level Support via our purchase page.

How can I obtain a quote?

The simplest way to obtain a quote is from our Cleverbridge reseller. First go to the preferred reseller page and select Cleverbridge as the default reseller.

Then go to the purchase page and click on the product you want. Near the top of the page you will see a button called "Request Price Quote".

How do I place a Purchase Order?

If you purchase online using a credit card the whole process is automated. There is no human intervention which means that there is little to go wrong or delay the process. You should have your license within seconds of placing your order.

Other methods such as ordering by check or purchase order involve a fair amount of human intervention. They take much longer and there's more to go wrong. You should certainly allow a week for this type of order to get processed.

So... if you can... please order online using a credit card.

If this is something you just cannot do...

Go to our purchase page and click on the 'Select Preferred Reseller' link next to the orange icon at the top of the page. Select Cleverbridge as your preferred reseller. Place your order choosing Purchase Order as the payment method.

Please note that you are required to accept our Terms and Conditions of sale, which include a waiver of any terms and conditions you may have on your Purchase Order.

It is important that you do not send us any forms or documentation which may need to be filled in or signed. We do not have the resources to properly assess any legal implications, so they will not be accepted and your order may be rejected or delayed.

What is your policy on cracked software?

See our cracked software statement...

Is my old software supported on my new version of Windows?

Our software is developed and tested against current versions of Windows. You can run older software on newer releases of Windows and it may work but it is not officially supported. If this is the case you should be thinking about upgrading. For reference the following are the discontinuation dates for various releases of ABCpdf and ImageGlue.

ABCpdf 1 - Discontinued 1 July 2002
ABCpdf 2 - Discontinued 1 Mar 2003
ABCpdf 3 - Discontinued 1 Mar 2004
ABCpdf 4 - Discontinued 1 July 2005
ABCpdf 5 - Discontinued 1 Feb 2007
ABCpdf 6 - Discontinued 1 Nov 2008
ABCpdf 7 - Discontinued 1 Mar 2011
ABCpdf 8 - Discontinued 1 Nov 2012
ABCpdf 9 - Discontinued 1 Feb 2015
ABCpdf 10 - Discontinued 1 Dec 2017
ABCpdf 11 - Discontinued 1 Jan 2021

ImageGlue 1 - Internal release only
ImageGlue 2 - Discontinued 1 July 2000
ImageGlue 3 - Discontinued 1 July 2001
ImageGlue 4 - Discontinued 1 Mar 2002
ImageGlue 5 - Discontinued 1 April 2006
ImageGlue 6 - Discontinued 1 Nov 2009
ImageGlue 7 - Discontinued 1 Jul 2020

I have lost my free license. How do I get it reissued?

If you lose your free license you will need to reapply under the current rules of the free license scheme. Providing your endorsement or article has been maintained during the period you have had the license, we will reissue it.

Please note that maintaining the endorsement or article is important. Indeed it is the core of the free license agreement. It is what you agreed when you applied for your original license. If you do not maintain it at the URL you told us about then you are required to purchase a copy of the software. See the free license agreement for details.

We regularly crawl your site to check that the endorsement or article is present. When you reapply we will check our records to ensure that it has been maintained throughout the period in which you have had it. If we find that it has vanished at any point then we will ask you to honor the agreement and purchase a license.

So if you know that there have been issues with maintenance please do not reapply - it will just delay the fact that we will ask you to purchase a license. If you are not sure whether there may have been issues or not, you can check with a public service such as Internet Archive.

What does my Platinum Support cover?

Platinum Support is per product and per developer. So if you purchase Platinum Support with ABCpdf then it covers you for support with ABCpdf.

We have a queue system for emails. So first in - first out. Platinum Support queries bypass the queue and go straight to the front. We are confident enough in the value of this system that if you reach the end of your year contract and you feel it has not been useful then you can just ask us for a refund (see our Purchase Page for details).

Our email system automatically recognizes emails quoting Platinum Support licenses so it is important that you quote your license when you write. If you do this it will guarantee that your emails pop in at the front of the queue.

We provide fast, extremely high quality support by email. We have a target turnaround of under 24 hours for all emails and Platinum level queries are typically answered much faster than this. The support staff you deal with are extremely experienced and are only one level separated from the developers so you get extremely high quality responses. Indeed for very technical issues you may well find yourselves dealing directly with the developer of the feature.

We don't typically provide support over the telephone because we find it doesn't work very well. Technical issues are often extremely complex and they require a level of thought both on your side and on ours. We tend to find that telephone conversations end up with us quoting chunks of documentation or dictating code samples. This is not an efficient use of our time or yours. However that's not to say we never provide telephone support... just not typically.

How long is my software supported?

It is important for security, stability and support that you stay up-to-date.

With that caveat, we will attempt to support your software as long as you use it.

You need to be aware that when we discontinue a version of a product, that there will be no more software updates. That means that if a problem occurs, any solution has to come from changes in your code or setup.

So we will always do our best to help, no matter what version you are using. However occasionally the only solution is to upgrade.

We provide discounted upgrade packages. These are designed both to encourage you to stay up-to-date and also to alleviate financial stress in situations in which an upgrade is unavoidable. Upgrades take you up one version only, so to maximize the return on your investment it is best to upgrade early - at the point of any major release.

Please do not use our products on older releases of Windows which are no longer supported by Microsoft. Yes you may have a fifteen year old item of software which says it works on Windows 2003. However Windows 2003 reached end of life in 2010 and end of extended support in 2015. We will be happy to help with advice on how transition to a new platform. However by running software on platforms which have been deprecated, you take yourself out of our supported environment.

Similarly, if you attempt to use the software in ways or on operating systems for which it was never designed, again you take yourself out of our supported environment. If you are using a version of the software discontinued eight years ago, think twice before installing it on the latest version of Windows.

Can you fill in my questionnaire?

If you have small numbers of questions please just put them into an email and we will do our best to answer them.

If you have a questionnaire which is too big for this, then you are asking for something which is not standard support.

Nevertheless, provided you are an Enterprise level client with a current license, we will make reasonable efforts to help you.

What this means in practice, is that you need to ensure you have a current Enterprise or Redistribution License purchased within the previous eighteen months. Please quote the license details when you contact us.

We will put in a reasonable amount of effort to fill in your questionnaire and ensure the accuracy of our answers but we cannot accept any liability for mistakes and we cannot automatically update you if anything changes.

Note that you always purchase via a reseller and the merchant of record is typically a company like cleverbridge. So for sales related questions you need to deal with them rather than us.

General Technical

I am having problems with Security / Permissions. What do I do?

To solve security problems you need to understand the complex and somewhat convoluted way in which IIS security works.

If you are on Windows 2003 an excellent overview of security and identities under IIS6 can be found at Microsoft's IIS Insider. If you find other good articles on security please do tell us.

If you are on a newer version of Windows/IIS see "Application Pool Identities".

If you are on older versions of IIS (e.g. IIS5) see "Building Secure ASP.NET Applications". However the essential information is that the ASP.NET process generally runs as the ASPNET user.

For an overview of classic ASP security see Microsoft's "ASP Troubleshooting Tips and Techniques". If you want to run IIS in an isolated process see "IIS Modes of Operation". Please note that security works slightly differently when running in an isolated process. This is fully covered in the above article.

Your first step should be to run a simple test case as a standalone application (exe) while logged on as Administrator.

If you run code as an application and it works, and you then run the same code from ASP or ASP.NET and it doesn't, then you have a permissions issue. Practically the only difference between these environments is that one set of code runs as you (probably Administrator) and one runs in a restricted permission account (like IUSR_MACHINENAME or ASPNET).

This is not unusual under ASP or ASP.NET which operate a rather strict security policy. In addition patches and lockdowns can modify the security policy in ways that are not publicly documented. The result is that software installations - not just our software - can be complicated.

Unfortunately it's not possible to list all the required permissions. The way that Windows is designed does not make this feasible. There are just too many possibilities and each can impact on the software directly, on a resource which the software uses or on Windows itself. It's practically impossible.

So you now need to track down the permissions issue...

You may have a standard method for doing this. Microsoft have some useful Guidelines for Resolving IIS Permissions Problems. Here is our suggested method.

Start by thinking if the IIS user is likely to have access to the resources required. Often there's an obvious cause. Thinking carefully should always be your first move. Sorting out a backout plan should always be your second.

Often a simple way to check things is to change the user. Open your Application Pool and change the Identity to a high privilege user such as yourself. Ensure that Load User Profile is set to true, recycle the pool and try the page again. If the operation succeeds it is just a matter of stripping away the privileges until you find the problem. Don't forget to back out the changes after you've finished.

Enable Auditing. If something fails you want to hear about it. So go to the Security Policy control panel and turn all the auditing on. Try your operation. Check the Event Log. Even if there's nothing there keep an eye on the Event Log. Something may turn up later. Just don't forget to back out the changes after you've finished.

If you are trying to access remote resources (a common cause of problems) try making the resources local. If the resource is a file on a share, see if the operation works if you put the file on your local machine. If the resource is a URL on the Internet try a 'file://' URL on your local machine. Try these operations both from your IIS application and also as an interactive exe application.

Most security issues are related to file access. Occasionally you will get issues related to registry access. However these are infrequent and tend to be associated with COM 0177 errors.

If you know the resource which your code is failing to access...

You may wish to move to a security audit. Just audit security failures for IUSR and the Security Event Log will tell you exactly where the problem is. See "How to Troubleshoot Permissions in IIS" for details. This is the official way to proceed.

However if you are not sure exactly where the failure is occurring...

ProcessMonitor will monitor every file and registry access on your machine in real time. It produces a flood of data but all you need to do is to start it up and then make your error occur. Switch it off and then search through looking for file access failures. There are full instructions here...

When you use these kind of tools - and start to change permissions - please, please, please be careful. If you are not sure - don't do it. Always keep notes of what you change so you can back things out if you need to.

Can I use your products from Cold Fusion?

In general you can use the ASP / COM versions of our products via the object tag. However there are a few things to be aware of.

While we are always happy to help with the use of our products in any environment we are not experts on Cold Fusion.

You cannot use ABCUpload from Cold Fusion because it relies on IIS features which are not available from Cold Fusion.

Cold Fusion does not support default properties so some example ASP code may require modification to explicitly specify those properties. So for example the following ABCpdf ASP code:

theDoc.Rect = "50 50 550 550"

Would require modification to:

theDoc.Rect.String = "50 50 550 550"
Are there any special issues involved in upgrading/reinstalling your products?

Once IIS is using a DLL and related resources it can be difficult to get it to let go of them. The Microsoft Installer (MSI) should take care of this kind of problem but it doesn't always respond in a predictable way.

For this reason you should restart IIS before installing an upgrade. This procedure is not always necessary but it's a good idea and it is certainly the procedure you should follow if you encounter any installation problems.

We suggest the following procedure to ensure a smooth upgrade path. First restart Windows to release any resource locks that IIS currently has open. Sign on as Administrator (not just a member of the Admin group). Then uninstall the old version of the software (using the Windows Control Panel). Then install the new version. Remember to check your serial numbers in the settings application.

Please remember to install new versions firstly on your development machines, then on your staging servers and finally on your live servers. Over 80% of the issues we deal with are the result of setup specific problems (problems with service packs, incorrect security settings etc.) and it is best to catch these on a development rather than a live server.

I am going to be installing legacy software on Windows 2008 onwards. What do I need to be aware of?

There are two things you should be aware of.

  1. When you install, double click on setup.exe - not on installer.msi.
  2. Launch the Settings application by right clicking it and selecting 'Run as administrator'.

The new security model introduced in Vista means that there are subtle but important differences between the way installers are launched.

If you double click on an MSI file (e.g. installer.msi) the installer will run with standard privileges. This will mean that tasks which require administrative privileges will not run or will run incorrectly. If you click on a setup file (e.g. setup.exe) the installer will automatically run with administrative privileges. So tasks which require administrative privileges will succeed.

A similar situation can exist when entering license keys. By default Vista will redirect per-machine setting to per-user ones. This means that if you enter a license key it will be maintained on a per-user basis rather than on a machine wide basis.

For situations in which you are running the software as a user this will be fine. For situations in which the license key needs to be accessed by the Internet user then it is less than ideal. The solution is to explicitly launch the settings application as Administrator.

I am going to be installing on a 64-bit version of Windows. What do I need to be aware of?

If there is a 64-bit version of the product you should use it. For example if you are using ABCpdf .NET you should be using ABCpdf .NET x64 under 64-bit Operating Systems. If there is no 64-bit version of the product you will need to use the 32-bit version.

At present 64-bit processing and 32-bit processing do not interoperate seamlessly. For example if you are running vbs scripts you should note that there is one 64-bit wscript.exe and one 32-bit wscript.exe. If you run the wrong one then things will not work. Similarly ASP.NET operates in 64-bit mode by default and won't handle 32-bit components in this mode. The ease of integration between the two modes depends largely on whether you are running IIS6 or IIS7 (and up).

If you are using a 32-bit version of one of our components in conjunction with IIS7 upwards then all you need to do is set up an application pool to use the 32-bit version of .NET. Open IIS Manager. Create a new Application Pool and set 'Enable 32-Bit Applications' to true. Create a new Web Application for the section of your site which is going to use the 32-bit component. Assign the new Application Pool to this new Web Application. That's it!

For details of how to switch between modes under IIS6 please see the MSDN Support articles on the subject. Note that you need to set the "Allowed" status of the 32-bit Web service extension every time you switch to 32-bit mode. Also a single ASP Web service extension will show up by default as ASP.NET 2.0.50727 when in 64-bit mode and an additional Web service extension ASP.NET 2.0.50727 (32-bit) will show up when switched to ASP.NET 32-bit mode.

We've found that a good way to make use of 32-bit components on 64-bit machines is to use COM+ / .NET Enterprise Services. That way your main process runs in 64-bit mode and Windows takes care of all the (cross-process) calls to your 32-bit component running in a separate process. There are details of how to create COM+ / .NET Enterprise Services packages in MSDN. For a practical guide you may find our ABCDrawHTML COM+ instructions helpful. For COM components it's the work of five minutes and it works beautifully. For .NET components it's a bit more work. (Please note that ABCUpload ASP is too tightly coupled to ASP to operate properly under COM+)

How do I use Process Monitor to find permissions issues?

ProcessMonitor from Microsoft SysInternals will monitor every file and registry access on your machine in real time. It is a wonderful tool and it will significantly enhance your life.

Yes it produces a flood of data but all you need to do is to start it up and then make your error occur. Switch it off and then search through looking for file access failures.

You can restrict the amount of data it throws at you using a filter. Be cautious as problems may not always be quite where you expect them to be. However in general if you set it to filter on "Result contains DENIED" you will pick up most issues. If issues are related to configuration rather than permissions then you may wish filter on "Result contains FAILURE" to find out what files are missing.

Registry access failures are normally innocuous but file access denied failures almost always indicate a fatal problem.

The Process Monitor filter options do not always work quite as one would expect and it is possible to miss things. If you think this might be the case then switch them off and save the results to a text file. You can search through this by hand or you can use the 'Auto Filter' menu item under the 'Data' menu in Excel as a more convenient option.

Process Monitor used to be two products - FileMon and RegMon - and you may need to use these on very old legacy systems. However the principles are the same.

How do I know that your software is secure?

Please read the security page which will tell you why you should have confidence in the security of our software.

File Upload - General

Why am I not getting any files uploaded?

First check the obvious things - your form must be enctype="multipart/form-data". Your file input field must have a name. Check you are submitting to the correct page. Finally try saving a dump of your upload (details in the documentation) and looking at it in Notepad - you will probably be able to see what's going wrong.

Uploading small files works but when I try to upload files larger than about 1 MB, I get 'The page cannot be displayed... Cannot find server or DNS Error'.

The most likely cause of this error is that you are accessing your web server via a proxy server that is not configured or is not capable of handling large requests.

Your first test should be to try connecting direct rather than via the proxy server. However in some organizations this is not always practical so here are some other pointers.

To ensure that the problem is due to your configuration rather than ABCUpload you can always intercept the raw data without involving ABCUpload. For details of how to do this under ABCUpload ASP see the topic 'How do I do a raw upload?'.

In addition some tools such as URLScan may block large transfers. The maximum transfer size can be adjusted in the Urlscan.ini file.

Why is the ABCUpload progress bar not working?

If you have ASP script debugging enabled the progress bar will not work. When debugging is enabled the script engine locks IIS down to one page at a time per session. This means that the progress bar cannot update. So if you want the progress bar to work you need to disable debugging.

A similar situation can apply to ASP.NET as the Trace module can interfere with the progress bar. This should not be a problem for deployment since you should not have tracing enabled on a live server but it sometimes causes confusion when testing on development servers.

Most proxy servers will recognize that the progress bar page is changing frequently and update it as required. However some proxy servers insist on serving the same out-of-date progress bar again and again rather than updating it as requested.

Some proxy servers cache the entire request/upload before releasing it to the server in one fell swoop. So as far as IIS is concerned there's a long wait and then it gets all the data in one go. The progress bar will sit refreshing over and over again but will read zero until the entire upload is transmitted at which point it will disappear.

If using ABCUpload .NET with IIS7 upwards the Managed Pipeline Mode (of your project's application pool) should be set to Classic rather than Integrated.

How do I ensure that my Mac upload is sent in MacBinary format?

You must be running Internet Explorer on the Mac for your upload to be encoded in MacBinary format. You can change the MacBinary settings using the IE Preferences. In the 'File Helpers' section there's a list of file types. If a particular file type is selected as 'Binary Data' and 'Macintosh File' then uploads of that type will always be in MacBinary format.

How can I allow users to select multiple files into one file upload box?

Unfortunately it is impossible to do this kind of multi-selection upload unless you use client side code (e.g. Java, ActiveX or .NET).

Many people on the Internet cannot use this kind of code. For example people in large companies often cannot use this kind of code because IT departments tend to disable client side code for security reasons.

An additional benefit of using pure server-side code is that you get security for free. You can do your uploads using an HTTPS link and both you and your clients can be certain that their data transfer is secure.

If this feature is essential you can use Adobe® Flash® (which is a client side control) to provide the file upload capabilities on the client side. ABCUpload will process the data identically on the server side because Flash sends the data in exactly the same way that a browser does. For details see the Flash site.

ABCUpload .NET

Looking for example code and projects? See the documentation for ABCUpload .NET here...

I am having problems with ...?

Please, please, please start by installing the example site and trying that out. When we get support requests saying that ... is not working our first step is to establish if this is due to a configuration issue or a code issue. To establish whether this is a configuration issue we'll be asking you if the example site is exhibiting the same problem. We can skip this step if you can say yes or no.

You can find the example site under the ABCUpload .NET menu item. All you have to do is create a new virtual directory in IIS and then copy the files into the folder.

The one other change you are likely to have to make is to adjust permissions on the 'write' folder within the example web site to allow the ASP.NET user full access. Otherwise it won't be able to save your uploads.

Then open your browser and try it out. That's it!

Really and honestly this is the fastest way of resolving problems.

Could you take a guess at what's going wrong?

Well many of the issues we deal with are a result of incorrect configuration. Make sure that your web.config file contains the same entries as our example site web.config file.

Some issues are a result of misunderstanding. Server side events work by submitting your form to the server. If there is a file upload field in your form and your client has selected a file for upload then this will require that the entire file is sent to the server before the event can occur. This is just the way that ASP.NET works.

What's the maximum size for an upload?

Assuming you are using GigUpload you will be able to cope with multiple ongoing uploads each up to 2 GB in size. IIS does not allow uploads larger than 2 GB.

However by default IIS won't allow uploads this large. You need to enable it by changing the web.config for your site as detailed in the documentation. On servers with the Request Filtering service installed the <reguestlimits> section may also need modification.

Why is my upload being cached in memory? Isn't GigUpload supposed to avoid this?

It is not practical for GigUpload to intercept every request. ABCUpload .NET will only intercept requests if the Progress Bar is enabled, GigUpload is enabled and there is an Upload ID present in the URL. Additionally when you save uploaded files you should use the ABCUpload .NET classes rather than the standard .NET ones.

The progress upload example provided with ABCUpload .NET fulfills these conditions. However the other example pages do not use Upload IDs and so GigUpload will not intercept uploads made from these pages.

If you've been following the Codebehind Progress Bar example please ensure that you've set the enableLargeUploads attribute in the web.config.

Why is my event log filled with messages System.Web threw exception 'Thread was being aborted.'?

This is the error you will get if your upload times out (see the documentation for how to alter the timeout). The reason this error is in your Application Event Log is because you have Error Logging turned on in your web.config file.

Is there a file download method I can use which won't max. out ASP.NET'?

The key here is to stream your file in chunks and to wait until each chunk has been picked up by the client before streaming the next one. Something along the following lines:

Dim rdStream As New FileStream(oFile.FullName, FileMode.Open, FileAccess.Read)
Dim lReadLength As Long = 1024000
Dim iPos As Long = 0
Dim iPosEnd As Long = rdStream.Length
Dim bReader As New BinaryReader(rdStream)

Response.Buffer = True
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Length", oFile.Length)
If mbView Then
  Response.AddHeader("Content-Disposition", "inline; filename=""" & oDAFile.FileName & """")
  Response.AddHeader("Content-Disposition", "attachment; filename=""" & oDAFile.FileName & """") End If iPos = 0 Do While iPos < iPosEnd   If iPosEnd < iPos + lReadLength Then     lReadLength = iPosEnd - iPos   End If   Response.BinaryWrite(bReader.ReadBytes(lReadLength))   Response.Flush()   iPos += lReadLength Loop rdStream.Close() rdStream = Nothing


For example code and projects, check out the online documentation for ABCUpload ASP here...

Why am I getting "Upload size is greater than the maximum allowed" or "The page cannot be displayed... Cannot find server or DNS Error"?

If your uploads are greater than 8 MB you need to adjust the XForm.MaxUploadSize property. See the ABCUpload documentation for more detail.

Why does ABCUpload tell me 'Access is denied. - (0x00000005)' when I try and save a file?

For safety ABCUpload will not, by default, overwrite existing files. If you try to do so you will receive an access denied error. If you wish to overwrite files you should set the XForm.Overwrite property to true in your script.

Less commonly it may be that the IUSR Internet user does not have sufficient permissions to write to the location you have specified. In this case you should alter the permissions on the write destination to allow access.

Why does ABCUpload keep telling me that the 'Upload stopped unexpectedly.'?

The most likely cause of this is that there's a reference to the built in form object somewhere in your code. If the form object is referenced it grabs all the uploaded data which means that ABCUpload cannot get it. This sometimes occurs when an include file is changed so that it references the form object.

If the error occurs during a large upload the cause is typically that the client has clicked on stop on their browser window or that they've dismissed the browser window or that there's been a network problem which has broken the connection. If the error occurs immediately on form submission you should look at the following explanation.

ABCUpload reports an error at the point it needs to obtain data. Typically the point at which it first has to gather the data is when you reference a field or you ask for information (such as the field count) that can only be derived from the upload data. The essential cause is that IIS is not providing this data.

You can completely remove ABCUpload from this equation and you should find that the problem remains. Comment out your form upload code and try inserting something like:

theLen = Request.TotalBytes
theData = Request.BinaryRead(theLen)
Response.Write"Upload Size = " & theLen
Response.Write "Data Size = " & UBound(theData)

You should find that either the upload size or the data size is substantially wrong (they should both be about equal to the size of your uploaded files) or that an error gets thrown.

When uploading very large files I keep getting 'Upload stopped unexpectedly.'.

Our standard tests run up to about 100 MB. We've had clients uploading files of over 500 MB. However with files this big you can run into unusual problems so here are some points to check.

Make sure you are using ABCUpload Version 4.6 or later. Make sure you've got enough disk space to save your files. Check the SessionTimeout and ScriptTimeout properties as mentioned in the 'Script Settings' portion of the documentation.

Ongoing uploads are stored on disk in the temp folder (you can change this location if you want). This means that your system drive has to have enough space. If you have five simultaneous 100 MB uploads you'll need minimum 500 MB free disk space.

If you have file system quotas then check the file system quota for the IIS user.

Your client browser has to have disk space free. Some browsers save the encoded form on the system disk before sending it through to the web server. This cache can be as much as twice as large as the uploaded files. If your client does not have sufficient space free the results can be unpredictable.

There is a theoretical limit to the number of large uploads available. Because you are working in a 2 GB address space the total upload size (for all ongoing uploads) must not exceed this value. Of course some other things will take up space as well so the total will probably be somewhat less than 2 GB. This is a limit that is only likely to come into play for large numbers of very large uploads.

If this doesn't help please mail us with an exact description of the problem and the system on which you are running. Also check the Application Event Log.

How do I do a raw upload?

You can perform a raw upload using the following code rather than by creating an XForm object. This code reads the raw data without processing it and without using any external components.

theLen = Request.TotalBytes
theData = Request.BinaryRead(theLen)
Response.Write "Upload Size = " & theLen

If the problem appears to be due to ABCUpload try saving a dump of the upload using the XForm Save method and then send it through to us for analysis. You can save a dump using the following code.

Set xf = Server.CreateObject("ABCUpload4.XForm")

xf.Save "mydump.txt"
' saves in your virtual directory
My upload just hangs. What gives?

Under some circumstances if you have an ASP with more than 32k of static HTML and you locate your XForm script after the 32nd kilobyte of data then the upload can hang. We suspect that this is because IIS starts the HTTP response before the client has finished the request and this can confuse browsers.


Looking for example code and projects? See the documentation for ABCpdf.NET here...

Can ABCpdf convert my Microsoft Office documents to PDF?

To convert Office documents ABCpdf .NET requires either WordGlue .NET, or the use of MS Office or as helper applications. We would recommend you use the current versions, which must be installed on the same system as ABCpdf.

WordGlue .NET is our own layout engine supporting doc and docx formats. It is designed specifically for unattended use from multiple threads in high stress, restricted permission environments. It comes complete with projects showing how to integrate with ABCpdf.

If you are using MS Office or you can select which application is used by setting the ReadOptions.ReadModule property.

To use Microsoft Office, set the property to ReadModuleType.MSOffice. You will need MS Office 2007, 2010 or 2013 installed.

To use OpenOffice, set the property to ReadModuleType.OpenOffice. You will need 3 installed.

Although it is possible to separate out individual applications from MS Office or OpenOffice we would not recommend this. There is a lot of commonality between the different applications so it is generally a good idea to install the entire suite. Certainly it is not possible to access particular DLLs as ABCpdf interacts with MS Office or

Using older versions of ABCpdf you may wish to call Microsoft Office via the XPS printer driver. To do this you should set the ReadModule property to ReadModuleType.XpsAny. Printing via the XPS printer driver requires the PrintHook DLLs and the correct file-extension association of the document types with the applications (e.g. MS Word, Excel, etc). The Microsoft XPS Document Writer printer must also be installed (with Vista, .NET framework 3, or the XPS Essentials Pack).

You need code like this:

'--- MS Word
Dim theDoc As Doc = New Doc()
Dim xr As XReadOptions = New XReadOptions()
xr.ReadModule = ReadModuleType.MSOffice
theDoc.Read("in.docx", xr)
'--- OpenOffice
Dim theDoc As Doc = New Doc()
Dim xr As XReadOptions = New XReadOptions()
xr.ReadModule = ReadModuleType.OpenOffice
theDoc.Read("in.docx", xr)

Please see the documentation of Doc.Read and ReadOptions for more details.

For information about and help setting up and Microsoft Office in reduced permission environments please see Section 6.23 and Section 6.27 respectively.

Can I use ABCpdf from Visual Basic?

Yes. All the example code will be exactly the same but you'll need to replace ASP specific code like Server.CreateObject with generic code like CreateObject.

Why does the trial version ask me for a license key?

ABCpdf is a component not an application. The PDFSettings application is simply for entering a license key when you purchase one.

You don't need a license straight away - the component will work for 30 days without any intervention. All you need to do is look at the documentation and start writing code.

If your web application is reporting that your license has expired...

Log on as Administrator and open up the PDFSettings application and see what it says. It will probably tell you that you have a trial license - this is OK.

If it says your license is OK then restart and try your code again. If you still get the same message then you have a permissions issue.

ABCpdf needs to be able to read the license key from the registry. If your web application is unable to read this key it will not work. You need to enable read access to the ABCpdf registry settings at:




You can adjust registry permissions using regedt32. Please take the relevant precautions when modifying the registry - if you are not sure what these are then please don't perform this type of operation.

Can I import an existing PDF document and then manipulate it on the fly?

ABCpdf will allow you to open, modify and save PDF documents.

ABCpdf will allow you to draw on top of PDF documents or add or delete pages or modify document data. However because of the way that PDF documents are structured it's unlikely that you'll be able to reflow existing content.

So if there are empty spaces which you can draw your entries into that will work great. Indeed you might want to draw a white box over existing content and then draw on that.

The TextOperation class will allow you to extract text from parts of PDF documents, by page, by area or by a combination of both. Using this class it is easy to match parts of that text back to locations on pages, styles and bits of the raw PDF content stream. The documentation for this class includes a code sample showing how to search a PDF, highlight keywords and then save the result.

The ImageOperation class allows something similar for images. It allows you to determine what images are present in a document and where in the PDF they are used. This allows the extraction of information such as resolution in DPI.

If you need to work at a lower level, the GetText function allows you to extract text and style information formatted as SVG. Text extracted from a simple "Hello World" PDF as SVG looks something like this:

<?xml version="1.0" standalone="no"?>
<svg width="612" height="792" x="0" y="0" version="1.1" baseProfile="full" xmlns="" xmlns:xlink="">
<text xml:space="preserve" x="0" y="76.8" font-size="96" font-family="Times-Roman" textLength="514.56" >Hello World!</text>

So what can you do with this SVG? Well you can drop it into a web browser and view it. However the key advantage of SVG is that it's easy to deconstruct (it's just XML) so you can tell where on the page items of content are located and how they are styled. If you want to extract specific items of text like bylines or titles then SVG is the way to go.

ABCpdf also supports an export format called SVG+. This is a superset of the SVG specification and includes details that map SVG content back to precise locations in the PDF content stream. This information allows you to edit and re-save existing PDFs. For an example of how to do this see the ABCpdfView project which comes with ABCpdf.

Reflowing text is more difficult. Shifting existing content to make room for a newly added item would require that content on the current page be shifted down, then any overflow moved to the next page, which again might require a reflow. This type of technique is potentially extremely complex and is best avoided.

If you really need to do a large scale reflow then your best option is to export the entire PDF as another format like HTML. Then modify the HTML and use it to create a new PDF. However note that the round trip is likely to take time and the output may be slightly different from the original.

Why doesn't AddImage work with my GIF images?

You can pass AddImage a path to a JPEG, TIFF or EMF file. This inserts the raw compressed data into your PDF document. Other image types (e.g. GIF) cannot be inserted direct - they must be drawn into an Image object and then the Image object can be added to the PDF document. There are examples in the ABCpdf documentation.

My code works on my development server but fails when I deploy. What gives?

The vast majority of configuration issues are related to security and permissions.

Dev servers often operate a more relaxed security policy than staging or live servers and so this kind of problem often becomes apparent only during deployment.

Your first step should be to run ABCpdf interactively while logged on as Administrator. This will allow you to eliminate permissions as a source of the problem.

If you are running under .NET you will need to create and compile a simple VB or C# application to perform some basic operations. You can download sample projects here.

If you are running under ASP you can create a VBS script to mimic the effect of your ASP. Copy the following text into a text file and then rename it mytest.vbs. If you are on an x86 system you can just double click to run.

If you are on an x64 OS you can run your VBS in either 32 or 64-bit mode. Double clicking will run in x64 mode however you should also test 32-bit mode. You can do this by dropping your VBS on the wscript.exe app you will find in SysWow64. Please try both modes and let us know that both are working.

Set d = CreateObject("ABCpdf11.Doc")

d.FontSize = 96
d.AddText "Hello World!"
d.Save "mydoc.pdf"
MsgBox "Finished"

If the issue appears to be permission related you can track down the cause of the problem using the security troubleshooting procedure detailed on this page.

Alternatively it can be possible to completely bypass security problems by running your code in a Component Package under .NET Enterprise Services or COM+. This has a number of advantages.

  1. It allows your code to run in a completely different process from your web code thus isolating the two.
  2. It allows you complete control over the user which your code runs as without impacting the security of your web code. All you do is change the user using the Component Services Administration Tool.
  3. Because your web code and your ABCpdf code are operating in different address spaces there is more free space in each process.
  4. You can tell your component package to shut itself down when it's not being used.

If you are using ABCpdf .NET you'll need to write a .NET Managed Component wrapper round your code. The PDFEnterpriseServices example project under the ABCpdf .NET menu item shows you how to do this for converting HTML into PDF. If you are using ABCpdf ASP the process is even easier - you may find our ABCDrawHTML COM+ instructions helpful.

When I convert HTML I get an empty PDF, or see errors like:
    "HTML render is blank"
    "No MSHTML document is available"
    "Unable to add image"
    "Unable to read file"
    "Unable to render HTML"

Under ASP.NET you will need to set the "Load User Profile" option to "true" in your application pool's configuration.

If you are experiencing difficulties converting HTML we recommend updating to the latest release on our downloads page before continuing.

If you are using ABCpdf's (default) MSHTML engine it needs a compatible Internet Explorer version on the same system. Please see the feature chart for details.

First read the previous section carefully.

Firewalls, DNS and proxy servers can present particular problems for URL rendering because they may require some kind of logon. Your IIS user will most likely not have a logon. You need to allow ABCpdf to logon automatically.

Windows Authentication can produce a challenge that your IIS user may not be responding correctly to. You will find details of how to manage Authentication in the documentation.

Windows Server 2003 defaults to an Internet Explorer Security policy which may interfere with HTML rendering. You may have to modify or disable the policy to allow access to the pages you want to render. If you wish to remove the security component you can do so using the "Windows Components" section of the "Add & Remove Programs" control panel.

In Windows Server 2008 up, choose "Server Manager", then "Security Information", then "IE ESC (Enhanced Security Configuration)". You can then configure access separately for Administrators and Users.

If this doesn't help...

First work through some simple sanity checks and common causes of this type of issue.

  1. Do ensure you can browse to the appropriate location using IE while logged on as Administrator (on the system where ABCpdf runs). Make sure IE doesn't throw up any blocks or warnings. ABCpdf requires a clear route through to the page. If you are using the Gecko engine then install Firefox on this machine and try viewing your URL using that too.
  2. If you are rendering a URL on your localhost then ensure that the IIS user has read access to this location.
  3. Make sure that under ASP.NET you have set the "Load User Profile" option to "true" in your application pool's configuration. If you do not then you may get access errors related to C:\Windows\System32\config\systemprofile\AppData and subdirectories.
  4. If you see the following error:
    "Unable to render HTML. Failed to configure IE 9 or above for the MSHtml engine: Access denied while writing to the registry.
    For IIS applications, please enable "Load User Profile" or consult MSHtmlBootstrap in the documentation. Alternatively, you can configure this registry setting manually: 1. Create registry key "Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI" (which have to be under the Wow6432Node key if the running process is 32-bit on an x64 system; the current process is 64-bit). 2. In the created key, create a DWORD value named "w3wp.exe". 3. Set the DWORD's value to 1." then create the appropriate registry key.

    ... then do what it says.

  5. It is our experience that it is surprisingly common for web servers not to be able to resolve URLs to themselves. This means that when testing using an IP address your code will work but when you try and render a web page on the local server using a URL you may get issues.
  6. It is our experience that it is surprisingly common for web servers to be able to access HTTP URLs but not HTTPS ones. If you are using an HTTPS URL then try the equivalent as HTTP to see if the problem is related to SSL.
  7. The default value of HtmlOptions.HostWebBrowser is true, which provides greater compatibility with a wider range of HTML and JavaScript. However this setting also requires a greater level of permission. If sufficient permissions are not available you may see errors like "Windows error 5" or "Access is denied" or "Unable to create memory-based MetaFile" or "No MSHTML document is available". If this is the case try setting the Doc.HtmlOptions.HostWebBrowser property to false prior to calling AddImageUrl/Html. If you do not have access to the source code you can change the default by entering a HostWebBrowser registry key - details in the ABCpdf .NET documentation. If you do this on an x64 server be sure to set both the 64-bit registry key and also the 32-bit Wow3264Node based key.
  8. If all this looks fine and you are still seeing problems we strongly suggest putting in ten minutes with ProcessMonitor. In most cases it will flag an obvious cause. Be cautious with ProcessMonitor filters as problems may not always be quite where you expect them to be. However, in general a filter on "Result contains DENIED" will pick up most issues. You will find details on how to use ProcessMonitor on the "How do I use Process Monitor to find permissions issues?" section of this page.
  9. Lack of access to the windows/temp directory is a frequent cause of problems. Ensure that your IIS user (e.g. ASP.NET or IUSR_MACHINENAME) has read/write permission and also (if it fits with your security policy) the ability to create folders. You may also find that ASP.NET is being denied access to its own preferences (e.g. C:\Documents and Settings\MACHINENAME\ASPNET or C:\Documents and Settings\NetworkService.

If this doesn't help...

You need to establish a test case to establish the boundaries of the problem.

  1. If you are using ASP .NET please download the .NET base test case. If you are using Classic ASP, use the COM base test case.
  2. Log on as Administrator. Because the code in the test cases is run as the logged on user you are bypassing any permissions issues which may exist in ASP.

    You first need to run the base test cases as-is. These will default to a simple render of a file based URL. If you see an issue then restart and try again. If you still see an error then ensure your machine is fully patched and up to date and then try again. If the error still occurs then please contact us describing exactly what you've done and what error you are seeing.
  3. Assuming the base test case works then you need to try a different URL. Try one on the web (e.g. but do first ensure that you can browse to that URL using IE on the same machine as you are running ABCpdf on. You should see the same content in IE as you do in your output PDF. If not, please contact us describing exactly what you've done and sending us the URL and the incorrect output PDF.
  4. If you are using the Gecko engine then install Firefox on this machine and repeat this same test. As well as viewing the URL you should also print it to PDF or XPS and look at that output. This is necessary because the Gecko engine may use different stylesheets for different media types and so screen and print output may be quite different.
  5. Assuming your web based URL works then try the URL you are using in your code - the actual page you want to render. See what kind of output you get.

    If the output is correct then copy the exact same code to an ASP page and try it. Any difference between the operation of the code under ASP and in the test cases will be due to permissions issues. See this support page for how to resolve permissions issues.

    If the output is incorrect then browse to that URL and save the web page using IE. Then copy the saved web page to the same web site and try rendering that (static) page using ABCpdf. If the output from the static page is correct then your dynamic page is not returning the output you think it is. If the output from the static page is incorrect then send us through the saved page and the output PDF and tell us what's wrong with the PDF.

Please work through these instructions before contacting us. If you can tell us what you've done and what results you've had this will save us all a lot of time.

My code is throwing errors like "'Unable to render HTML. Page load timed out. Unable to load page".

The typical reason a timeout is reported is because a page takes too long to load. ABCpdf expects a page to finish loading within 15 seconds. If it doesn't it will time out. So... hardwire your URL into the code so you are sure it's correct. Open the same URL in IE. How long is your page taking to load when you view it in IE?

Assuming it takes longer than 15 seconds you need to adjust the timeout - see the HtmlOptions.Timeout property.

Don't make the timeout too high - keep it realistic. If you set a HtmlOptions.Timeout value of ten minutes and a HtmlOptions.RetryCount of 5 then you are telling ABCpdf that it can spend up to an hour trying to get the page. If this happens, to all intents and purposes it will look as if the process has hung.

Occasionally timeouts may be reported because ABCpdf does not have permission to access a page. However this is unusual. If you suspect that this may be the case you will need to run through the blank page troubleshooting instructions in the previous section.

I am getting a "Windows error 193. %1 is not a valid Win32 application" error.

This is a permissions issue related to the creation of MSHTML objects. Please start by checking the "I am having problems with Security." section of this page.

Sometimes this permissions issue can have a base cause in an old or inconsistent installation of MSHTML. If this is the case then updating IE and restarting may well resolve the issue.

As with all permissions changes take great care. It is vital you ensure you know how to back these changes out should you decide that they are inappropriate. If you are unsure then please do not make any changes.

Open the Component Services control panel. Right click on the 'My Computer' icon to get up generic COM/DCOM permissions. Check the Launch and Access permissions. If your IIS user (typically ASPNET or IUSR_MACHINENAME) does not have Launch and Access permissions it may be denied permissions to create or use MSHTML objects.

The issue may be related to the fact that your IIS user doesn't have "log in a batch job" permissions. Try assigning the permission to that user.

Restart your computer and try your code again.

Why does my font not work?

ABCpdf will allow you to use any valid TrueType or Type 1 (PostScript) font.

ABCpdf will not embed fonts which do not explicitly permit it. This is a measure in place to protect you from inadvertently infringing copyright. However you can override this behavior and force ABCpdf to embed these fonts. See the Doc.EmbedFont method and the Doc.HtmlOptions.FontProtection property in the documentation for details.

ABCpdf maintains a font cache. This means that for ABCpdf to pick up on a newly installed font you will need to restart any processes that are using ABCpdf.

Alternatively you can pass the path to your font file to the AddFont or EmbedFont method. This will automatically load the font file. Do not move the font file after doing this - ABCpdf relies on fonts staying in place.

ABCpdf will automatically find any font in the Fonts folder. However applications such as Adobe Type Manager may place the font files in a different folder. If this is the case then ABCpdf won't be able to see them.

Sometimes permissions are placed on individual font files which may restrict access from restricted permission accounts such as ASP or ASP.NET. If you change font permissions (including when you add a new font to the system), you may need to reboot to ensure ABCpdf sees the changes.

Occasionally TrueType fonts are corrupt or non-standard. This can cause problems for ABCpdf (which will refuse to recognize them) or Acrobat (which will refuse to use a font embedded in the PDF). However this type of problem is relatively infrequent and tends to be restricted to unusual fonts such as bar-codes.

If you hit a problem you think is related to a corrupt or nonstandard font please mail us the font and we'll see what we can suggest.

How do I automatically print my PDF documents?

You can use ABCpdf to render your PDF. However while ABCpdf will manage the rasterization you will need to manage the printer control. The ABCpdfView example project (included with the ABCpdf .NET install) shows how to do this and provides starter code for printing using ABCpdf.

Alternatively to script Acrobat to print a document you can run it silently from the command line. Use the following syntax.

AcroRd32.exe /t path printer driver port

The path is the path to the PDF document. The printer is the name of the printer. The driver is the name of the driver - as it appears in the 'Driver Used' box. The port is the printer port (this cannot contain backslash characters).

You can also script Acrobat to print via Automation. You need to use the AVDoc.PrintPages... suite. More information can be found on the Adobe web site.

How do insert bar codes into my PDF documents?

There are lots of free and commercial bar code fonts which will allow you to do this quickly and easily.

ABCpdf will allow you to insert barcode TrueType fonts into your PDF and thus produce barcode output. Please ensure you embed the barcode font and please ensure you have permission to do this.

We suggest starting at the barcode-1 site for your code 39, code 93, code 128, DataMatrix, Interleaved 2 of 5 & 2 of 5, OCR-A & OCR-B, PDF417, Postnet and UPC/EAN barcode fonts.

Look for TrueType fonts which are embeddable into PDFs for use by ABCpdf.

How do I change the PDF Page Size?

See the Doc.MediaBox property as detailed in the documentation.

Why don't my documents measure up when I print them?

In every case we've come across the issue has not been with the PDF output produced by ABCpdf - it's with the way that Acrobat and Windows does the printing.

Normally you can solve these issues by adjusting the PDF and by ensuring that the print options on Acrobat are correct.

Check the print dialog. Make sure you don't have the 'Shrink oversized pages to paper size' or 'Expand small pages to paper size' or 'Auto-rotate and center pages' options checked.

Are you printing on a postscript printer - if not you may not get exact output.

Try using AddGrid to add a background grid to your image. This may show how the PDF is being changed as it moves from screen to paper.

You may find it helpful to specify a CropBox for your document (this may affect the way that Acrobat prints pages). To insert a CropBox for the current page use:

theDoc.SetInfo(theDoc.Page, "/CropBox:Rect", "30 30 562 732")
' standard mediabox inset by 30 points
' you will probably need to adjust this rect

If you cannot see a solution send us a simple example of a PDF which prints correctly and one which doesn't. If you can do this we should be able to find what it is that is different between the two. We can then tell you how to achieve this using ABCpdf.

Can I convert my PDFs to JPEG / TIFF / GIF using ABCpdf?

Yes - see the Doc.Rendering property as detailed in the documentation. You need an ABCpdf Professional License for PDF rendering.

Simply write code like this (this is ASP but the .NET code would be very similar):

Set doc = CreateObject("ABCpdf9.Doc")
doc.Read "c:\myfile.pdf"
doc.PageNumber = 2
doc.Rendering.Save "c:\mypreview.jpg", ""
Why am I having problems displaying my PDFs in a browser?

The combination of a browser and Adobe/Acrobat Reader is not always trouble free - particularly under HTTPS or using older browser versions. It's difficult to know exactly where the problem lies because there is an interaction of the Operating System/IIS, the browser and Adobe/Acrobat Reader. Any of these can be the cause.

Sometimes browsers get 'stuck' on a particular content type and insist on displaying your PDF as HTML. In this case you will see random text starting with %PDF. Often this can happen if you send PDF data to a window which was previously displaying HTML.

Sometimes server-side debugging results in extra data being inserted into the content stream. While this may not matter for HTML it will corrupt binary documents like PDF.

Sometimes your code may inadvertently insert extra data into the content stream. Again this will corrupt the PDF.

HTML Compression is something that some versions of Adobe/Acrobat Reader can be unhappy about. If your server provides compressed output then Acrobat may simply display a blank page. You should know whether you've enabled IIS compression or not - it's off by default. If you are really not sure then use a utility like IEWatch to check the content headers being returned. If you see gzip then you are seeing compressed content. (If you are using IIS6 compression, this can be switched off on a file by file basis by altering settings in the Metabase.)

File caching can cause problems, especially when working on secure connections. If the cache headers are set to no-cache or the cache expires before Acrobat sees the document then the browser can get into a situation in which it asks Acrobat to open a document only to delete it before Acrobat can do so. Look out for Response.CacheControl = "no-cache", Response.AddHeader "Pragma", "no-cache" and Response.Expires = -1.

For testing purposes you may wish to change the content-disposition from 'inline' to 'attachment'. This will allow you to download the data rather than view it in your browser. You can then check the downloaded document using Acrobat or a hex editor. All PDFs should start with "%PDF" and should end with "%%EOF".

Alternatively if the problem is that PDFs seem to be cached you may wish to check the 'Enable Content Expiration' checkbox you will find under the Web Site Properties.

(If you are using IIS 7.5 or higher, and ASP Classic - but not ASP.NET - we've see reports of a bug in IIS's handling of the content-length HTTP header. Does streaming a PDF work if you remove it?)

We would suggest two steps:

  1. Your first step should be to eliminate ABCpdf as the cause. Why not save the PDF to disk at the same time as sending it to the client? That way you can establish that the PDF is fine. If you want to take it further you could then read the PDF data from disk and stream it direct to the client.
  2. The example site streams PDF data direct to the client. So install the example site into a new virtual directory and establish if the same issue exists for the example site. If it works then it's simply a matter of moving your current code base and the example site code base towards each other until you find the cause of the issue.

If this doesn't help please do get in contact with us describing exactly what you've done.

Why are my styles and images not working when I use AddImageHtml?

HTML does not exist within a file and so it does not have a location.

External stylesheets and images are often referenced via relative URLs. Because the HTML has no location it is impossible to resolve these relative references.

So you need to provide your stylesheet and image links as absolute references. Or you may be able to use the HTML BASE element to specify an appropriate base location. Or you can save your HTML to file in an appropriate location and then use AddImageUrl.

Can I put ABCpdf .NET on my shared / hosted site?

In general - yes.

You need to follow the instructions in the Concepts: Manual Installation section of the documentation. Any DLLs will need to be placed in your bin directory and the license (or trial license) key will need to be incorporated into your code.

Most installations of ABCpdf .NET on shared servers are seamless. However you need to be aware that you are a guest on the server and your host may have locked down permissions in ways which will make your life difficult. If this occurs there is typically little that either you or us can do about it.

This is why we recommend deployment on a dedicated or virtual private server (VPS). VPS hosting is now incredibly cheap and the level of control it allows is only one of the very significant advantages it affords. It is a truly wonderful deal.

If you have to deploy on a shared site the essential thing to do is to deploy early and discover any issues before they become major problems.

Why are my pages being cached when I use AddImageUrl and stream the resultant PDF to the browser?

There are two possible causes.

The first is that the URL is in some way being cached. Just because you've disabled the ABCpdf cache doesn't mean that it's not being cached somewhere else. See the HTML / CSS Rendering section of the documentation for details.

The second is that the PDF itself is being cached. Most commonly this kind of thing can happen if you are streaming the PDF direct to the browser and you have certain IIS settings (e.g. Expire Content) disabled.

Your first step should be to narrow down the problem. Why not save the PDF to disk at the same time as sending it to the client? That way you can establish whether the PDF itself is being cached or whether the URL is being cached (resulting in the same PDF being created again and again).

If the URL is being cached you will need to look at the dummy URL method. ABCpdf is not doing the caching but something else is and you need to work around it.

If the PDF is being cached you will need to look at your IIS settings. Again ABCpdf is not doing the caching (and indeed it cannot cache the PDF in this way) it is something which is happening either in IIS/ASP or on an intervening proxy server or on the client.

In most cases the dummy URL method (detailed in the documentation) is the fastest route to a solution.

How do I use ABCpdf from WebMatrix?

The way in which Assemblies are linked from a particular development environment is very much dependent on the development environment. So for best practice you should consult the documentation for your chosen environment.

However you might like to use a register tag to link to the assembly and import the namespace:

<%@ Register TagPrefix="pdf" Namespace="WebSupergoo.ABCpdf6"
Assembly="ABCpdf, Version=, Culture=neutral, PublicKeyToken=a7a0b3f5184f2169" %>

Obviously you'll need to modify the version and possibly the key to match the assembly you are using.

Why is Acrobat telling me my fields are malformed after I use ABCpdf to delete them?

If you create forms using Adobe Designer (which comes with Acrobat 7) it will make use of some new field references which were not used in version 6.

If fields are deleted and the field references are left intact then Acrobat may complain that the fields are invalid.

To solve the problem delete the AcroForm after deleting the fields. For example:

theDoc.SetInfo theDoc.Root, "/AcroForm:Del", ""

Alternatively if you are simply setting field values then you may be able to achieve what you want by deleting the XFA elements:

theDoc.SetInfo theDoc.Root, "/AcroForm/XFA:Del", ""
Why am I finding it so difficult to work with Adobe Designer forms? Why are my Acrobat 7 forms working so differently from my Acrobat 6 ones?

Adobe Designer may be installed as part of Adobe Acrobat but it is a fundamentally different application which simply happens to use PDF as an output format.

In more detail...

You can use Acrobat to edit forms using the Advanced Editing tools available under the Tools menu. However if you choose items from the Forms menu or toolbar then you will probably find that you end up editing your form in Adobe Designer rather than Acrobat.

Adobe Designer uses PDF as an output medium. However the way that Designer operates means that forms created by Designer are fundamentally different from forms created by Acrobat.

For example an Acrobat created form typically contains a background and then a set of fields. The fields operate separately from the background.

Adobe Designer created forms do not make this distinction. They use a separate data store to specify the fields. The PDF content is merely the visible rendition of this field specification. The underlying field specification is made up of chunks of XML embedded in the PDF.

Because Designer documents are PDF documents you can add content to them using standard ABCpdf methods of adding PDF content. However if you then open them in Designer the content will most likely be deleted as Designer recreates the PDF appearance using the separate field specification.

Equally because the PDF output is merely the visible rendition of a separate field specification the fields and background may be tied to each other. So you might use ABCpdf to delete a field and find that the border has been left behind.

If you want to modify forms you will generally find it easiest to work with Acrobat created forms than Designer created ones.

I am having problems with when I try to convert documents to PDF. How do I troubleshoot these?

Please do consider whether you should be using WordGlue .NET in place of this type of interactive application.

WordGlue .NET. is our own layout engine supporting doc and docx formats. It is designed specifically for unattended use from multiple threads in high stress, restricted permission environments. It comes complete with projects showing how to integrate with ABCpdf.

Troubleshooting tips for issues can be found here...

Why might I see "Exception of type 'System.ExecutionEngineException' was thrown."?

When certain security attributes are applied to an assembly this may crash the CLR (Common Language Runtime) under .NET 3.5 SP1. The issue is intermittent and the periodicity is related to the environment. We have an open Tech Support incident with Microsoft relating to this. They have confirmed the bug but they have not told us when it will be fixed.

We have worked around this issue in ABCpdf version 7 (minor version 7010).

An alternative would be to remove SP1 and wait for a fix from Microsoft.

Why am I seeing different PDF output after installing/updating IE8 on my server? (pre-ABCpdf7012)

ABCpdf uses the MSHTML component (installed with Internet Explorer) when rendering HTML to PDF.

Although we've always attempted to maintain as much compatibility as possible between ABCpdf and different versions of IE, we've had to introduce changes in ABCpdf version 7 (minor version 7012) in order to interoperate with IE8 when rendering some types of HTML content.

Otherwise, if you come across an issue using IE8 with older versions of ABCpdf you would need to continue to use IE7.

ABCpdf 8 offers a choice between using the MSHTML and Gecko rendering engines.

I see the exception "Unable to load DLL 'ABCpdf9-64.dll': The specified module could not be found." or "Unable to load DLL 'ABCpdf9-32.dll': The specified module could not be found." (or "Unable to load DLL 'ABCpdf8-64.dll': The specified module could not be found." or "Unable to load DLL 'ABCpdf8-32.dll': The specified module could not be found.")

This means that Windows is unable to find the named DLL. This is typically because the software has not been properly installed, or the CLR is trying to find a version that does not exist on your system. You should output the value of IntPtr.Size. If it is 4, your application is running in a 32-bit process and you should use 32-bit ABCpdf. If it is 8, you should use 64-bit ABCpdf.

If you have a 32-bit version of ABCpdf installed but your project is running in 64-bit mode you will get an error to say that "ABCpdf9-64.dll" could not be found. To fix this you could change your project properties to target an x86 platform. Alternatively you could install ABCpdf x64, so that it works in both 32 and 64-bit modes.

The default set-up of IIS (in 64-bit Windows) runs in 64-bit mode. However, Visual Studio has a tendency to start ASP.NET in 32-bit mode if you debug with Visual Studio. Also, if your server also runs pages that use third-party COM components that work on 32-bit Windows, chances are that IIS on your server is running in 32-bit mode.

ASP.NET can run in 32-bit or 64-bit mode on 64-bit machines. For more details, please see IIS7 - Running 32-bit and 64-bit ASP.NET versions at the same time on different worker processes.

The minor version (e.g. of the ABCpdf.dll and ABCpdf9-XX.dll files must be the same.

If the ABCpdf DLLs are in the bin folder, and your application is on a UNC share, you may need the following code before any ABCpdf code:

if (HttpRuntime.IsOnUNCShare)
    var path = Environment.GetEnvironmentVariable("Path",  EnvironmentVariableTarget.Process);
    if (path != null)
        if (path.IndexOf(HttpRuntime.BinDirectory, StringComparison.OrdinalIgnoreCase) < 0)
            path = path.Trim().TrimEnd(';') + ";" + HttpRuntime.BinDirectory;
            Environment.SetEnvironmentVariable("Path", path, EnvironmentVariableTarget.Process);

A Professional license covers use of the 64-bit or 32-bit download, while the Standard Edition is only available in 32-bit form.

I am having problems with MS Office/Word/Excel when I try to convert documents to PDF. How do I troubleshoot these?

Please do consider whether you should be using WordGlue .NET in place of this type of interactive application.

WordGlue .NET. is our own layout engine supporting doc and docx formats. It is designed specifically for unattended use from multiple threads in high stress, restricted permission environments. It comes complete with projects showing how to integrate with ABCpdf.

If using ABCpdf version 8 or newer, please see our guide for configuring and using the MSOffice read module...

For older versions of ABCpdf, or help in setting up the XpsAny read module, please see our troubleshooting tips for Microsoft Office issues...

Please note that the error "Could not find office app window (0)" results from a failed FindWindow call, which normally happens when launching Office from a Windows Service (including IIS). Office and ABCpdf do not run under the same account, or the account has no Window support. Please work through one of the procedures mentioned in the above link.

Why is Visual Studio 2010 telling me I am referencing .NET 3.0?

ABCpdf links into whatever functionality is available in .NET at runtime. It links into .NET 3.0 but will run quite happily against .NET 2.0 with certain elements of functionality disabled.

Unfortunately the ability to do this, available in Visual Studio 2005 and 2008, has been removed in Visual Studio 2010. So Visual Studio 2010 will insist that you target .NET 3.0 even though ABCpdf doesn't actually require it. If this happens you will see errors like this when you try to build:

Compile complete -- 9 errors, 0 warnings
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9): warning MSB3268: The primary reference "ABCpdf" could not be resolved because it has an indirect dependency on the framework assembly "WindowsBase, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v2.0". To resolve this problem, either remove the reference "ABCpdf" or retarget your application to a framework version which contains "WindowsBase, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35". C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9): warning MSB3268: The primary reference "ABCpdf" could not be resolved because it has an indirect dependency on the framework assembly "PresentationCore, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v2.0". To resolve this problem, either remove the reference "ABCpdf" or retarget your application to a framework version which contains "PresentationCore, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35". C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9): warning MSB3268: The primary reference "ABCpdf" could not be resolved because it has an indirect dependency on the framework assembly "ReachFramework, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v2.0". To resolve this problem, either remove the reference "ABCpdf" or retarget your application to a framework version which contains "ReachFramework, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35".
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9): warning MSB3268: The primary reference "ABCpdf" could not be resolved because it has an indirect dependency on the framework assembly "PresentationFramework, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v2.0". To resolve this problem, either remove the reference "ABCpdf" or retarget your application to a framework version which contains "PresentationFramework, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35". C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9): warning MSB3268: The primary reference "ABCpdf" could not be resolved because it has an indirect dependency on the framework assembly "UIAutomationProvider, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v2.0". To resolve this problem, either remove the reference "ABCpdf" or retarget your application to a framework version which contains "UIAutomationProvider, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35". C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9): warning MSB3268: The primary reference "ABCpdf" could not be resolved because it has an indirect dependency on the framework assembly "UIAutomationTypes, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v2.0". To resolve this problem, either remove the reference "ABCpdf" or retarget your application to a framework version which contains "UIAutomationTypes, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35". C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9): warning MSB3268: The primary reference "ABCpdf" could not be resolved because it has an indirect dependency on the framework assembly "System.Printing, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v2.0". To resolve this problem, either remove the reference "ABCpdf" or retarget your application to a framework version which contains "System.Printing, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35".

Obviously the simplest solution is to change your project target to .NET 3.0. However for those that are unable to do this you can change the project settings manually to enable linking against .NET 2.0.

Suppose you have a project called 'MyProject'. In your Visual Studio 2010 solution:

  1. Click on the Reference to ABCpdf
  2. In the Properties window change the 'Specific Version' property to true
  3. Right click on the project that references ABCpdf and select 'Unload Project'
  4. Right click on it and select 'Edit MyProject.csproj'
  5. Find the reference to ABCpdf (which will look something like this)
    <Reference Include="ABCpdf, Version=, Culture=neutral, PublicKeyToken=a7a0b3f5184f2169, processorArchitecture=MSIL" />
  6. Add in a <SpecificVersion> tag (so it will look something like this)
    <Reference Include="ABCpdf, Version=, Culture=neutral, PublicKeyToken=a7a0b3f5184f2169, processorArchitecture=MSIL">
  7. Save and close the XML file MyProject.csproj
  8. Right click on the project and select 'Reload project'
  9. Compile and run
Converting HTML with IE9 installed, I see the exception: 'ABCpdf could not initiate MSHtml engine for this version of Internet Explorer installed.'

Using IE9 on the same system as older ABCpdf versions may cause this error message. ABCpdf version 8.1 and later are fully compatible with IE9 and also provide a Gecko-based HTML engine.

When converting HTML to PDF, ABCpdf uses the MSHTML component installed with Internet Explorer as the first stage of the process. The issue when using older ABCpdf versions is related to a set of problems Microsoft introduced in IE9. We (and other developers) reported these issues to Microsoft in September 2010 but unfortunately they have not been fixed.

Unfortunately with the official release of IE9 Microsoft released new documentation which says the IHTMLElementRender::DrawToDC function that was required has been deprecated. This is especially unfortunate given that there is no replacement for this function.

Given that Microsoft appears to be unwilling to support these interfaces we would strongly recommend that on new deployments you consider a move to the new Gecko-based HTML engine available in ABCpdf 8. It is just one line of code to select the Gecko rendering engine (see the Doc.HtmlOptions.Engine property).

How do I make my eForm fields savable using Acrobat Reader?

Acrobat Reader XI provides features to save eForms out of the box. Provided your clients are using this version of Acrobat they will be able to fill in and save standard PDF forms. The only problem you may have relates to older versions of Acrobat Reader which did not have this feature.

In Acrobat X and earlier, saving the contents of forms was something which Adobe regarded as an Acrobat Pro feature. However it was a key feature present in other rivals to PDF. As such Adobe allowed PDF documents to be created which contained special flags which enabled certain Acrobat Pro features in the free Acrobat Reader. Features like filling in and saving forms.

Adobe tightly restricted the way in which these documents could be created. Specifically these documents contained a signature based on a certificate issued by Adobe. Without such a certificate you could not create or modify these kinds of documents. Adobe are not generally issuing certificates to allow this type of signature to be created. We believe the only company outside Adobe to have one is SAP.

It is possible to create something similar to a form which is savable using older versions of Acrobat Reader. This is because Acrobat Reader allows you to save changes to annotations as long as they are not part of an eForm. So by removing the form fields from the eForm you can be left with a collection of savable annotations. From a technical point of view the document is no longer a form but from a users point of view it may look like one.

doc.SetInfo(doc.Root, "/Perms:Del", ""); // make sure you have rights to do this
doc.SetInfo(doc.Root, "/AcroForm:Del", "");
Page[] pages = doc.ObjectSoup.Catalog.Pages.GetPageArray();
foreach (Page page in pages) {
  Annotation[] annots = page.GetAnnotations();
  foreach (Annotation annot in annots) {
    StringAtom da = DictAtom.GetItem(annot.Atom, "DA") as StringAtom;
    if (da == null) continue;
    string ap = da.Text;
    if (!ap.Contains(" 0 Tf")) continue;
    double fontSize = annot.Rect.Height * 0.8;
    da.Text = ap.Replace(" 0 Tf", String.Format(" {0:0.##} Tf", fontSize));

So why don't we have this as a feature in ABCpdf? Well Adobe have some of the best software engineers on the planet so it would seem to us that the fact that this feature exists means that it is intentional. It would seem inconceivable that this is an oversight. On the other hand the legal agreement for Acrobat Reader would appear to prohibit it being used for saving forms. But then this is not a PDF form. But then it might look like a form to an end user. EU law would appear to make it impossible to prohibit this type of operation. But not everyone is in the EU. There are a whole host of issues like this that are confusingly conflicted.

As such we do not feel that we want to make a judgment here. You need to look at the above code carefully and consider it in the context of the Adobe PDF Specification and the EULA for the version of Acrobat Reader you are targeting. At that point you can make an appropriate and informed decision based on your own use, position and legal advice.

How do I manually install ABCpdf? What do I copy to the bin directory? How do I get the license recognized?

We would strongly recommend installing ABCpdf by running the installer while logged on as Administrator. This is for two reasons - simplicity and standardization.

Installing manually is not difficult. Nevertheless we see a surprising number of problems related to incorrect manual installations. Make your life easy and do things the simple way.

While you may know what you've installed, a couple of years down the line your colleagues may not. If we get a support request asking about ABCpdf we will be able to help if the DLLs are installed in a standard way. If they're installed in some location that made sense to you, then things get a lot more complex. Make your colleagues' life easy and do things the standard way.

However if you have to install manually it is pretty simple. You will need to copy some files onto your machine and you will need to write a couple of lines of code to install your license. Please search the documentation for 'Manual Installation' and you will find details.

Why does Gecko take longer to render the first page?

It's possible Gecko is timing out while attempting to validate a site's SSL certificate. To set a shorter timeout and work around the problem, open the Group Policy Editor in Windows (gpedit.msc) and navigate to Local Computer Policy > Computer Configuration > Windows Settings > Security Settings > Public Key Policies.

Certificate path validation settings.

Open the properties for Certificate Path Validation and select the Network Retrieval tab.

certificate path validation settings, network retrieval
Why is my COM or Classic ASP installation not working with ABCpdf?

The best and safest way to install is to run the ABCpdf installer. While manual installation is simple, it is surprising how many errors are related to failures to perform this step correctly. We would thoroughly recommend running the installer rather than attempting a manual installation.

If you must install manually please note that ABCpdf .NET installation is standard .NET xcopy. COM installation is a standard Microsoft regasm command. It is very simple but you must get it right. If you do not then nothing will work. See the ABCpdf .NET documentation for further details.

To test your COM installation please run a simple hello world VBS. Copy the following text into a text file and then rename it mytest.vbs. If you are on an x86 system you can just double click to run. However if you are on an x64 OS you can run your VBS in either 32 or 64-bit mode. Double clicking will run in x64 mode however you should also test 32-bit mode. You can do this by dropping your VBS on the wscript.exe app you will find in SysWow64. Please try both modes and let us know that both are working.

Set d = CreateObject("ABCpdf11.Doc")

d.FontSize = 96
d.AddText "Hello World!"
d.Save "mydoc.pdf"
MsgBox "Finished"

If they are not working then under the ABCpdf menu item you will find ASP and COM documentation and a batch script for registering ABCpdf for use under COM. If you have run the installer and for some reason your COM interfaces are not working then re-running this batch script is the first thing you should do. Then test again.

If still things are not working please do a simple sanity check on the installation. Open PDFSettings and see it produces a sensible description for your trial license. PDFSettings loads up ABCpdf so if it works then this is a pretty good indication that the installation is good.

The batch script is just a simple wrapper for the Microsoft regasm .NET tool. The script is designed around registering the DLLs from a standard installation. While it may serve as a useful illustration of how to register a .NET assembly under COM, if there are any problems you should be looking at using the regasm tool directly. Open the script and look at it in Notepad to see how it works. It is pretty simple but you may find the Microsoft regasm documentation useful.

You are likely to need to run as Admin (right click and start your command prompt using Run as Admin). Similarly please bear in mind that there are both x86 and x64 versions of the tool so you will need to try both. Please do this.

If it is still not working then you first need to validate that the .NET side of things is working. Please download this simple "Hello World" .NET project. Copy the DLLs into the bin directory of the project. Uninstall ABCpdf to ensure that only those DLLs are used. Compile it up and. run it on a different machine. It should produce a PDF.

Then copy that project to your new machine. Run it. It should produce the same. That will demonstrate that there is no problem loading the ABCpdf DLLs or dependent DLLs. If there are problems then this would indicate generic issues related to your installation rather than anything specific to do with ASP or COM.

Then use regasm to register those same DLLs from the bin directory of that project. If there is a DLL load error then it relates to something outside ABCpdf.

If you need to track that down then you may get more details using the regasm verbose option. Alternatively you can use Process Monitor to check what files are being searched for and what appear to be missing.

The above should allow you to track down the problem. However please keep detailed notes for each of the points above so that in the unlikely event that you cannot track down the problem, you can tell us - exactly - what you've done and what the results were.

Please note that you do not really need the tlb which comes with ABCpdf .NET. We include it but regasm will generate it for you.

What does this error mean? ABCpdf error '80131600' Failed to add HTML: RPC to Gecko engine process failed. Exception was thrown in another thread: The directory name is invalid.

This error could occur under some circumstances in earlier versions of ABCpdf Version 10. The solution is to upgrade to the current release.

I'm running a static security scan on ABCpdf and it's giving me a warning related to a call to CreateProcessWithLogonW. Do I need to worry?

Typically static scans look for calls to unusual functions and then flag them as suspicious.

Please see our security page for details of the problems with this type of approach, and the ways in which you should run any such scans.

The CreateProcessWithLogonW call is used for the creation of ABCGecko worker processes by TaskGarden - a .NET equivalent to .NET Enterprise Services. We use TaskGarden because although .NET Enterprise Services sounds like a .NET type of thing it is actually based on COM and our experience is that clients find it difficult to configure.

The particular call relates to loading a worker process file for Gecko HTML conversion. If you wish to avoid this call just don’t use the Gecko engine in your code. If you use the Gecko engine you should note that there is validation done on the worker process file to ensure that it is correct.

In older versions of ABCpdf there are checks done to ensure that the engine is valid but these are based more around protecting against inadvertent mix ups in deployment rather than malicious insertion by a sophisticated enemy. In newer versions (ABCpdf onwards) a more rigorous approach is taken - a hash of the file is calculated to ensure that it is the same as the one the product was built against.

However, our feeling is, in both older and newer versions, in order to insert a Trojan horse, attackers would already need level of access to your systems which would have compromised them so severely that they would be effectively wide open. At this point there would be much easier avenues open to your attacker.

I'm seeing occasional mysterious errors in MSHTML HTML conversion. These seem to be associated with events in the Application Event Log stating "Post operation taking an excessive time". What is causing this?

This is typically associated with Anti Virus (AV) apps intercepting HTML conversion and then failing or reducing the system to a crawl. This means that the results that ABCpdf is expecting, never return. Changing to a different AV app will normally solve the problem.

When I use the ABCChrome HTML rendering engine I get "Unable to render HTML. ABCChrome has terminated unexpectedly. Status entrypoint not found." What does this mean?

This error message relates to missing functions in Windows DLLs. It is what you will see if the machine you are running on is not sufficiently up-to-date.

The ABChrome HTML rendering engine requires Windows 2008 R2 / Windows 7 or later. It runs only on x64 systems.

The standard scenario associated with this type of message is related to deployment. Typically people develop on an up-to-date version of Windows. However then they may try deploying to an older one such as Windows 2008, at which point the issue would occur.

I have a site running under Classic ASP. Around the 10th July 2018 I started getting an error "ActiveX component can't create object". Why?

Microsoft security update CVE-2018-8202 describes a situation in which,

"A local user can run a specially crafted application to exploit a flaw in the activation of COM objects and gain elevated privileges"

To be more specific,

An "elevation of privilege" vulnerability exists in .NET Framework that could allow an attacker to elevate their user rights level. To exploit the vulnerability, an attacker would first have to access the local computer, and then run a malicious program. This update addresses the vulnerability by correcting how .NET Framework enables COM objects.

Unfortunately the fix for this - released around the 10th July 2018 - has had the side effect of disabling calls to create objects under Classic ASP.

Our products use the standard methods that are built into .NET - ComVisible attributes and regasm.exe. So there is nothing unusual in our implementation and indeed we suspect this is affecting all .NET classes that expose COM interfaces.

The error reported is "ActiveX component can't create object" under Classic ASP at the call to CreateObject. So typically at the following point,

Set theDoc = Server.CreateObject("ABCpdf11.Doc")

This security update is contained a number of system updates including KB4338417, KB4340558, KB4338420 and KB4340559.

Backing out the update is one way to resolve the issue. Though without the update the system will remain vulnerable - you would need to establish if this is likely to be acceptable.

Alternatively you may wish to align your IIS and Web Site users which should also resolve the issue.

Classic ASP generally runs in the DefaultAppPool. The Identity setting for the pool should be ApplicationPooldentity. Assuming this is the case you just need to go to IIS and select your Web Site. Double click the "Authentication" icon. Right click on the "Anonymous Authentication" setting and select 'Edit'. Choose the "Application pool identity" radio button.

The ABCGecko HTML engine is returning messages like "1534937003936 addons.manager ERROR startup failed: [Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE)..."

Yes ABCGecko can return cryptic messages like the following:

1534937003936 addons.manager ERROR startup failed: [Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIPrefBranch.setCharPref]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: resource://gre/modules/AddonManager.jsm :: AMI_startup :: line 733" data: no] Stack trace: AMI_startup()@resource://gre/modules/AddonManager.jsm:733 < AMP_startup()@resource://gre/modules/AddonManager.jsm:2468 < AMC_observe()@addonManager.js:55 < 

Sometimes these messages can be displayed in hex format in which case you will see something like this:

[SerializationException: The input stream is not a valid binary format. The starting contents (in bytes) are: 31-35-33-35-31-34-35-31-37-38-30-30-34-09-61-64-64 ...] 

These types of error are caused by a failure of communication between ABCpdf .NET and ABCGecko.

Typically ABCpdf .NET and ABCGecko communicate via standard output. However under some circumstances it appears that other applications can steal standard output or redirect the standard error stream through to standard output. This destroys communication between ABCpdf .NET and ABCGecko.

This issue is most common on Azure and it is our suspicion that Docker may be the cause of this problem. However it may be that there is more than one cause.

The solution here is to use a different interprocess communication mechanism - named pipes are a good alternative.

You can specify this using the setting IPCTransport in your app.config or web.config.

If you are using the registry key you should use the value 1 as detailed in the documentation.

For the web.config syntax please refer to XSettings.SetConfigSection in the documentation.


For example code and projects, check out the online documentation for ImageGlue.NET here...

What is the difference between the Standard and Professional versions of ImageGlue?

ImageGlue Pro supports a greater range of image formats both for import and export and it also support native x64 execution. ImageGlue Standard will run on a 64-bit Operating System but only inside a 32-bit process.

The following import modules are specific to ImageGlue Professional: Xps, XpsAny (Microsoft Office), OpenOffice, Pdf, Eps, Svg, Swf, Jbig2. The following export formats are specific to ImageGlue Professional: PS (PostScript), EPS, PDF.

The example web works but my code doesn't.

If you are having problems getting ImageGlue to do what you want we may be able to help. Write to us but please provide a concrete example as well as the code you are using. Most problems are a result of misunderstanding and without both of these elements we can find it difficult to work out what's going wrong.

How do I return an image to the browser without writing a file out?

You can use Response.BinaryWrite to send raw data to the client. For example the following ASP code will display a red image. You can use similar code under .NET.

<% @Language="VBScript" EnableSessionState=FALSE %>

Set ca = Server.CreateObject("ImageGlue6.Canvas")
ca.Color = "red"
ca.Width = 100
ca.Height = 200
Response.ContentType = "image/png"
Response.BinaryWrite ca.GetAs("dummy.png","")
I installed ImageGlue ASP on my Windows 2000 Server and I keep getting error 'Server object, ASP 0177 (0x8007045A)'.

This error is often caused by overly strict security. Please see Microsoft Q175804. IIS needs (at minimum read) access to the registry and to the Windows directory where the QuickTime DLLs are installed - and of course read access to the directory where ImageGlue is installed.

This kind of error is not unusual on Windows 2000 Advanced Server. You need to change the IIS Anonymous user to some user that has appropriate access privileges. In fact you may well find that if you simply switch your IIS virtual directory properties to 'High - Isolated Process' the problem will just solve itself.

This error may also occur if another process has the ImageGlue DLL locked. For example if you try to access ImageGlue from a VBS script while IIS has the DLL locked you will get the same error from your VBS script.

Less frequently this error may occur if the DLL is not registered at all or if it has been unregistered. If you believe this is the case you should register the DLL manually - see below. After registering you should restart IIS to ensure the new settings are picked up.

How do I manually register ImageGlue 6 for ASP?

To register the ActiveX DLL for ImageGlue ASP (COM) you should first locate the DLL. Perform a search and look for ImageGlue6.DLL. To register you should:

  1. Open up a DOS window
  2. Navigate to the location where the DLL is located
  3. Type regsvr32 ImageGlue6.DLL
  4. Press return
  5. You should receive a confirmation message that ImageGlue has been registered
  6. The Application Event Log should contain an information message to confirm that ImageGlue has been registered

Note that this procedure is only applicable to ImageGlue ASP - .NET components do not need to be registered and indeed cannot be registered in this way.

When I try to use ImageGlue ASP from VB6 I get an error 'Variable uses an Automation type not supported in Visual Basic'.

The current version of VB doesn't understand the new neutral threading model. It tries to pre-validate the threading model and gets all confused. A simple work around is to use Late Binding and CreateObject rather than New. For example,

Dim MyCanvas As Object
Set MyCanvas = CreateObject("ImageGlue6.Canvas")

... rather than,

Dim MyCanvas As ImageGlue.Canvas
Set MyCanvas = New ImageGlue.Canvas
Why do I get these error messages?
"A QuickTime error occurred indicating that the file was not found (-43)."
"JPEG Error Message - Invalid file name."

Both error messages indicate that a file could not be written. This can be caused by an invalid file path. It may be that your IUSR user does not have permission to read/write to this directory or that he doesn't have permissions to overwrite or delete a file of the same name that already exists in this directory.

My text is not being anti-aliased when I draw text at very small font sizes. Why?

ImageGlue uses standard NT anti-aliasing requests (the ANTIALIASED_QUALITY flag). Normally this works fine but (and MSDN is a little vague on this) MS state that it may not work at either 'very small' (about 10 point) or 'very large' font sizes. It also only seems to work correctly in 16 or 32-bit color depth.

The height limitation is hardwired into the True Type Font itself in what is known as the GASP table (Grid-fitting and Scan-conversion Procedure). If you remove the GASP table using a utility such as TTFGASP the font will anti-alias at all sizes. However the size limitation is there for a reason and some characters may disappear completely if they are anti-aliased at very small sizes.

I see the exception "Unable to load DLL 'ImageGlue7-32.dll'", or "Unable to load DLL 'ImageGlue7-64.dll'"

This generally means either ImageGlue is not properly installed, or the CLR is trying to find a version that does not exist on your system. In your code, check the value of IntPtr.Size. If it is 4, your application is running in a 32-bit process and you should use 32-bit ImageGlue. If it is 8, you should use 64-bit ImageGlue.

The default set-up of IIS (in 64-bit Windows) runs in 64-bit mode. However, if you debug with Visual Studio it tends to run ASP.NET in 32-bit mode. Also, if your server runs pages that use third-party COM components that work on 32-bit Windows, chances are that IIS is running in 32-bit mode.

ASP.NET can run in 32-bit or 64-bit mode on 64-bit machines. For more details, please see IIS7 - Running 32-bit and 64-bit ASP.NET versions at the same time on different worker processes.

It's also important that the minor (file system) versions of the ImageGlue.dll, ImageGlue7-32.dll and ImageGlue7-64.dll files is the same.

A Professional license covers use of the 64-bit or 32-bit download, while the Standard Edition is only available in 32-bit form.

I have installed ImageGlue 6.1 ASP. When I open IGSettings I get an error "Run-time error 339
Component 'mscomctl.ocx' or one of its dependencies not correctly registered: a file is missing or invalid." What do I do?

IGSettings in ImageGlue 6.1 ASP (but not in ImageGlue .NET) uses various Visual Basic controls which normally come pre-installed.

We don't install them ourselves because they're extremely common and overwriting existing versions can be just the kind of thing you don't want. We try and keep web server installations as light as possible so you know what's going on.

Microsoft discontinued free support for Visual Basic 6 in April 2005. They are slowly withdrawing VB6 support from all aspects of Windows. You may well find that on fresh installs of recent releases of Windows that the standard VB6 controls are not available.

If these controls have not come installed on your system then you can get them at the Microsoft web site. However in the long run you should be transitioning to ImageGlue .NET.

I am using ImageGlue 6 or ImageGlue 7 under Classic ASP or COM. This version of ImageGlue is not supported on my new Windows server. How do I upgrade to ImageGlue 8?

Your first consideration should be whether this might be a good time to move to .NET. Microsoft do not view Classic ASP as a high priority and they are hardly likely to put a lot of effort into maintaining it. Our feeling is that this is quite apparent given the reports we see from some of our clients. The ImageGlue APIs are specifically designed to be easy to transition to .NET so it's not difficult to do.

If you have to maintain your Classic ASP / COM setup then you can use the COM Interop layer available in ImageGlue 8.

Install ImageGlue using the installer while logged on Administrator. Run the 32-bit installer on 32-bit systems and the 64-bit one on 64-bit systems. You will need a Pro license for 64-bit support, but since the trial runs as Pro and all upgrades take you to the Pro version this shouldn't be a problem.

Under the ImageGlue menu item there is an "Interop ASP and COM" folder. You need to run the registration script to register the COM interfaces. The script will register both 32 and 64 bit COM versions as appropriate.

In your code you need to change occurrences of CreateObject from ImageGlue6 to ImageGlue7. For example CreateObject("ImageGlue6.Canvas") should change to CreateObject("ImageGlue7.Canvas"). This should be a simple search and replace operation.

Although ImageGlue may be available in both 32 and 64 bit flavors, the same is unlikely to be true of other COM components you are using. So you will probably want to assign your site a new application pool and set the 'Enable 32-bit apps' flag.

If you have ImageGlue x64 installed and you are operating in 32 bit mode you may find that your license key is not being picked up from your ASP code. If you find that this is the case you should download and run our license installation scripts which will ensure that the license is available everywhere.

You may wish to select the "Enable Parent Paths" flag in the ASP Properties for the site so that you can use Server.MapPath with paths including '..' elements.

If you get any errors you should 'Enable Client-side Debugging' in ASP Properties and deselect the 'Display Friendly HTTP Messages' in Internet Options for your copy of IE. That provides a simple method of viewing errors in your browser.

If you are using ABCUpload you should note that it is only available in a 32-bit version. The page close action requires a small change in the progress bar so that the line currently,

if (<% =theProgress.PercentDone %> == 100) top.close();

should change to

if (<% =theProgress.PercentDone %> >= 95) top.close();

Both ASP and ASP.NET have problems writing to the event log. There are full details about this on the Microsoft web site in KB2028427.

Since the solutions are rather complex it is probably easier to change the ASP user to one with higher privileges or just avoid using the event log. If you are avoiding use of the Event Log you should ensure the 'Record All Errors in Application Event Log' checkbox in IGSettings is deselected.