Technical FAQs

Question

My document has Asian characters (CJK, etc.), which are not displaying correctly in PrizmDoc Viewer; what steps can I take to view them?

Answer

In some cases, the reason is due to the fonts not being installed on the operating system. We have outlined some commands to install fonts for select operating systems below:

In CentOS 6 do:

yum groupinstall "Chinese Support"
yum groupinstall "Japanese Support"
yum groupinstall "Korean Support"
yum groupinstall "Kannada Support"
yum groupinstall "Hindi Support"

In CentOS 7 do:

yum groupinstall "fonts"

In Ubuntu do:

sudo apt-get install language-pack-ja
sudo apt-get install japan*
sudo apt-get install language-pack-zh*
sudo apt-get install chinese*
sudo apt-get install language-pack-ko
sudo apt-get install korean*
sudo apt-get install fonts-arphic-ukai fonts-arphic-uming fonts-ipafont-mincho fonts-ipafont-gothic fonts-unfonts-core
Question

In PrizmDoc, my document appears to be small on the page relative to the viewer. How can I fix this?

enter image description here

Answer

By default, PrizmDoc renders a PDF file according to the MediaBox, which is normally the same as CropBox, though sometimes this is not the case. The larger area you see in the PrizmDoc Viewer is the size of the MediaBox. Please note that the product provides the fileTypes.pdf.pageBoundaries control option (or useCropBox in the older versions) to change the default behavior. Try setting the option to cropBox in the Central Configuration File in order to get the PDF content rendered according to the CropBox. You can read more about configuring image frame rendering in our documentation here.

For additional reading, see 7.7.3.3 on “User Space” of Adobe’s PDF 1.7 specification:

https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf

Note: In some older versions of PrizmDoc, there exists an issue where setting the pageBoundaries field to cropBox can cause light blurring/distorting on the page. This issue was addressed in version 13.4.

Long resistant to technological change, the insurance industry has made great strides over the last decade to implement innovative InsurTech solutions that upend longstanding market practices. As insurance providers explore new strategies for attracting a new generation of customers, they continue to rely heavily upon InsurTech developers to build the solutions that help them expand their customer base.

The Insurance Industry’s “Protection Gap”

Today’s insurance companies are offering more products and services than ever before, and yet at the same time, most people are carrying less insurance they need to protect themselves from risk. This “protection gap” is at least partially the result of large amounts of friction when it comes to purchasing insurance. People are either choosing to not buy insurance products, or they don’t know what options are available to them.

Part of this problem is the result of outdated models many organizations use to sell insurance. There’s an old adage that insurance is something that is “sold” rather than something that is “bought.” In this model, customers are expected to interact with an insurance agent who actively sells them a particular coverage.

Unfortunately, this model is becoming less and less effective in an increasingly digitized world, especially when it comes to younger generations of customers who expect the same level of frictionless convenience from insurers that they now get from many financial services (especially those powered by FinTech solutions).

What Is Embedded Insurance?

One potential solution to this challenge is a new strategy known as embedded insurance. This approach first identifies purchases or situations where insurance is required or would present clear added value. Some examples could include the purchase of an automobile, a vacation package, or even a potentially hazardous activity like skiing. An appropriately risk-adjusted insurance package is then offered to customers at the point of sale, or “embedded” within the customer experience.

There are tremendous advantages to this strategy. In the first place, it allows insurers to offer their products to customers who need them most at the precise point when they need them. Rather than having to go through the laborious process of contacting an insurance agent to get a quote for a new automotive policy after someone buys a new car, they can simply update their plan or add insurance services at the same time they’re purchasing the car itself. Customers are less likely to put off getting insurance (and then often forgetting to do so later), and the insurance provider has an opportunity to offer services to the people most likely to purchase them. For the provider, it’s a much more efficient approach than relying on outdated cold calling techniques to sell policies that may or may not meet the current needs of a customer.

Technical Challenges of Embedded Insurance

In order to embed insurance offerings effectively, however, providers first need to overcome a few technology challenges. From improved data capture tools that allow them to conduct faster, more customized underwriting to integrations that connect their applications to partner ecosystems, a new generation of InsurTech solutions will be needed to remake insurance business models.

Better Data Capture

Having accurate information is essential to insurance underwriting. This is even more important when it comes to embedded insurance because rates need to be calculated quickly so they can be provided along with other purchases. In many cases, form information may need to be processed quickly to obtain key data on the customer and the details of their purchase. When InsurTech applications are equipped with automated forms processing tools, they can quickly extract key information and use it to make faster, more data-driven decisions.

Versatile Viewing Capabilities

Whether an InsurTech application stands on its own or is integrated into another service offering, customers will often need to view information about their policy options in order to make an informed decision. On the firm’s end, insurance agents may need to review application details or bring up other resources to review when finalizing rates. By building viewing capabilities into their InsurTech applications with integrations like an HTML5 viewer, developers can ensure that their customers will never be caught depending upon external platforms for document viewing or sharing.

Expanded Contract Automation

Many insurance policies still require some form of contract, even if digital signature technology allows these forms to exist entirely in electronic format. Having the ability to rapidly assemble a contract as part of an embedded insurance solution can further enhance the streamlined customer experience. InsurTech developers can integrate automated document assembly tools to rapidly build contracts from pre-existing templates and quickly fill in the necessary details or add additional clauses.

Accusoft InsurTech Solutions for Embedded Insurance

Accusoft’s collection of SDK and API integrations give InsurTech developers the tools they need to enhance the flexibility of their applications. Our software solutions provide proven, market-ready viewing and processing features so development teams can keep their focus on refining their platform’s innovative core functionality. Whether it’s the versatile forms processing features of FormSuite, the powerful HTML5 viewing capabilities of PrizmDoc Viewer, or the automated document assembly tools of PrizmDoc Editor, Accusoft integrations can help InsurTech developers get their applications to market faster and explore the possibilities of embedded insurance.

We’ve been working hard to design software integrations that meet the needs of the insurance industry and InsurTech developers. Download our InsurTech solutions fact sheet to see how our constantly evolving family of SDKs and APIs can improve your application’s capabilities and performance.

Question

By default, in the PrizmDoc Viewer, links are highlighted and underlined in blue. To follow links within a document, the user needs to click the link, wait for the floating popup to appear showing the link’s target URL, and then click that to actually follow the link. Is there a way to make this a single-click process and skip the floating popup?

Answer

The desired one-click functionality can be achieved by modifying the viewer.js source file:

Inspect around line ~9457; you’ll find the following else if block:

    } else if (ev.targetType === "documentHyperlink") {
        hyperlinkMenuHandler(ev, "view");
    }

This line of code executes when the user clicks on a link displayed within the Viewer. The call to hyperlinkMenuHandler is responsible for displaying the floating popup. If you’d like to immediately open the link in a new window/tab instead, replace the contents of the “if else” block with a call to window.open:

    } else if (ev.targetType === "documentHyperlink") {
        window.open(ev.hyperlink.href, '_blank');
    }

This will allow hyperlinks that appear in the Viewer to be followed in a new window/tab with a single-click.

Question

Why do I get a “File Format Unrecognized” exception when trying to load a PDF document in ImageGear .NET?

Answer

You will need to set up your project to include PDF support if you want to work with PDF documents. Add a reference to ImageGear24.Formats.Pdf (if you’re using another version of ImageGear, make sure you’re adding the correct reference). Add the following line of code where you specify other resources:

using ImageGear.Formats.PDF;

Add the following lines of code before you begin working with PDFs:

ImGearFileFormats.Filters.Insert(0, ImGearPDF.CreatePDFFormat());
ImGearPDF.Initialize();

The documentation page linked here shows how to add PDF support to a project.

Question

My document has Asian characters (CJK, etc.), which are not displaying correctly in PrizmDoc Viewer; what steps can I take to view them?

Answer

In some cases, the reason is due to the fonts not being installed on the operating system. We have outlined some commands to install fonts for select operating systems below:

In CentOS 6 do:

yum groupinstall "Chinese Support"
yum groupinstall "Japanese Support"
yum groupinstall "Korean Support"
yum groupinstall "Kannada Support"
yum groupinstall "Hindi Support"

In CentOS 7 do:

yum groupinstall "fonts"

In Ubuntu do:

sudo apt-get install language-pack-ja
sudo apt-get install japan*
sudo apt-get install language-pack-zh*
sudo apt-get install chinese*
sudo apt-get install language-pack-ko
sudo apt-get install korean*
sudo apt-get install fonts-arphic-ukai fonts-arphic-uming fonts-ipafont-mincho fonts-ipafont-gothic fonts-unfonts-core
Question

When should I apply image cleanup operations on my document images?

Answer

There are a number of cleanup operations that you can use to make an image more suitable for a particular application. What you observe visually on the image and how you perceive its impact on your project is the most important. For example, if you’re noticing very many random specks on your image, and you’re planning to use OCR, then you may want to try a depseckle or blob removal operation first. If the content in your image looks a bit slanted, you could try a deskew or rotate operation. In some cases, using a line removal operation on forms that have grid fields could be helpful also. The amount of image cleaning you may need to do can very from project to project. There’s not a one shot cleaning operation that will always work for all images. But, observe the nature of the noise and interference in your images to determine what general parameters appear to provide the best results.

Next Evolution in Intelligent Contract Automation Redefines How Businesses Create, Manage, Sign, and Track Digital Contracts

TAMPA, Fla. November 29, 2023 – OnTask, a leader in contract automation and eSignature collection, has announced it has rebranded as Docubee. With a redefined product platform and focus on intelligent contract automation, Docubee provides an unparalleled customer experience and streamlines the entire contract lifecycle, including the way businesses create, manage, sign, and track digital contracts.

“The new Docubee brand will allow us to grow with a friendlier and more engaging identity that resonates with our customers and more clearly articulates how we can solve problems for our clients and community,” said Megan Brooks, Chief Operating Officer of Accusoft who oversees product brands such as OnTask, and now Docubee. “The customer-focused personality of Docubee will also play out as we refine our product offerings to further support our clients and improve the user experience.”

Docubee is built on a foundation of innovation. The past six years leading up to the rebrand have centered upon the development of award-winning contract automation solutions that leverage cutting-edge technology such as artificial intelligence (AI), conditional logic, and top-notch security to streamline contract-related tasks.

That foundation, combined with refinements of its multifaceted contract automation solutions, has set the course for Docubee to address customer needs moving forward.

The refined Docubee platform offers five core solutions:

  • Gather: Collecting information to incorporate into contracts and agreements.
  • Generate: Creating contracts swiftly through templates, AI, or by creating and editing from scratch.
  • Share: Routing contracts seamlessly for editing, review, and approval.
  • Sign: Capturing secure, compliant, and legally binding signatures on any device.
  • Integrate: Connecting to the systems teams use daily, or building Docubee’s tools into native applications using APIs.

The brand has seen tremendous growth in recent years with the launch of innovative tools like (AI) document generation, eSignature APIs, and workflow tools, as well as marquee partnerships like with legal case management software leader SmartAdvocate.

“We anticipate extensive growth within these specialized areas,” said Brooks. “The time is right to align with our customers, invest in this platform, form new partnerships, and enhance our service.”

Docubee is a SaaS technology product of Tampa-based software company Accusoft, a technology industry leader with a 30-year track record. Accusoft is recognized for its software technologies that are designed to solve complex workflow challenges, improve productivity, provide actionable data, and deliver results that matter.

For more information about Docubee and to explore the future of contract automation, visit www.Docubee.app.

About Docubee

Docubee, an Accusoft brand, is an intelligent contract automation platform that lets businesses create, manage, sign, and track digital contracts in one secure platform. Docubee powers contracts by enabling users to gather vital customer data, create contracts using tools like generative AI or pre-built templates, and connect pieces of the process with dynamic workflows. Users can integrate Docubee with their existing site or platform via the API or connect to thousands of apps and CRMs using native and webhook-powered integrations. For more information, visit docubee.com

###

Question

Can I host multiple PrizmDoc viewers on a single page?

Answer

It is possible to host multiple viewers on a single page. The following example leverages Bootstrap’s tab implementation:

<!DOCTYPE html>

<html lang="en">
<head>
    <!-- Metadata -->
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
    <meta name="description" content="" />

    <!-- Title -->
    <title>AccuSample</title>

    <!-- Libraries -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/7.0.0/normalize.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css">

    <!-- PrizmCSS -->
    <link rel="stylesheet" href="https://pcc-demos.accusoft.com/static/viewer-latest/css/viewercontrol.css">
    <link rel="stylesheet" href="https://pcc-demos.accusoft.com/static/viewer-latest/css/viewer.css">

    <!-- Inline Stylesheet -->
    <style>
        body {
            overflow-y: hidden;
        }
        #viewer1, #viewer2 {
            height: calc(100vh - 3em);
            width: 100%;
        }
    </style>

</head>
<body>
    <!-- #main -->
    <main class="container">
        <ul class="nav nav-tabs" role="tablist">
            <li class="nav-item">
                <a class="nav-link active" id="viewer1-tab" data-toggle="tab" href="#viewer1">Viewer 1</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" id="viewer2-tab" data-toggle="tab" href="#viewer2">Viewer 2</a>
            </li>
        </ul>

        <div class="tab-content">
            <div class="tab-pane fade show active" id="viewer1" role="tabpanel">
                <div id="viewer1">
                </div>
            </div>
            <div class="tab-pane fade" id="viewer2" role="tabpanel">
                <div id="viewer2">
                </div>
            </div>
        </div>
    </main>

    <!-- Libraries -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.1/umd/popper.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/js/bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

    <!-- PrizmJS -->
    <script src="https://api.accusoft.com/v1/docstore/viewer/assets/classic/bundle.js"></script>
    <script src="https://pcc-demos.accusoft.com/static/viewer-latest/js/jquery.hotkeys.min.js"></script>
    <script src="https://pcc-demos.accusoft.com/static/viewer-latest/js/viewercontrol.js"></script>
    <script src="https://pcc-demos.accusoft.com/static/viewer-latest/js/viewer.js"></script>

    <!-- Inline Script -->
    <script>
        var viewingSessionId1;
        var viewerControl1;
        var viewingSessionId2;
        var viewerControl2;

        $(document).ready(function() {
            $.ajax({
                "type": "post",
                "url": "https://api.accusoft.com/PAS/V1/ViewingSession",
                "headers": {
                    "acs-api-key": ""
                },
                "data": JSON.stringify({
                    "source": {
                        "type": "url",
                        "url": ""
                    }
                })
            }).done(function(response) {
                viewingSessionId1 = response["viewingSessionId"];

                // Initialize viewer
                viewerControl1 = $("#viewer1").pccViewer({ 
                    documentID: viewingSessionId1,
                    imageHandlerUrl: "https://api.accusoft.com/v2/viewers/proxy",
                    language: languageItems,
                    template: htmlTemplates
                }).viewerControl;
            });

            $.ajax({
                "type": "post",
                "url": "https://api.accusoft.com/PAS/V1/ViewingSession",
                "headers": {
                    "acs-api-key": ""
                },
                "data": JSON.stringify({
                    "source": {
                        "type": "url",
                        "url": ""
                    }
                })
            }).done(function(response) {
                viewingSessionId2 = response["viewingSessionId"];

                // Initialize viewer
                viewerControl2 = $("#viewer2").pccViewer({ 
                    documentID: viewingSessionId2,
                    imageHandlerUrl: "https://api.accusoft.com/v2/viewers/proxy",
                    language: languageItems,
                    template: htmlTemplates
                }).viewerControl;
            });
        });
    </script>
</body>
</html>
Question

Can I host multiple PrizmDoc viewers on a single page?

Answer

It is possible to host multiple viewers on a single page. The following example leverages Bootstrap’s tab implementation:

<!DOCTYPE html>

<html lang="en">
<head>
    <!-- Metadata -->
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
    <meta name="description" content="" />

    <!-- Title -->
    <title>AccuSample</title>

    <!-- Libraries -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/7.0.0/normalize.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css">

    <!-- PrizmCSS -->
    <link rel="stylesheet" href="https://pcc-demos.accusoft.com/static/viewer-latest/css/viewercontrol.css">
    <link rel="stylesheet" href="https://pcc-demos.accusoft.com/static/viewer-latest/css/viewer.css">

    <!-- Inline Stylesheet -->
    <style>
        body {
            overflow-y: hidden;
        }
        #viewer1, #viewer2 {
            height: calc(100vh - 3em);
            width: 100%;
        }
    </style>

</head>
<body>
    <!-- #main -->
    <main class="container">
        <ul class="nav nav-tabs" role="tablist">
            <li class="nav-item">
                <a class="nav-link active" id="viewer1-tab" data-toggle="tab" href="#viewer1">Viewer 1</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" id="viewer2-tab" data-toggle="tab" href="#viewer2">Viewer 2</a>
            </li>
        </ul>

        <div class="tab-content">
            <div class="tab-pane fade show active" id="viewer1" role="tabpanel">
                <div id="viewer1">
                </div>
            </div>
            <div class="tab-pane fade" id="viewer2" role="tabpanel">
                <div id="viewer2">
                </div>
            </div>
        </div>
    </main>

    <!-- Libraries -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.1/umd/popper.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/js/bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

    <!-- PrizmJS -->
    <script src="https://api.accusoft.com/v1/docstore/viewer/assets/classic/bundle.js"></script>
    <script src="https://pcc-demos.accusoft.com/static/viewer-latest/js/jquery.hotkeys.min.js"></script>
    <script src="https://pcc-demos.accusoft.com/static/viewer-latest/js/viewercontrol.js"></script>
    <script src="https://pcc-demos.accusoft.com/static/viewer-latest/js/viewer.js"></script>

    <!-- Inline Script -->
    <script>
        var viewingSessionId1;
        var viewerControl1;
        var viewingSessionId2;
        var viewerControl2;

        $(document).ready(function() {
            $.ajax({
                "type": "post",
                "url": "https://api.accusoft.com/PAS/V1/ViewingSession",
                "headers": {
                    "acs-api-key": ""
                },
                "data": JSON.stringify({
                    "source": {
                        "type": "url",
                        "url": ""
                    }
                })
            }).done(function(response) {
                viewingSessionId1 = response["viewingSessionId"];

                // Initialize viewer
                viewerControl1 = $("#viewer1").pccViewer({ 
                    documentID: viewingSessionId1,
                    imageHandlerUrl: "https://api.accusoft.com/v2/viewers/proxy",
                    language: languageItems,
                    template: htmlTemplates
                }).viewerControl;
            });

            $.ajax({
                "type": "post",
                "url": "https://api.accusoft.com/PAS/V1/ViewingSession",
                "headers": {
                    "acs-api-key": ""
                },
                "data": JSON.stringify({
                    "source": {
                        "type": "url",
                        "url": ""
                    }
                })
            }).done(function(response) {
                viewingSessionId2 = response["viewingSessionId"];

                // Initialize viewer
                viewerControl2 = $("#viewer2").pccViewer({ 
                    documentID: viewingSessionId2,
                    imageHandlerUrl: "https://api.accusoft.com/v2/viewers/proxy",
                    language: languageItems,
                    template: htmlTemplates
                }).viewerControl;
            });
        });
    </script>
</body>
</html>