2

I am trying to open a file from a Database as a Byte array. The following is what I have:

  1. From JavaScript, I call Viewer method found in my controller:
$("#preview-file").click(function () {
    $("#preview-pdf").html("");
    $.ajax({
        type: 'GET',
        url: '@Url.Action("Viewer", "Home")?fileId='+fileIdJS,
        success: function (result) {
            $('#preview-pdf').append(result);
        },
        error: function () {
            console.log("Error!");
        }
    });
});
  1. The Viewer Method:
[HttpGet]
public ActionResult Viewer(string fileId)
{
    string fileName = string.Empty;
    byte[] bytes = new byte[] {};`
    using (SqlConnection connection = new SqlConnection())
    {
        using (SqlCommand cmdDownload = new SqlCommand())
        {
            OpenConnection(connection);
            cmdDownload.Connection = connection;
            cmdDownload.CommandText = "SELECT file_stream, name FROM FileTable WHERE stream_id = @fileId";
            cmdDownload.Parameters.AddWithValue("@fileId", fileId);
            using (SqlDataReader fileDataReader = cmdDownload.ExecuteReader())
            {
                while (fileDataReader.Read())
                {
                     fileName = (string)fileDataReader["name"];
                     bytes = (byte[])fileDataReader["file_stream"];
                }
            }
            connection.Close();
        }            
    }
    ViewBag.b = bytes;
    return PartialView("~/Views/Home/Viewer.cshtml");
}
  1. And Viewer.cshtml

@{ 
  Layout = null;
  }
<!DOCTYPE html>
<html dir="ltr">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <title>PDF.js Viewer</title>
  <!--#if FIREFOX || MOZCENTRAL-->
  <!--#include viewer-snippet-firefox-extension.html-->
  <!--#endif-->

  <link href="@Url.Content(" ~/pdf.js/viewer.css ")" rel="stylesheet" type="text/css" />
  <!--#if !(FIREFOX || MOZCENTRAL || CHROME)-->
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/compatibility.js ")">
  </script>
  <!--#endif-->
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/l10n.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/core.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/util.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/api.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/metadata.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/canvas.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/obj.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/function.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/charsets.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/cidmaps.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/colorspace.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/crypto.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/evaluator.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/fonts.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/glyphlist.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/image.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/metrics.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/parser.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/pattern.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/stream.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/worker.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/jpg.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/jpx.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/jbig2.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/bidi.js ")">
  </script>
  <script type="text/javascript">
    //var THEFILEPATH = ('/Images/1.pdf');

    PDFJS.getDocument('@(ViewBag.b)');

    var url = '@Url.Content("~/pdf.js/worker_loader.js")';
    PDFJS.workerSrc = url;
  </script>

  <!--#if GENERIC || CHROME-->
  <!--#include viewer-snippet.html-->
  <!--#endif-->

  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/viewer.js ")">
  </script>
  <script type="text/javascript" src="@Url.Content(" ~/pdf.js/debugger.js ")">
  </script>
</head>

<body>
  <div id="outerContainer">

    <div id="sidebarContainer">
      <div id="toolbarSidebar">
        <div class="splitToolbarButton toggled">
          <button id="viewThumbnail" class="toolbarButton group toggled" title="Show Thumbnails" tabindex="1" data-l10n-id="thumbs">
                        <span data-l10n-id="thumbs_label">Thumbnails</span>
                    </button>
          <button id="viewOutline" class="toolbarButton group" title="Show Document Outline" tabindex="2" data-l10n-id="outline">
                        <span data-l10n-id="outline_label">Document Outline</span>
                    </button>
        </div>
      </div>
      <div id="sidebarContent">
        <div id="thumbnailView">
        </div>
        <div id="outlineView" class="hidden">
        </div>
      </div>
    </div>
    <!-- sidebarContainer -->

    <div id="mainContainer">
      <div class="findbar hidden doorHanger" id="findbar">
        <label for="findInput" class="toolbarLabel" data-l10n-id="find_label">Find:</label>
        <input id="findInput" class="toolbarField" tabindex="20">
        <div class="splitToolbarButton">
          <button class="toolbarButton findPrevious" title="" id="findPrevious" tabindex="21" data-l10n-id="find_previous">
                        <span data-l10n-id="find_previous_label">Previous</span>
                    </button>
          <div class="splitToolbarButtonSeparator"></div>
          <button class="toolbarButton findNext" title="" id="findNext" tabindex="22" data-l10n-id="find_next">
                        <span data-l10n-id="find_next_label">Next</span>
                    </button>
        </div>
        <input type="checkbox" id="findHighlightAll" class="toolbarField">
        <label for="findHighlightAll" class="toolbarLabel" tabindex="23" data-l10n-id="find_highlight">Highlight all</label>
        <input type="checkbox" id="findMatchCase" class="toolbarField">
        <label for="findMatchCase" class="toolbarLabel" tabindex="24" data-l10n-id="find_match_case_label">Match case</label>
        <span id="findMsg" class="toolbarLabel"></span>
      </div>
      <div class="toolbar">
        <div id="toolbarContainer">
          <div id="toolbarViewer">
            <div id="toolbarViewerLeft">
              <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="3" data-l10n-id="toggle_slider">
                                <span data-l10n-id="toggle_slider_label">Toggle Sidebar</span>
                            </button>
              <div class="toolbarButtonSpacer"></div>
              <button id="viewFind" class="toolbarButton group" title="Find in Document" tabindex="4" data-l10n-id="findbar">
                                <span data-l10n-id="findbar_label">Find</span>
                            </button>
              <div class="splitToolbarButton">
                <button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="5" data-l10n-id="previous">
                                    <span data-l10n-id="previous_label">Previous</span>
                                </button>
                <div class="splitToolbarButtonSeparator"></div>
                <button class="toolbarButton pageDown" title="Next Page" id="next" tabindex="6" data-l10n-id="next">
                                    <span data-l10n-id="next_label">Next</span>
                                </button>
              </div>
              <label id="pageNumberLabel" class="toolbarLabel" for="pageNumber" data-l10n-id="page_label">Page: </label>
              <input type="number" id="pageNumber" class="toolbarField pageNumber" value="1" size="4" min="1" tabindex="7">
              </input>
              <span id="numPages" class="toolbarLabel"></span>
            </div>
            <div id="toolbarViewerRight">
              <input id="fileInput" class="fileInput" type="file" oncontextmenu="return false;" style="visibility: hidden; position: fixed; right: 0; top: 0" />


              <button id="fullscreen" class="toolbarButton fullscreen" title="Switch to Presentation Mode" tabindex="11" data-l10n-id="presentation_mode">
                                <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
                            </button>

              <button id="openFile" class="toolbarButton openFile" title="Open File" tabindex="12" data-l10n-id="open_file">
                                <span data-l10n-id="open_file_label">Open</span>
                            </button>

              <button id="print" class="toolbarButton print" title="Print" tabindex="13" data-l10n-id="print">
                                <span data-l10n-id="print_label">Print</span>
                            </button>

              <button id="download" class="toolbarButton download" title="Download" tabindex="14" data-l10n-id="download">
                                <span data-l10n-id="download_label">Download</span>
                            </button>
              <!-- <div class="toolbarButtonSpacer"></div> -->
              <a href="#" id="viewBookmark" class="toolbarButton bookmark" title="Current view (copy or open in new window)" tabindex="15" data-l10n-id="bookmark"><span data-l10n-id="bookmark_label">Current View</span></a>
            </div>
            <div class="outerCenter">
              <div class="innerCenter" id="toolbarViewerMiddle">
                <div class="splitToolbarButton">
                  <button class="toolbarButton zoomOut" title="Zoom Out" tabindex="8" data-l10n-id="zoom_out">
                                        <span data-l10n-id="zoom_out_label">Zoom Out</span>
                                    </button>
                  <div class="splitToolbarButtonSeparator"></div>
                  <button class="toolbarButton zoomIn" title="Zoom In" tabindex="9" data-l10n-id="zoom_in">
                                        <span data-l10n-id="zoom_in_label">Zoom In</span>
                                    </button>
                </div>
                <span id="scaleSelectContainer" class="dropdownToolbarButton">
                                    <select id="scaleSelect" title="Zoom" oncontextmenu="return false;" tabindex="10" data-l10n-id="zoom">
                                        <option id="pageAutoOption" value="auto" selected="selected" data-l10n-id="page_scale_auto">Automatic Zoom</option>
                                        <option id="pageActualOption" value="page-actual" data-l10n-id="page_scale_actual">Actual Size</option>
                                        <option id="pageFitOption" value="page-fit" data-l10n-id="page_scale_fit">Fit Page</option>
                                        <option id="pageWidthOption" value="page-width" data-l10n-id="page_scale_width">Full Width</option>
                                        <option id="customScaleOption" value="custom"></option>
                                        <option value="0.5">50%</option>
                                        <option value="0.75">75%</option>
                                        <option value="1">100%</option>
                                        <option value="1.25">125%</option>
                                        <option value="1.5">150%</option>
                                        <option value="2">200%</option>
                                    </select>
                                </span>
              </div>
            </div>
          </div>
        </div>
      </div>

      <menu type="context" id="viewerContextMenu">
        <menuitem label="First Page" id="first_page" data-l10n-id="first_page"></menuitem>
        <menuitem label="Last Page" id="last_page" data-l10n-id="last_page"></menuitem>
        <menuitem label="Rotate Counter-Clockwise" id="page_rotate_ccw" data-l10n-id="page_rotate_ccw"></menuitem>
        <menuitem label="Rotate Clockwise" id="page_rotate_cw" data-l10n-id="page_rotate_cw"></menuitem>
      </menu>

      <div id="viewerContainer">
        <div id="viewer" contextmenu="viewerContextMenu"></div>
      </div>

      <div id="loadingBox">
        <div id="loading"></div>
        <div id="loadingBar">
          <div class="progress"></div>
        </div>
      </div>

      <div id="errorWrapper" hidden='true'>
        <div id="errorMessageLeft">
          <span id="errorMessage"></span>
          <button id="errorShowMore" onclick="" oncontextmenu="return false;" data-l10n-id="error_more_info">
                        More Information
                    </button>
          <button id="errorShowLess" onclick="" oncontextmenu="return false;" data-l10n-id="error_less_info" hidden='true'>
                        Less Information
                    </button>
        </div>
        <div id="errorMessageRight">
          <button id="errorClose" oncontextmenu="return false;" data-l10n-id="error_close">
                        Close
                    </button>
        </div>
        <div class="clearBoth"></div>
        <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea>
      </div>
    </div>
    <!-- mainContainer -->

  </div>
  <!-- outerContainer -->
  <div id="printContainer"></div>
</body>

</html>

I know that pdf.js cannot work with Byte arrays. I tried to convert array to a uint8 array, but it did not work. How can I open a byte array using pdf.js? I would appreciate any information.

9
  • PDF.js can work with byte array, strings and typed arrays, use them in getDocument overloaded function, e.g. .getDocument({data: arrOrStr}) Commented Jan 26, 2017 at 14:16
  • Why you cannot pass URL to the getDocument of the handler that will return PDF octet stream? Seems like you are doing the job HTTP transport suppose to do. Commented Jan 26, 2017 at 14:18
  • I followed your advice and overloaded getDocument. That's what I got: pastebin.com/yas79juH But nothing has changed: prntscr.com/e10d18 I think, maybe not enough to specify arrays of data in getDocument, perhaps even need to specify any parameters? Commented Jan 27, 2017 at 12:45
  • I use FileTable and all data save in satabase. Files themselves physically stored in the media and I even know where, but I can not access them (lack of experience). This is the only way I have found (transfer data array) Commented Jan 27, 2017 at 12:49
  • See github.com/mozilla/pdf.js/blob/master/examples/learning/…, but looks like jQuery's ajax just corrupts PDF data. You could avoid this issue by just giving PDF.js a URL of octet stream. Commented Jan 27, 2017 at 15:44

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.