ASP.NET MVC 项目直接预览PDF文件

ASP.NET MVC 是一种在 ASP.NET 框架下使用的 Web 应用程序框架。我们可以通过 ASP.NET MVC 将应用程序分为三个主要部分: 模型(Model)、视图(View)和控制器(Controller)。在 ASP.NET MVC 项目中,如果需要直接预览 PDF 文件,我们可以通过以下步骤来实现:

1. 生成 PDF 文件

我们可以使用第三方库来生成 PDF 文件,例如 iTextSharp,PdfSharp 或 Wkhtmltopdf。这里以 iTextSharp 为例,示例代码如下:

public ActionResult GeneratePdf()
{
    Document document = new Document();
    MemoryStream memoryStream = new MemoryStream();
    PdfWriter writer = PdfWriter.GetInstance(document, memoryStream);
    document.Open();
    Paragraph paragraph = new Paragraph("Hello World!");
    document.Add(paragraph);
    document.Close();
    byte[] bytes = memoryStream.ToArray();
    memoryStream.Close();
    return File(bytes, "application/pdf");
}

在上述代码中,我们首先创建一个文档对象 Document,然后创建一个内存流 MemoryStream,并将其与 PdfWriter 关联。接着,我们打开文档,向其中添加一个段落,并关闭文档。最后,将内存流转换为字节数组并通过 File 方法返回 PDF 文件。

2. 使用 PDF.js 预览 PDF 文件

我们可以使用 Mozilla 提供的开源 JavaScript 库 PDF.js 来在浏览器中预览 PDF 文件。可以通过以下步骤来实现:

Step 1. 引入库文件

将 PDF.js 相关的文件下载到本地,并将其引入到项目中。我们需要引入以下三个文件:

  1. pdf.js:PDF.js 主要文件;
  2. pdf.worker.js:PDF.js 的工作线程,用于异步解析 PDF 文件;
  3. viewer.html:用于预览 PDF 的 HTML 文件。

Step 2. 修改 HTML 文件

在 viewer.html 文件中,我们需要修改其中的 PDF_URL 和 PDF_TITLE 两个变量的值为生成 PDF 的地址和标题。代码示例如下:

<div id="outerContainer">
  <div id="sidebarContainer">
    <div id="toolbarSidebar">
      <div class="splitToolbarButton toggled">
        <button id="viewThumbnail" class="toolbarButton toggled"
          title="Show Thumbnails" tabindex="2" data-l10n-id="thumbs">
          <span data-l10n-id="thumbs_label">Thumbnails</span>
        </button>
        <button id="viewOutline" class="toolbarButton"
          title="Show Document Outline (double-click to expand/collapse all items)"
          tabindex="3" data-l10n-id="outline">
          <span data-l10n-id="outline_label">Document Outline</span>
        </button>
        <button id="viewAttachments" class="toolbarButton"
          title="Show Attachments" tabindex="4" data-l10n-id="attachments">
          <span data-l10n-id="attachments_label">Attachments</span>
        </button>
      </div>
    </div>
    <div id="sidebarContent">
      <div id="thumbnailView"></div>
      <div id="outlineView" class="hidden"></div>
      <div id="attachmentsView" 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="91">
      <div class="splitToolbarButton">
        <button class="toolbarButton findPrevious" title="" id="findPrevious"
          tabindex="92" 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="93" 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="94"
        data-l10n-id="find_highlight">Highlight all</label>
      <input type="checkbox" id="findMatchCase" class="toolbarField">
      <label for="findMatchCase" class="toolbarLabel" tabindex="95"
        data-l10n-id="find_match_case_label">Match case</label>
      <span id="findMsg" class="toolbarLabel"></span>
    </div> <!-- findbar -->
    <div class="toolbar">
      <div id="toolbarContainer">
        <div id="toolbarViewer">
          <div id="toolbarViewerLeft">
            <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar"
              tabindex="11" data-l10n-id="toggle_sidebar">
              <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span>
            </button>
            <div class="toolbarButtonSpacer"></div>
            <div class="splitToolbarButton">
              <button class="toolbarButton pageUp" title="Previous Page"
                id="previous" tabindex="13" 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="14" 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="15">
            <span id="numPages" class="toolbarLabel"></span>
          </div>
          <div id="toolbarViewerRight">
            <div id="presentationMode" class="hidden">
              <button id="presentationModeExit" class="toolbarButton presentationModeExit"
                title="Leave Presentation Mode" tabindex="31"
                data-l10n-id="presentation_mode_exit">
                <span data-l10n-id="presentation_mode_exit_label">Exit Presentation Mode</span>
              </button>
            </div>
            <button id="openFile" class="toolbarButton" title="Open File"
              tabindex="21" data-l10n-id="open_file">
              <span data-l10n-id="open_file_label">Open</span>
            </button>
            <button id="print" class="toolbarButton" title="Print"
              tabindex="22" data-l10n-id="print">
              <span data-l10n-id="print_label">Print</span>
            </button>
            <button id="download" class="toolbarButton" title="Download"
              tabindex="23" data-l10n-id="download">
              <span data-l10n-id="download_label">Download</span>
            </button>
            <a href="#" id="viewBookmark" class="toolbarButton" title="Current view (copy or open in new window)"
              tabindex="24" data-l10n-id="bookmark">
              <span data-l10n-id="bookmark_label">Current View</span>
            </a>
            <div class="verticalToolbarSeparator"></div>
            <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools"
              tabindex="25" data-l10n-id="tools">
              <span data-l10n-id="tools_label">Tools</span>
            </button>
          </div>
          <div id="toolbarViewerMiddle">
            <div class="splitToolbarButton">
              <button id="zoomOut" class="toolbarButton zoomOut" title="Zoom Out"
                tabindex="10" data-l10n-id="zoom_out">
                <span data-l10n-id="zoom_out_label">Zoom Out</span>
              </button>
              <div class="splitToolbarButtonSeparator"></div>
              <button id="zoomIn" class="toolbarButton zoomIn" title="Zoom In"
                tabindex="11" 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" tabindex="12" data-l10n-id="zoom">
                <option id="pageAutoOption" title="" value="auto" selected="selected"
                  data-l10n-id="page_scale_auto">Automatic Zoom</option>
                <option id="pageActualOption" title="" value="page-actual"
                  data-l10n-id="page_scale_actual">Actual Size</option>
                <option id="pageFitOption" title="" value="page-fit"
                  data-l10n-id="page_scale_fit">Fit Page</option>
                <option id="pageWidthOption" title="" value="page-width"
                  data-l10n-id="page_scale_width">Full Width</option>
                <option id="customScaleOption" title="" value="custom"
                  disabled="disabled" hidden="true"></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 id="loadingBar">
          <div class="progress">
            <div class="glimmer">
            </div>
          </div>
        </div>
      </div>
    </div>
    <div id="viewerContainer" tabindex="0">
      <div id="viewer">
        <div id="canvasContainer">
          <div id="viewerCanvas"></div>
          <div id="textLayerContainer" class="hidden"></div>
        </div>
        <div id="loadingBox">
          <div id="loadingIcon"></div>
        </div>
        <div id="errorWrapper" hidden='true'>
          <div id="errorMessageLeft">
            <span id="errorMessage"></span>
            <button id="errorShowMore" data-l10n-id="error_more_info">
              More Information
            </button>
            <button id="errorShowLess" data-l10n-id="error_less_info" hidden='true'>
              Less Information
            </button>
          </div>
          <div id="errorMessageRight">
            <button id="errorClose" data-l10n-id="error_close">
              Close
            </button>
          </div>
          <div class="clearBoth"></div>
          <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea>
        </div>
      </div>
    </div>
    <div id="overlayContainer" class="hidden">
      <div id="passwordOverlay" class="container hidden">
        <div class="dialog">
          <div class="row">
            <p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p>
          </div>
          <div class="row">
            <input type="password" id="password" class="toolbarField">
          </div>
          <div class="buttonRow">
            <button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button>
            <button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button>
          </div>
        </div>
      </div>
      <div id="documentPropertiesOverlay" class="container hidden">
        <div class="dialog">
          <div class="row">
            <span data-l10n-id="document_properties_file_name">File name:</span> <p id="fileNameField">-</p>
          </div>
          <div class="row">
            <span data-l10n-id="document_properties_file_size">File size:</span> <p id="fileSizeField">-</p>
          </div>
          <div class="separator"></div>
          <div class="row">
            <span data-l10n-id="document_properties_title">Title:</span> <p id="titleField">-</p>
          </div>
          <div class="row">
            <span data-l10n-id="document_properties_author">Author:</span> <p id="authorField">-</p>
          </div>
          <div class="row">
            <span data-l10n-id="document_properties_subject">Subject:</span> <p id="subjectField">-</p>
          </div>
          <div class="row">
            <span data-l10n-id="document_properties_keywords">Keywords:</span> <p id="keywordsField">-</p>
          </div>
          <div class="row">
            <span data-l10n-id="document_properties_creation_date">Creation Date:</span> <p id="creationDateField">-</p>
          </div>
          <div class="row">
            <span data-l10n-id="document_properties_modification_date">Modification Date:</span> <p id="modificationDateField">-</p>
          </div>
          <div class="row">
            <span data-l10n-id="document_properties_more_info">Additional Information:</span>
            <p id="producerField">-</p>
            <p id="versionField">-</p>
          </div>
          <div class="buttonRow">
            <button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button>
          </div>
        </div>
      </div>
    </div>
  </div> <!-- mainContainer -->
</div> <!-- outerContainer -->
<script type="text/javascript">
  PDFJS.getDocument("PDF_URL").promise.then(function(pdf) {
    var total = pdf.numPages;
    var currentPage = 1;
    pdf.getPage(currentPage).then(function(page) {
      var scale = 1.5;
      var viewport = page.getViewport({scale: scale});

      var canvas = document.getElementById('viewerCanvas');
      var context = canvas.getContext('2d');
      canvas.height = viewport.height;
      canvas.width = viewport.width;

      var renderTask = page.render({
        canvasContext: context,
        viewport: viewport
      });
      renderTask.promise.then(function() {
        // do something
      });
    });
  });
</script>

在上述代码中,我们将 HTML 文件中的 PDF_URL 变量的值设置为 ASP.NET MVC 生成的 PDF 文件的地址,如生成 PDF 的示例中的 GeneratePdf 方法返回的文件地址:"/Home/GeneratePdf"。

通过以上步骤,我们就可以在 ASP.NET MVC 项目中直接预览 PDF 文件了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET MVC 项目直接预览PDF文件 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#中的属性解析(get、set、value)

    当我们定义一个类时,通常需要为类的成员添加一些限制以确保数据的正确性和安全性。属性解析(get、set、value)就是一种常用的实现方式之一。 属性解析 属性解析指的是在属性中添加代码,以便在读取和写入属性时执行特定的操作。具体而言,需要为属性添加get访问器和/或set访问器。 当获取属性时,代码将进入get访问器,并执行其中的代码。同样,当设置属性值时…

    C# 2023年5月31日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,入魔篇(使用Docker+Jenkins实现持续集成、自动化部署)

    通过前面三篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus) 通过前面三篇文章的介绍,我们已经对.net co…

    C# 2023年5月3日
    00
  • ASP.NET Core实现多文件上传

    ASP.NET Core 实现多文件上传的完整攻略如下: 步骤一:创建 ASP.NET Core 应用程序 在使用 ASP.NET Core 实现多文件上传之前,需要创建一个 ASP.NET Core 应用程序。可以使用 Visual Studio 或者命令行工具创建 ASP.NET Core 应用程序。 步骤二:添加依赖项 在使用 ASP.NET Core…

    C# 2023年5月17日
    00
  • C#6.0新语法示例详解

    C#6.0新语法示例详解攻略 简介 C#6.0是微软为.NET开发者带来的一个重要的版本,其中包含了很多新的语法特性,这些新特性可以让开发者更加方便地书写代码,提高代码的可读性和可维护性。 本篇攻略将会对C#6.0中的一些新语法特性进行详细讲解,包括:Null-conditional运算符、string的插值、nameof表达式、Auto-property初…

    C# 2023年5月15日
    00
  • C#多线程学习(二) 如何操纵一个线程

    C#多线程学习(二) 如何操纵一个线程 线程学习第一篇:C#多线程学习(一) 多线程的相关概念 下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什么事) 在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程…

    C# 2023年4月24日
    00
  • 详解C#如何实现隐式类型转换

    下面是详解C#如何实现隐式类型转换的完整攻略: 标题:C#隐式类型转换详解 什么是隐式类型转换 在C#中,隐式类型转换是指将一种数据类型的值自动转换为另一种数据类型,无需显式地指定转换类型。通常情况下,隐式类型转换会自动执行,这样可以方便地在不同类型之间进行赋值、比较等操作。 哪些数据类型可以进行隐式类型转换 C#中只有一部分数据类型可以进行隐式类型转换,主…

    C# 2023年6月1日
    00
  • C#中类的使用教程详解

    C#中类的使用教程详解 什么是类 在C#中,类是一种自定义类型,它允许我们定义自己的数据类型以及与它相关的方法和事件。类包含了多个成员,包括属性、方法、字段、构造函数和事件等。使用类,我们可以把数据和相应的方法封装在一起,便于代码的管理和维护。 声明和定义类 定义一个类的语法格式如下: [修饰符] class 类名 { //类成员 } 其中,修饰符是可选部分…

    C# 2023年6月1日
    00
  • ASP.NET Core实现自动依赖注入

    在本攻略中,我们将详细讲解如何在ASP.NET Core中实现自动依赖注入,并提供两个示例说明。 步骤一:安装依赖注入包 在ASP.NET Core中实现自动依赖注入之前,您需要安装依赖注入包。以下是一个示例: dotnet add package Microsoft.Extensions.DependencyInjection 在上面的代码中,我们使用do…

    C# 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部