Legacy

Not running an older version of our software? This page is for legacy versions only.

For current releases and advice please see our support page...

General Technical

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"
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 Introduction to IIS Architectures 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+)

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.ClearContent()
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 & """")
Else
  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

ABCUpload ASP

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.

ABCpdf

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

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 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.

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.

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=8.0.0.5, 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 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.

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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=3.0.0.0, 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=8.0.0.5, Culture=neutral, PublicKeyToken=a7a0b3f5184f2169, processorArchitecture=MSIL" />
    
  6. Add in a <SpecificVersion> tag (so it will look something like this)
    <Reference Include="ABCpdf, Version=8.0.0.5, Culture=neutral, PublicKeyToken=a7a0b3f5184f2169, processorArchitecture=MSIL">
        <SpecificVersion>true</SpecificVersion>
    </Reference>
  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 user's 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.

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 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 ABCChrome 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 ApplicationPoolIdentity. 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.

ImageGlue

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

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.