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.

user14773854
  • 303
  • 4
  • 10
MaxG
  • 21
  • 2
  • PDF.js can work with byte array, strings and typed arrays, use them in getDocument overloaded function, e.g. `.getDocument({data: arrOrStr})` – async5 Jan 26 '17 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. – async5 Jan 26 '17 at 14:18
  • I followed your advice and overloaded `getDocument`. That's what I got: http://pastebin.com/yas79juH But nothing has changed: http://prntscr.com/e10d18 I think, maybe not enough to specify arrays of data in getDocument, perhaps even need to specify any parameters? – MaxG Jan 27 '17 at 12:45
  • I use [FileTable](https://msdn.microsoft.com/en-us/library/ff929144.aspx) 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) – MaxG Jan 27 '17 at 12:49
  • See https://github.com/mozilla/pdf.js/blob/master/examples/learning/helloworld64.html, 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. – async5 Jan 27 '17 at 15:44
  • Also see http://stackoverflow.com/questions/1757799/displaying-a-image-from-a-database-in-asp-net-mvc – async5 Jan 27 '17 at 15:50
  • I've tried everything. The maximum that I got it: [source](http://pastebin.com/XHDB0D3n) , [screenshot](http://prnt.sc/e26ggn). File allegedly opened file (displayed exact number of pages), but the file is displayed. I checked the console and where all the data is transferred correctly, I think the thing in the mapping data, but where I can not identify. – MaxG Jan 30 '17 at 11:39
  • Looks like PDF.js works fine. Can you check if all need CSS is included? Use DOM inspector or find canvases and check properties. – async5 Jan 30 '17 at 14:15
  • Yes, all CSS include (viewer.css) and worked fine. І do not use canvas layout, and perhaps this problem? – MaxG Jan 31 '17 at 07:37

0 Answers0