Wednesday, March 9, 2016

C++ Sample Project using Solid Framework SDK

With Solid Framework C++ SDK you can integrate the same PDF to Word technology used in Adobe® Acrobat® into your product for as little as a 10 MB increase in your installer size.

These C++ sample applications are available as ready-to-build Visual Studio projects and also as ready-to-run downloadable MSI installers. In both cases the samples work with developer licenses that you can generate using our self-service Developer Portal. In addition, the ready-to-run samples will also work with regular Solid PDF Tools desktop licenses (contact sales@soliddocuments.com for a reviewer license).


C++ sample is on our SDK documentation page along with other sample projects to get you going.

Solid Framework comes in two editions: a tools version and a professional version and is immediately available for download. Pricing for internal use of the professional version of the SDK starts at $1500/year. Licensing is also available for public redistribution. Licensing, distribution and product feature information is available at: http://www.solidframework.net/

Tuesday, November 10, 2015

Solid Framework - v9.1 build 6068

v9.1 build 6068 of Solid Framework Released


We have released an update to the Solid Framework SDK. A few of the highlights include:

- OCR Performance Improvements

- Reduced XML Complexity for .DOCX.



While this work was done primarily to help Apple software open .DOCX files, this improvement is also beneficial for making .DOCX output more editable.

- Vector Text and Graphics Conversion Work


- General PDF conversion quality improvements

The SDK is available from the developer portal.

Monday, December 15, 2014

Extracting Solid Framework for Installations.

Solid Framework is designed to extract its support files to the current users %AppData% directory on load. This is convenient, as there is only one dll to manage in your installer. But sometimes this can cause issues. One issue that can arise is a sporadic issue with overzealous 3rd party malware applications deleting the support files in the %AppData% folder, even though they are signed, strong named and time stamped. To work around this, you can extract the support files beforehand and reference these files in your installer.


To extract the 32 and 64 bit support folders from Solid Framework, you use the ExtractFramework.exe tool. Download the tool and SolidFramework AnyCPU dll into a folder. On the command line, run “ExtractFramework.exe .\SolidFramework.dll <Extraction folder> All”. <Extraction folder> should be replaced with a directory of your choosing. 



The All parameter tells ExtractFramework.exe to extract both the 32 and 64 bit folders. If you are releasing a 32 bit, or 64 bit only application, you can use Win32 or Win64 in place of All. 


We include both Win32 and Win64 folders in our installers. During installation, we detect if the OS is 32 or 64 bit, and install the appropriate folder to the application’s program directory. Do not include the larger SolidFramework AnyCPU dll in your install, because a smaller, 32 or 64 bit version is included in the Win32 or Win64 folders that will be installed in the application’s program directory that satisfies the application’s reference to SolidFramework.dll.



Wednesday, August 6, 2014

v9.1 build 5015 of Solid Framework Released

We have just released an update to the Solid Framework SDK. A few of the highlights include:
  • Improved rendering
  • OCR improvements to French, German and Russian language
  • Improved OCR support for san-serif high aspect ratio fixed pitch fonts
  • Better table detection and conversion
  • Improved font scaling
  • Improved image processing
The SDK is available from the developer portal.

Wednesday, June 11, 2014

New release of Solid Framework v9 Available

v9 build 4823 of Solid Framework Released
We have just released a major update to the Solid Framework SDK. A few of the highlights include:
  • Multi-processor parallel performance improvements with OCR (scanned PDF to Word, scanned PDF to PDF/A)
  • Less complex XML output for .DOCX which improves machine consumption of output and improves editing of Word documents
  • Many PDF to Microsoft Word, Powerpoint, Excel and text conversion improvements
  • Complex table reconstruction improvements
  • Data recovery from scanned PDFs into Microsoft Excel
The SDK is available from the developer portal.

Tuesday, June 10, 2014

Windows 8 Server, IIS and Solid Framework

Question: 

I create a simple web service. I’ve downloaded the anycpu version of Solid Framework. I’ve created a .NET MVC project in VS2013 and I have the following code:

public ActionResult Index()
        {
            try
            {
                License.Import(new StreamReader(@"C:\Projects\SolidFramework\license.xml"));

                String pdfPath = @"C:\Temp\PDFtoWord\legal.pdf";
                String wordPath = Path.ChangeExtension(pdfPath, ".docx");

                using (PdfToWordConverter converter = new PdfToWordConverter())
                {
                    //Add the selected file
                    converter.AddSourceFile(pdfPath);

                    //Continuous mode recovers text formatting, graphics and text flow
                    converter.ReconstructionMode = ReconstructionMode.Continuous;

                    //Or Use Flowing Reconstruction Mode if you need to keep the look and feel of the PDF
                    //converter.ReconstructionMode = ReconstructionMode.Flowing;

                    //Convert the file renaming it with the word extension and setting overwrite to true
                    converter.ConvertTo(wordPath, true);
                }
            }
            catch (Exception ex)
            {
                string innerException = "";
                if (ex.InnerException != null)
                    innerException = ".    Inner: " + ex.InnerException;
                logger.Error(ex.Message + innerException);
            }

            return View();
        }

The DLL is added to the project. It has created the folder C:\Users\xxxx\AppData\Local\SolidDocuments\SolidFramework\Bin\8_2_4514_1\W32, and SdAppSrv.dll exists in that folder. I’ve given Everyone full access to SdAppSrv.dll and SolidFramework.dll and the entire W32 folder, along with all files and the folder that the license sits in.

I get the following exception which is created at this point:
           
       using (PdfToWordConverter converter = new PdfToWordConverter())


{"Failed to load C:\\Users\\xxxx\\AppData\\Local\\SolidDocuments\\SolidFramework\\Bin\\8_2_4514_1\\W32\\SdAppSrv"}
    [System.InvalidOperationException]: {"Failed to load C:\\Users\\xxxx\\AppData\\Local\\SolidDocuments\\SolidFramework\\Bin\\8_2_4514_1\\W32\\SdAppSrv"}
    Data: {System.Collections.ListDictionaryInternal}
    HelpLink: null
    HResult: -2146233079
    InnerException: null
    Message: "Failed to load C:\\Users\\xxxx\\AppData\\Local\\SolidDocuments\\SolidFramework\\Bin\\8_2_4514_1\\W32\\SdAppSrv"
    Source: "SolidFramework"
    StackTrace: "   at SolidFramework.Configuration.Installer.InitializeNativePlatform(ProgressTicker ticker)\r\n   at SolidFramework.LicenseCollection.get_Instance()\r\n   at SolidFramework.License.Import(StreamReader stream)\r\n   at PDFtoWord.Controllers.HomeController.Index() in c:\\projects\\PDFtoWord\\PDFtoWord\\Controllers\\HomeController.cs:line 22"
    TargetSite: {Void InitializeNativePlatform(SolidFramework.Plumbing.ProgressTicker)}

Solution:

The fix is to call the SetDllDirectory(..) passing it SolidFramework.Configuration.Installer.NativePlatformDirectory just before you initialize Solid Framework (before you call License.Import).  This tells Windows 8 that it is ok to load our dlls from this location.

Here is a console app that calls it:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace TestSetDllDir
{
    class Program
    {
        
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetDllDirectory(string lpPathName);
        
        static void Main(string[] args)
        {
            string dllPath = SolidFramework.Configuration.Installer.NativePlatformDirectory;
            bool didSetDir = SetDllDirectory(dllPath);
            if (!didSetDir)
            {
                Console.WriteLine("Failed to set DLL directory!");
            }
            else
            {
                Console.WriteLine("Set DLL directory succeeded.");
                
                // Setup your Solid Framework license here.
                SolidFramework.LicenseCollection.Instance.Clear();
            }

            Console.ReadKey();
        }
    }
}

Web service:

After turning on the IIS feature in Windows 8.1 and running some tests, I discovered what is going on. When SolidFramework is first initialized, it checks to see if it has already extracted its support files or not, and if it hasn't, it does this extraction. 

We use .NET's Environment.SpecialFolders to find the local application data directory, and create a support folder there. The problem is IIS 8.5 is causing the SpecialFolder call to return empty. This is something we have not run into before. We can fix this by updating IIS's ApplicationPool to use a profile. You can remove the SetDllDirectory code as that is not needed once the profile has been enabled.

In IIS Server Manager, select the ASP.NET application that is using Solid Framework and click the Advanced Settings... item on the right. This will bring up the Settings for the application. What we are looking for is the Application Pool name assigned to the ASP.NET application. This should be the first item: DefaultAppPool in my case.

Now in IIS Server Manager, select Application Pools and select that Pool Name, and again on the right, click Advanced Settings... item. In the advanced settings dialog, scroll down to Process Model and change Load User Profile to true.

The second issue is IIS 8, or 8.5 if you’re on Windows 8.1, has changed how Load User Profile works by default. So even though I am setting this to true, IIS isn't honoring it fully. The fix to this is to change setProfileEnvironment to true in %WINDIR%\System32\inetsrv\config\applicationHost.config like so:

<configuration>
    <system.applicationHost>
        <applicationPools>
            <add name="DefaultAppPool" managedRuntimeVersion="v4.0" />
            <add name="ASP.NET v4.0" managedRuntimeVersion="v4.0" />
            <add name=".NET v4.5" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" />
            <!-- ... -->
            <applicationPoolDefaults managedRuntimeVersion="v4.0">
                <processModel identityType="ApplicationPoolIdentity"
                              loadUserProfile="true"
                              setProfileEnvironment="true"
                              idleTimeout="00:00:00" />
            </applicationPoolDefaults>
        </applicationPools>
    </system.applicationHost>
</configuration>

After the above two changes, and restarting the web server, the sample ASP.NET application converted PDF files to Word files without any issues.

Sunday, December 1, 2013

Eating our own dog food ...

Eating your own dog food, also called dogfooding, is slang used to reference a scenario in which a company uses its own technology to demonstrate the quality and capabilities of the product.

All our v8 applications are built using Solid Framework.

The v8 rewrite was a conscious shift back to our core features: a focus on document reconstruction functionality. The rewrite was required to take advantage of 64-bit architectures and multi-core processors. A rewrite using Microsoft .NET was required so that we could engineer the product using our own Solid Framework SDK (unlike the older products which were based on legacy architecture).

We have confidence that our .NET Solid Framework SDK is the best document reconstruction SDK available on the market. We have built our latest desktop and batch solutions using this technology.

You can use Solid Framework with confidence too. Create a developer portal account and get started today.