Technical FAQs for "PrizmDoc"

Question

I want to load an HTML document in PrizmDoc with UTF-8 encoding. Can this be done automatically in the product?

Answer

Currently, no. We have a parameter for .txt files which does that (detailed here), but this “textFileEncoding” intentionally only works for .txt, not .html files. There is a feature request for this:

https://ideas.accusoft.com/ideas/PDV-I-546

In the meantime, this can be fixed manually by adding charset = “utf-8” to the meta tag of the HTML document. One POC way this might be done programmatically is below in Python 3.7 (need obvious polishing like checking for the tag already existing, multiple “meta” tags, etc):

with open(filename, "r") as file:
    content = file.read()

index = content.find("meta") + len("meta")

new_content = content[:index] + " charset=\"utf-8\" " + content[index:]

with open(filename, "w") as file:
    file.write(new_content)
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

I want the Thumbnail tab in PrizmDoc Viewer to be open by default. How can this be done?

Answer

A simple solution could be to simply implement a ‘click-on-the-button’ when you first open the Viewer, if you’re fine with the user being able to close the thumbnail pane:

$("[data-pcc-toggle=\"dialog-thumbnails\"]").click();

If you’d rather have the tab always open, in viewer.js there’s a function called toggleDialogs(opts) that checks for whether the thumbnail pane is being toggled through the opts.toggleID, and if so, adds openClass to the thumbDialog. You could modify this logic so that the thumbnail pane is permanently open.

Question

Is it possible to make a call to an external API when annotation saving is complete?

Answer

In the Viewer, you can bind functions to the MarkupSaved event mentioned on the following documentation page in order to execute code when annotations are saved to the server:

https://help.accusoft.com/PrizmDoc/latest/HTML/webframe.html#Subscribing_to_Events.html

A full list of events exposed by the Viewer can be found here:

https://help.accusoft.com/PrizmDoc/latest/HTML/webframe.html#PCCViewer.html#.EventType

Question

How can I make significant changes to the UI of a PrizmDoc sample?

Answer

While jQuery can be used to make some small changes to the samples UI, it does not always make sense to make your changes programmatically on the front-end.

In this case, you will want to make your UI changes to the HTML templates used to compile the template that is passed in during viewer initialization.

To make changes and recompile the templates, you can utilize the following GitHub repository:

https://github.com/Accusoft/prizmdoc-viewer

Question

We entered our S3 bucket name in the customer portal, but used a capital letter for the first character; however, the S3 bucket name is all lowercase in AWS (Amazon Web Services).
Will this cause an issue with starting the service?

Answer

Yes, the bucket name is case-sensitive and must be entered exactly the same as the S3 bucket is named in AWS (Amazon Web Services).

AWS recommends you do not use uppercase letters in your bucket name.

If you made the first character of the name uppercase in the Accusoft Customer Portal, then the service will fail to start.

You will need to contact your Account Manager or Accusoft Technical Support to have the license re-created so that you can re-enter the S3 bucket name properly.

Question

When running setup.sh and entering the information for a node-locked license, such as configuration file, solution name, and solution key, the following error occurs:

The licensing configuration file you provided is invalid. Please retry
your request or break the licensing process:

What would cause this issue?

Answer

This issue may be caused by a trailing space on the configuration file copied to the Linux server.

To remove the space, run the following command, making sure to replace
configurationfilename with the name of your configuration file.

truncate -s -1 **configurationfilename**

For example:

truncate -s -1 /usr/share/prizm/licenseconfiguration.txt
Question

What does it mean when I see “Email Address is not Registered” when entering in an email in the Evaluation Dialog?

Answer

You will see this error if you have not registered on the Accusoft website.

To register your email address, please visit the following link below:

https://my.accusoft.com/Account/FirstTimeUser?Length=7

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

I have already licensed PrizmDoc. Where can I find my license key?

Answer

At the very top of the prizm-services-config.yml file located at C:/Prizm/ on Windows and /usr/share/prizm/ on Linux, you can locate the license key:

######################### PrizmDoc Configuration ###############################

############################### Licensing ######################################

license.solutionName: ________
license.key: 2.0...
Question

How can I annotate or redact search results within PrizmDoc? What annotation or redaction types are supported? How can I change the properties of the created marks?

Answer

You can annotate or redact search results using the addMarkFromSearchResult() function from ViewerControl. This function creates a new mark of a specific type and adds it to the location where the specified search result is.

The addMarkFromSearchResult() supports mark types: TextSelectionRedaction, HighlightAnnotation, StrikethroughAnnotation and TextHyperlinkAnnotation.

The addMarkFromSearchResult() function takes two arguments: searchResult and markType. The searchResult is the search result that you want to annotate/redact and markType is the type of mark that will be created.

To perform a search and redact the search results, use the following example:

var requestObject = PCCViewer.search('Con');
 var marks = [];
 var mark;
 requestObject.on(PCCViewer.EventType.SearchCompleted, function (event) {
     var searchResults = event.completedSearchResults;
     for (var i = 0; i < searchResults.length; i++) {
         mark = viewer.viewerControl.addMarkFromSearchResult(searchResults[i], PCCViewer.Mark.Type.TextSelectionRedaction);
         marks.push(mark);
     }
 });

To create a different annotation type from a search result you would change the second argument to the different type. For example, if you wanted a textHyperLinkAnnotation you could do the following:

mark = viewer.viewerControl.addMarkFromSearchResult(result, PCCViewer.Mark.Type.TextHyperlinkAnnotation);

Changing the properties of the mark is fairly straightforward. To set the fill color and the URL string in the TextHyperlinkAnnotation, you would add this after creating the mark:

mark.setHref("https://www.accusoft.com");
mark.setFillColor("#FF0000");

More information on mark types and their properties can be found in our documentation here.

Question

How can I determine what version of PrizmDoc Viewer my server is running?

Answer

To check the server version, make a GET request to:

http://localhost:18681/PCCIS/V1/Service/Current/Info

You can make a get request by navigating to the URL in your browser. The JSON response will have a "pccisVersion" property, which is the version number you are looking for. A similar GET to the following URL will determine the PAS version:

http://localhost:3000/info

The JSON response’s "version" property is what you are looking for. Keep in mind that differing version numbers don’t necessarily indicate a mismatch, as long as the major and minor version numbers sync-up. For example, the PCCIS version 13.5.33.5696 and PAS version 13.5.0000.1816 are from the same release (13.5).