将数据库中的二进制pdf文件显示到前端网页的方法

我的使用要求是从MongoDB GRIDFS中读取到pdf文件,然后在html前端展示。后端用的是python Django。

网上查了几天资料,最后发现其实很简单。

直接显示服务器上的pdf文件这个很容易,但是如果是存储在数据库中的二进制文档呢?其实也很简单,只是我看了文章后把自己搞复杂了。

一开始瞧不上人家用iframe,撞了几天南墙之后,还是觉得iframe最好。把所有问题轻松解决了。

服务器端

服务器端要做的就是把pdf文档读取出来,返回给前端。这里也绕了很多弯。其实以fileresponse返回pdf文档就可以了,不需要去进行各种编码。

从gridFS读取到文件后,进行如下操作:

                bufr = io.BytesIO(file_content)
                 
                response = FileResponse(bufr, content_type='application/pdf')
                ss=f'inline; filename={fileid}.pdf'
                #response['Content-Disposition'] = f'attachment;filename="{file_name }"'
                response['Content-Disposition'] = ss
                return response

这样就可以在前端看到pdf文件了。对于电脑版的浏览器,会直接打开浏览pdf。在手机上,安卓会直接下载,苹果会直接打开。

而我想要的效果是都是直接打开,然后,用户可以自行从打开的界面中选择下载保存。

因此想到用pdf.js,最后发现用和不用都可以实现。

web前端

前端先引用pdf.js

<script src="../static/app/scripts/pdfjs/build/pdf.mjs" type="module"></script>
<link rel="stylesheet" href="../static/app/scripts/pdfjs/web/viewer.css">
<script src="../static/app/scripts/pdfjs/web/viewer.mjs" type="module"></script>

再先放个iframe:

<div id="divPdfViewPanel" style="margin: 5px;">
    <iframe  id="framePdfViewPanel"   width="100%" height="800px;"></iframe>
</div>

最后就是关键的src属性的处理。

由于服务器返回的不是磁盘文件,因此需要通过接口来请求。

src属性支持接口请求。

直接将请求到的fileresponse传递给src属性,可以实现使用浏览器原生功能展现pdf:

fileURL = 'getpdfstream?fileid=' + fid + '&re_url=' + re_url;
document.getElementById("framePdfViewPanel").src=fileURL;   //这里虽然没有使用pdf.js但是也成功了

使用览器原生功能展现效果如下:

将pdf.js的viewer.html页面传递给src属性,将上述代码注释掉:


            fileURL = 'http://localhost:55220/bulletin/getpdfstream?fileid=' + fid + '&re_url=' + re_url;
            fileURL = encodeURIComponent(fileURL);
          //window.open('../static/app/scripts/pdfjs/web/viewer.html?file=' +fileURL);    //打开新窗口显示,成功,效果不好,留下空白页面
           document.getElementById("framePdfViewPanel").src='../static/app/scripts/pdfjs/web/viewer.html?file=' +fileURL;// 这里使用了pdf.js,成功了

使用pdf.js展示的效果如下,与原生的相比,工具栏不一样。

两者都能浏览大文件。

在手机端的效果暂未测试。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要将数据库的图片二进制数据转换为图片,并插入到 Word 文档,你可以使用 Aspose.Words 库和 System.Drawing 命名空间来实现。下面是一个示例代码,展示了如何实现这一过程: ```csharp using Aspose.Words; using System.Drawing; using System.IO; using System.Data.SqlClient; class Program { static void Main(string[] args) { // 加载 Word 文档 Document doc = new Document("input.docx"); // 获取要插入图片的表格 Table table = doc.GetChildNodes(NodeType.Table, true)[0] as Table; // 获取表格的第一个单元格 Cell cell = table.Rows[0].Cells[0]; // 从数据库获取图片的二进制数据 byte[] imageData = GetImageDataFromDatabase(); // 将二进制数据转换为图片对象 using (MemoryStream stream = new MemoryStream(imageData)) { Image image = Image.FromStream(stream); // 创建一个新的图片对象 Shape img = new Shape(doc, ShapeType.Image); // 设置图片的位置和大小 img.Left = 0; img.Top = 0; img.Width = 100; img.Height = 100; // 将图片加载到 Shape 对象 img.ImageData.SetImage(image); // 清空单元格内容 cell.RemoveAllChildren(); // 将图片插入到单元格 cell.AppendChild(img); } // 保存文档 doc.Save("output.docx"); } static byte[] GetImageDataFromDatabase() { // 从数据库获取图片的二进制数据,这里假设你已经实现了相应的逻辑 byte[] imageData = null; // 这里是一个示例,假设你使用了 SQL Server 数据库 string connectionString = "your_connection_string"; string query = "SELECT ImageData FROM Images WHERE ImageId = 1"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand command = new SqlCommand(query, connection); imageData = (byte[])command.ExecuteScalar(); } return imageData; } } ``` 在上述代码,首先加载了要编辑的 Word 文档(假设为 "input.docx")。然后获取要插入图片的表格(这里假设你的文档只有一个表格),以及要在其插入图片的单元格。接下来,从数据库获取图片的二进制数据,并将其转换为图片对象。然后创建一个新的图片对象,并设置图片的位置和大小。接着,清空单元格的内容,并将图片对象插入到单元格。最后,保存文档(保存为 "output.docx")。 请注意,上述代码的 GetImageDataFromDatabase() 方法是一个示例方法,你需要根据你的实际情况从数据库获取相应图片的二进制数据。同时,也需要根据需要调整表格、单元格、图片的位置、大小和文件路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zou_ys88

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值