Technical FAQs

Question

After applying a new license/evaluation license through the license utility on Linux, the following error appears in the logs:

{"gid":"","name":"OCS","time":"2019-01-3T18:26:39.368Z","pid":36875,"level":50,"tid":36875,"taskid":8,"FATAL ERROR":"MSO feature is active, but 'fidelity.msOfficeCluster.host' and 'fidelity.msOfficeCluster.port' are not configured, going to 'Unhealthy' state"}

What could cause this issue to occur, and how can it be fixed?

Answer

As you are running on Linux, the MSO switch on the license assumes that there are additional settings configured:

fidelity.msOfficeCluster.host and fidelity.msOfficeCluster.port

These settings are meant to point to a Windows server which has Microsoft Office 2013 or 2016 installed alongside PrizmDoc with MSO enabled. This is required for MSO functionality to be enabled.

If you wish to use the license with MSO enabled but do not have a separate Windows server, you can do the following to set the PrizmDoc service to run using LibreOffice:

  1. Make a backup of /usr/share/prizm/prizm-services-config.yml file.
  2. Edit the file in the text editor of your choice and find the following line, fidelity.msOfficeDocumentsRenderer: auto
  3. Be sure to remove the hash and leading space in front of the line and then change from auto to libreoffice.
    fidelity.msOfficeDocumentsRenderer: libreoffice
  4. Restart the service by running /usr/share/prizm/scripts/pccis.sh restart
Question

We are planning to upgrade our PrizmDoc Server and PrizmDoc Client to the latest major version. What is the best practice for doing so?

Answer

For best results, you will want to follow the instructions below to ensure the cleanest upgrade of the newest version:

NOTE: Before starting, make a backup of the following configuration files for use as reference when re-configuring your new version installation. This should be done before the PrizmDoc installer is run, as all configuration files will be replaced with new ones (resetting them to their default configuration).

  • Prizm Server Configuration: prizm\prizm-services-config.yml

  • Prizm Client Configuration (Windows): prizm\pas\pcc.win.yml

  • Prizm Client Configuration (Linux): /usr/share/prizm/pas/pcc.nix.yml

  • ServiceHost Configuration: prizm\PCCIS\ServiceHost\pcc.config

How To:

  1. Uninstall the previous version of PrizmDoc Server and PrizmDoc Client. Be sure to delete all PrizmDoc folders that are still present. For Windows you can Find PrizmDoc Server and Prizm Client under Add/Remove Programs. For Linux, please follow instructions below for uninstall instructions.

Linux Prizm/PAS Service Uninstall:

https://help.accusoft.com/PrizmDoc/latest/HTML/webframe.html#linux-uninstall-prizmdoc-serve.html

https://help.accusoft.com/PrizmDoc/v13.10/HTML/webframe.html#pas-linux-uninstallation.html

  1. Download the latest version of PrizmDoc for your operating system from https://www.accusoft.com/products/prizmdoc-suite/prizmdoc-viewer-builds/

  2. Install PrizmDoc Server first and then the PrizmDoc Client.

  3. At the end of the server installation, the install may request a reboot.

  4. Make a backup of your new configuration files as listed above.

  5. Modify each of the new configuration files and make the same changes as you did in the older configuration files.

NOTE: Do not just replace the new configuration files with the old version configuration files, as new configurations may have been introduced in the new version and they would be lost.

  1. Restart the Prizm Services and Prizm Application Services to ensure the newly configured file changes take affect.

NOTE: If either service fails to start with an error after modifying the configuration files, replace the configuration files with the original copy of the configuration files and try making the changes again.

NOTE: If you are using viewing packages and have an existing database, we provide additional scripts in the \prizm\pas\db folder to modify your existing database. For example, upgrading from PrizmDoc 12.x to PrizmDoc 13.x we provide an additional script addTenantId to add a new field to one of the existing tables.

Barcode Xpress ImageGear .NET

Barcode Xpress and ImageGear .NET.  Barcode Xpress is a leading barcode reading SDK. While it supports a variety of image formats, Barcode Xpress works with ImageGear to support even more obscure image formats. For example, Barcode Xpress does not support reading barcodes on PDFs. Combined with ImageGear, developers can support a myriad of image formats and PDFs. With Barcode Xpress & ImageGear working together, developers can integrate a barcode reader that can detect barcodes on almost any kind of document.

Barcode Xpress accepts images in multiple different object types, such as System.Drawing.Bitmap. Using the method ImGearFileFormats.ExportPageToBitmap we can easily take any image that ImageGear supports and export it to a System.Drawing.Bitmap object that we can then pass to Barcode Xpress. So, only a tiny amount of code is required to recognize barcodes with ImageGear .NET and Barcode Xpress. Below, we’ll show various ways to pass different types of images and documents to Barcode Xpress.


Image:

// Load the image into the page.
ImGearPage imGearPage = ImGearFileFormats.LoadPage(stream, 0);

// Export the image to a bitmap and pass that bitmap to Barcode Xpress
 Result[] results = barcodeXpress.reader.Analyze(ImGearFileFormats.ExportPageToBitmap(imGearPage));


PDF:

We need slightly more code for a PDF. First, we specify a page number when calling LoadPage. Second, we must dispose of the ImGearPage object after we’re done with it. 

// Load the specified page of the PDF as an ImGearPage object
ImGearPage imGearPDFPage = ImGearFileFormats.LoadPage(stream, pageNumber);

// Export the image to a bitmap and pass that bitmap to Barcode Xpress
Result[] results = barcodeXpress.reader.Analyze(ImGearFileFormats.ExportPageToBitmap(imGearPDFPage));

(imGearPDFPage as IDisposable).Dispose();

Now that we’ve explained the most important part, we’ll show you a simple console app that recognizes barcodes on a PDF using the method above. 

The code below assumes you’ve installed an evaluation or development license for both Barcode Xpress and ImageGear .NET.

using System;
using System.IO;
using Accusoft.BarcodeXpressSdk;
using ImageGear.Core;
using ImageGear.Evaluation;
using ImageGear.Formats;
using ImageGear.Formats.PDF;

namespace BXandIGDotNet
{
	class Program
	{
    	static int pageNumber = 0;
    	static string fileName = @"Path/To/Your/PDF..pdf";
    	static void Main(string[] args)
    	{
        	// Initialize evaluation license.
        	ImGearEvaluationManager.Initialize();

        	// Initialize common formats.
        	ImGearCommonFormats.Initialize();
        	// Add support for PDF and PS files.
        	ImGearFileFormats.Filters.Insert(0, ImGearPDF.CreatePDFFormat());
        	ImGearFileFormats.Filters.Insert(0, ImGearPDF.CreatePSFormat());
        	ImGearPDF.Initialize();

        	using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
        	using (BarcodeXpress barcodeXpress = new BarcodeXpress())
        	{
            	// Load the specified page of the PDF as an ImGearPage object
            	ImGearPage imGearPDFPage = ImGearFileFormats.LoadPage(stream, pageNumber);

            	// Export the image to a bitmap and pass that bitmap to Barcode Xpress
            	Result[] results = barcodeXpress.reader.Analyze(ImGearFileFormats.ExportPageToBitmap(imGearPDFPage));

            	(imGearPDFPage as IDisposable).Dispose();

            	// Print the values of every barcode detected.
            	for (int i = 0; i < results.Length; i++)
            	{
                	Console.WriteLine("#" + i.ToString() + " Value: " + results[i].BarcodeValue);
            	}
            	Console.ReadKey();
        	}
    	}
	}
}

Using Barcode Xpress and ImageGear in Other Languages & Linux

You can also use Barcode Xpress and ImageGear together outside of the .NET framework. Barcode Xpress supports several different programming languages and frameworks including .NET Core, Java, NodeJS, Python, C, and C++. All of which can be used on Linux. 

ImageGear for C/C++ also supports Linux. Barcode Xpress Linux, which is a C/C++ library, ships with a sample called “ReadBarcodesIG”, that shows how to integrate Barcode Xpress Linux and ImageGear for C/C++. You can find the sample code after downloading our SDK here! For more information on Barcode Xpress, visit our Developer Resources page on the website. In addition, you can also find more information about ImageGear .NET on its respective Developer Resources page as well.

developer coding in .NET Core

Is .NET or .NET Core the better bet for application development? Both frameworks are designed and supported by Microsoft and offer the ability to create apps capable of using multiple languages, abilities, and libraries, but they’re not the same. .NET Core is rapidly becoming the language of choice. For most app developers, .NET Core comes out ahead of its .NET counterpart. 

To understand why, let’s break down both .NET and .NET Core basics, examine the rise of .NET Core deployments, and dig into some key .NET Core benefits.


What is .NET?

Originally developed in the late 1990s and known as Next Generation Windows Services (NGWS), .NET reached beta release in 2000. As noted by Microsoft, .NET helps streamline application creation by allowing developers to write apps in C#, F#, or Visual Basic. By using a common language runtime (CLR) and class library, .NET manages system resources such as memory, thread execution, code execution, and security validation. This allows apps written in one language to talk with code written in other languages, significantly reducing the potential for interoperability issues.

Despite the benefits offered by .NET and work by Microsoft to standardize the software stack, concerns emerged among developers around the proprietary nature of .NET, especially in the realm of software patents. Microsoft has since changed its development approach to more closely follow open-source development models.

What is .NET Core?

.NET Core is an evolution of .NET that delivers both cross-code and cross-platform support. While Microsoft designed .NET to support Windows-based applications, .NET Core applications run on Windows, Linux, and macOS. It also uses MIT and Apache 2 licenses to deliver true open-source architecture and ensure consistency across operating environments.

While .NET remains the more popular framework by sheer volume of app development, .NET Core is quickly gaining ground. A recent survey found that .NET Core is now one of the “most loved” frameworks by developers.


Why is .NET Core becoming popular?

So, what’s driving the adoption of the .NET Core framework over .NET? Several factors now contribute to this uptake, including:

  1. Linux & Windows Deployment – One of the biggest reasons .NET Core is gaining popularity is due to its ability to deploy in both Linux and Windows. This provides vast cost savings to development teams.
  2. Run-Time and Performance Improvements  Whether your application users are internal employees or external partners and customers, runtime speed and performance concerns are always critical to adoption. Since Core is the future of the .NET platform, all future performance improvements will be implemented there and most will not be present in .NET Framework. .NET Core enables APIs and applications to serve up application interfaces and data faster, regardless of the mobile, IoT, or desktop device which is interacting with it.
  3. CommunityBecause .NET Core follows an open-source development model, there’s a large (and growing) community of devs and designers now supporting its ongoing evolution, allowing IT teams to leverage prebuilt .NET Core code rather than building their own from scratch.

.NET vs. .NET Framework

Beyond increased popularity driven by the shift in software development and standardization, the .NET Core framework also offers key benefits such as:

  • Ongoing ImprovementsIn September 2019, Microsoft released version 3.0 of .NET Core and followed it up with version 3.1 in November of the same year. In addition, the company plans to release a new version every year and remove the “Core” distinction between the two frameworks to deliver increased interoperability.
  • Improved Security From security-specific APIs to Microsoft’s Secret Manager and the Azure Key Vault Provider along with straightforward support for two-factor authentication (2FA), .NET Core improves application security without increasing complexity.
  • Cloud-Based Development SupportWith cloud now the de facto framework for everything from mobile applications, Internet of Things (IoTs), and responsive web applications, .NET Core makes it easy for developers to design cloud-native applications across multiple platforms and devices.
  • Easy Updates .NET Core updates are easily managed and applied, allowing developers to spend more time building great applications instead of dealing with complex and convoluted service upgrades.
  • Cross-Platform Code .NET Core code can run on not only Windows but Linux platforms, which can help greatly reduce your cloud deployment costs. Combined with Docker, developers are able to leverage a greater amount of modularity and flexibility than ever before.

The Accusoft Advantage

To help companies compete on the cutting edge of app development and integration, Accusoft is making .NET Core available for specific products, starting with Barcode Xpress for .NET Core. With just a few lines of code, companies can deploy multi-platform, open-source support for industry-leading barcode recognition. From reading damaged, broken, and incorrect barcodes to scanning multiple barcodes on one document in milliseconds, Barcode Xpress makes it possible to easily integrate cutting-edge barcode functionality into any application across any platform. 

Several of our other SDKs are on deck for .NET Core capabilities. While .NET broke new ground for interoperable frameworks, .NET Core offers the next iteration of interoperable development with cloud-based, cross-platform support for applications at scale. Learn more about our .NET Core plans here.

Question

Why are the fonts in my CAD files showing up garbled/unrecognizable/not as expected?

Answer

Some CAD/DWG files may include fonts that are not included in PrizmDoc Viewer’s default font set. PrizmDoc will choose the most appropriate substitute font to use in its place. The substitution process isn’t always perfect, and as a result, you will see garbled/unrecognizable characters in the Viewer.

In order to provide additional .SHX fonts for PrizmDoc to pull from, you can copy the necessary .SHX font files into the cad-fonts folder, located at:

Windows: ‪C:\Prizm\modules\cad-fonts
Linux: /usr/share/prizm/modules/cad-fonts

Alternatively, if you want to use fonts from that are located in a different directory, you can add the environment variable, ACAD, to explicitly specify the filepath of these fonts. his variable can be added under System Properties > Advanced > Environment Variables > System Variables > New... > ACAD. For the variable’s Value, specify a folder path that contains additional CAD font files for PrizmDoc to pull from.

* It is important to note that the Linux filesystem is case-senstive, so when adding custom CAD fonts on Linux, make sure that the fonts are named with case-sensitivity in mind. If you still see unexpected output after adding the fonts to the cad-fonts folder, try renaming the fonts to all lowercase.

** Note that the cad-fonts folder was added in PrizmDoc 13.20, so to add custom cad fonts on earlier versions of Prizm, use the environmental variable approach.

Question

Why are the fonts in my CAD files showing up garbled/unrecognizable/not as expected?

Answer

Some CAD files may include fonts that are not included in PrizmDoc Viewer’s default font set. PrizmDoc will choose the most appropriate substitute font to use in its place. The substitution process isn’t always perfect, and as a result, you will see garbled/unrecognizable characters in the Viewer.

In order to provide additional fonts for PrizmDoc to pull from,

Some CAD/DWG files may include fonts that are not included in PrizmDoc Viewer’s default font set. PrizmDoc will choose the most appropriate substitute font to use in its place. The substitution process isn’t always perfect, and as a result, you will see garbled/unrecognizable characters in the Viewer.

In order to provide additional .SHX fonts for PrizmDoc to pull from, you can copy the necessary .SHX font files into the cad-fonts folder, located at:

Windows: ‪C:\Prizm\modules\cad-fonts
Linux: /usr/share/prizm/modules/cad-fonts

Alternatively, if you want to use fonts from that are located in a different directory, you can add the environment variable, ACAD, to explicitly specify the filepath of these fonts. his variable can be added under System Properties > Advanced > Environment Variables > System Variables > New... > ACAD. For the variable’s Value, specify a folder path that contains additional CAD font files for PrizmDoc to pull from.

* It is important to note that the Linux filesystem is case-senstive, so when adding custom CAD fonts on Linux, make sure that the fonts are named with case-sensitivity in mind. If you still see unexpected output after adding the fonts to the cad-fonts folder, try renaming the fonts to all lowercase.

** Note that the cad-fonts folder was added in PrizmDoc 13.20, so to add custom cad fonts on earlier versions of Prizm, use the environmental variable approach.

you can add the environment variable, ACAD.
This variable can be added under System Properties > Advanced > Environment Variables > System Variables > New... > ACAD. For the variable’s Value, specify a folder path that contains additional CAD font files for PrizmDoc to pull from.

Get Up and Running Faster with Barcode Xpress

Barcodes remain the basis for product identification and tracking, improving both operational insight and the end-user experience. From common applications in grocery stores to more advanced deployments in warehouses, legal firms, and even post-secondary schools, barcodes are the ubiquitous bridge between digital and physical environments. 

As noted by Forbes, emerging pandemic pressures have precipitated the return of a familiar code framework, the QR code. Now used by retail stores and restaurants to enable touchless product identification and payment, this rapid code renaissance is a stark reminder that codes remain a key driver of long-term operational success. However, not all barcode reader tools are created equal. Some struggle to handle damaged or deformed barcodes, others limit the type and nature of the codes they scan, and many full-featured solutions come with significant complexity around installation, integration, and ease-of-use.

Barcode Xpress offers the best of both worlds. Here’s what developers need to know.


What is Barcode Xpress?

Accusoft’s Barcode Xpress makes it easy for users to read, write, and detect over 30 different barcodes with a single software development kit (SDK). Barcode Xpress supports:

  • 1D Barcodes Including Add-2, Add-5, Code 39, GS1 and UCC
  • 2D BarcodesSuch as Aztec, Data Matrix, PDF417 and QR codes
  • Postal CodesFrom PLANET and PostNet to Royal Mail and the Australia Post 4-State Code
  • Patch Codes Including Patch 1, 2, 3, 4 (Toggle), 6 and Transfer

Barcode Xpress also reports confidence values for detected codes, reads supported barcodes in any orientation in milliseconds, and can intelligently handle poorly-printed, damaged, or badly-scanned barcode images. This SDK is also available in six development environments, including:

  • .NET
  • .NET Core
  • ActiveX
  • Java
  • Linux
  • Node.js

 Basic Barcode Requirements

Deployment environments for Barcode Xpress must leverage one of the following x64 Windows versions:

  • Windows 8.1
  • Windows 10 Version 1607 and later
  • Windows Server 2008 R2 SP1 and later
  • Windows Server 2012, 2016 or 2019

The SDK can also be deployed on x64 Linux operating systems including:

  • Ubuntu 18.04 or 16.04
  • CentOS 8 or 7
  • Debian 9 or 10

When it comes to Barcode Xpress development environments, requirements include Microsoft .NET Core 2.1 or later along with Java Runtime Environment 1.8 or later for License Manager and Server Licensing Utilities, along with Visual Studio 2017 or later (optional).


Ease of Installation

To streamline installation, Barcode Xpress .NET Core can be deployed via NuGet package or using a zip file provided by Accusoft. In both cases, developers require a valid license to use the SDK. Explore the different license types here.

Evaluation licenses allow your team to explore Barcode Xpress features bounded by timeouts and watermarks. Toolkit licenses remove pop-ups, time outs, and watermarks to enable in-depth development, while Runtime licenses are required to distribute your application.


Navigating NuGet

The simplest way to deploy Barcode Xpress is using the NuGet package manager for Microsoft development platform in Visual Studio. All of Accusoft’s NuGet packages can be found at nuget.org. Find the NuGet Barcode Express .NET package here.

To install the NuGet package, follow these steps:

  1. Open the NuGet Package Manager in Visual Studio.
  2. In the newly-opened window, ensure the Package Source is set to nuget.org and select the Barcode Xpress package.
  3. After selection and installation, look for the newly-added assemblies in your References folder.
  4. Add using [namespace] to any CS/VB file you’d like to reference these NuGet libraries.

Need more help? Check out the official NuGet tutorials


 Creating a Command Line

Ready to tackle your first project in Barcode Xpress? Here’s a step-by-step guide to building a complete C# application that analyzes 1D barcodes using Visual Studio.

1.Create a new Console App project in .NET core:

2. Add the Barcode Xpress SDK:

 

3. Add any required Microsoft dlls for the project. In this case, look for System.Drawing.Common at nuget.org, or add them locally if they’re already present as references in your development environment.

 

4. Add using statements to your generated Program.cs:Program.cs

 

using System;
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
namespace MyProject
{
...

5. Create any necessary instances of Accusoft.BarcodeXpressSDK.BarcodeXpress and System.Drawing.BitmapProgram.cs

 


using System;
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
namespace MyProject
{
    class Program
    {
        static void Main(string[] args)
        {
            BarcodeXpress barcodeXpress = new BarcodeXpress();
            System.Drawing.Bitmap bitmap = new Bitmap("barcode.bmp");
        }
    }
}

6. Pass this bitmap to Barcode Xpress and access the returned resultsProgram.cs

 


…
namespace MyProject
{
     class Program
     {
         static void Main(string[] args)
         {
             BarcodeXpress barcodeXpress = new BarcodeXpress();

             System.Drawing.Bitmap bitmap = new Bitmap("barcode.bmp");
          
             Accusoft.BarcodeXpressSdk.Result[] results = barcodeXpress.reader.Analyze(bitmap);
          
             if (results.Length > 0)
             {
                 foreach (Accusoft.BarcodeXpressSdk.Result result in results)
                 {
                     Console.WriteLine("{0} : {1}", result.BarcodeType.ToString(), result.BarcodeValue);
                 }
             }
             else
             {
                 Console.WriteLine("No Barcodes Found.");
             }
         }
     }

7. Finally, clean up your code by using the Dispose() methodProgram.cs


…
namespace MyProject
{
    class Program
    {
         static void Main(string[] args)
         {
             BarcodeXpress barcodeXpress = new BarcodeXpress();

             System.Drawing.Bitmap bitmap = new Bitmap("barcode.bmp");
          
             Accusoft.BarcodeXpressSdk.Result[] results = barcodeXpress.reader.Analyze(bitmap);
          
             if (results.Length > 0)
             {
                 foreach (Accusoft.BarcodeXpressSdk.Result result in results)
                 {
                     Console.WriteLine("{0} : {1}", result.BarcodeType.ToString(), result.BarcodeValue);
                 }
             }
             else
             {
                 Console.WriteLine("No Barcodes Found.");
             }
             barcodeXpress.Dispose();
         }
     }

Ongoing Improvements

Barcode Xpress isn’t a new offering — it’s been part of the Accusoft SDK lineup for more than 15 years. However, John Reynolds, Principal Engineer for Barcode Xpress, recently took a look at the code to improve its functionality. In his whitepaper, Refactoring Legacy Code for Speed in Barcode Xpress, he found that when repeatedly scanning a barcode in a particular direction, the count length of black/white runs in the same direction. 

As a result, continually calculating the mask and data pointers for each coordinate is cumbersome, but also allows for potential shortcuts, such as keeping a running tally of the mask across the image. Applied in depth, this and other code legacy code changes have helped improve 1D barcode analysis times from 5% to 60%, depending on the image.

Barcode Xpress offers comprehensive code recognition that’s easy to implement and customize, while ongoing improvements help streamline SDK deployment, enhance operational speed, and empower software engineers in various markets. Discover the benefits of Barcode Xpress. Download a free trial or try an online demo today.

Question

What operating systems (Windows, Linux, etc.) does PrizmDoc officially support?

Answer

Please refer to our latest documentation for the most up-to-date list of supported operating systems:

For documentation on older versions of PrizmDoc, please see our documentation archive.

Question

What operating systems (Windows, Linux, etc.) does PrizmDoc officially support?

Answer

Please refer to our latest documentation for the most up-to-date list of supported operating systems:

For documentation on older versions of PrizmDoc, please see our documentation archive.

Question

I changed the value of viewingSessionTimeout

Answer

If you are using Windows, the value that you are looking to modify is the viewing.sessionLifetime in the central config file prizm-services-config.yml located in the root of the PrizmDoc installation directory (C:\Prizm on Windows, /usr/share/prizm on Linux).

Make sure it is uncommented and without any leading whitespace.

Additionally, please make sure the viewing.cacheLifetime is greater than the viewing.sessionLifetime value.

More information can be found here.

You must restart the PrizmDoc service in order for your changes to take affect.