首页 > 编程问答 >在 JavaScript 异步接收到的浏览器中显示 pdf

在 JavaScript 异步接收到的浏览器中显示 pdf

时间:2024-07-23 05:49:06浏览次数:10  
标签:javascript python django pdf django-views

我有一个 Django 应用程序,我从 JS 打电话索要 pdf。 Django视图返回 HttpResponse application/pdf

如何让JS将接收到的 application/pdf 数据显示为pdf?

Django视图

def pdf_generation(request):
    context = {}
    t = get_template('html_pdf.html')
    html_string = t.render(context)
    result = HTML(string=html_string)
    css = CSS('/static/css/pdf.css')
    pdf_in_memory = BytesIO()
    HTML(string=html_string).write_pdf(pdf_in_memory, stylesheets=[css])

    return HttpResponse(pdf_in_memory.getvalue(), content_type="application/pdf")

JS

async function getData_pdf() {
try {
    const response = await fetch('http://192.168.1.2:8000/pdf/'); 
    if (!response.ok) {
        throw new Error('Network response was not ok ' + response.statusText);
    }
    const data = await response.text();
    data.type('application/pdf');
    data.end(pdf, 'binary');
} catch (error) {
    console.error('There has been a problem with your fetch operation:', error);
}
};

你的思路是正确的,但需要做一些调整才能在浏览器中显示 PDF。

错误分析

你的 JavaScript 代码中存在一些错误:

  1. data.type('application/pdf') data.end(pdf, 'binary') 是 Node.js 中 response 对象的方法,浏览器环境中没有这些方法。
  2. response.text() 方法会将响应体解析为文本,而你需要的是二进制数据来显示 PDF。

解决方案

以下是修改后的 JavaScript 代码:

async function getData_pdf() {
  try {
    const response = await fetch('http://192.168.1.2:8000/pdf/');
    if (!response.ok) {
      throw new Error('Network response was not ok ' + response.statusText);
    }

    // 获取二进制数据
    const data = await response.blob();

    // 创建 Blob URL
    const pdfUrl = URL.createObjectURL(data);

    // 在新的标签页或窗口中打开 PDF
    window.open(pdfUrl, '_blank');

    // 或者,将 PDF 嵌入到页面中
    // const iframe = document.createElement('iframe');
    // iframe.src = pdfUrl;
    // iframe.width = '100%';
    // iframe.height = '800px';
    // document.body.appendChild(iframe);

  } catch (error) {
    console.error('There has been a problem with your fetch operation:', error);
  }
};

代码解释

  1. response.blob() : 这个方法会返回一个 Promise,解析为一个包含二进制数据的 Blob 对象。
  2. URL.createObjectURL(data) : 这个方法会创建一个指向 Blob 对象的 URL,可以在浏览器中使用。
  3. window.open(pdfUrl, '_blank') : 这个方法会在新的标签页或窗口中打开指定的 URL,这里就是 PDF 的 URL。
  4. 嵌入 PDF (可选): 你也可以创建一个 iframe 元素,并将 PDF 的 URL 设置为 src 属性,从而将 PDF 嵌入到当前页面中。

注意:

  • 确保你的 Django 视图返回的 Content-Disposition 标头设置为 inline ,以便浏览器尝试直接打开 PDF 文件。 你可以在 Django 视图中添加以下代码:
response['Content-Disposition'] = 'inline; filename="mypdf.pdf"'
  • 不同浏览器对 PDF 显示的支持程度不同,有些浏览器可能需要安装插件才能正常显示 PDF。

希望以上信息能帮到你!

标签:javascript,python,django,pdf,django-views
From: 78780881

相关文章

  • 如何构建一维数组的二维数组的特定 Python 结构?
    如何构建一维数组(即行向量)的二维数组的特定结构以满足特定我正在维护的遗留程序的结构?我可以在此结构中生成正确的内容all_measurements[:12]array([[0.,0.,0.,2.],[0.02,0.334,0.04,2.24],[0.04,0.668,0.08,2.48],...........
  • 如何使用 Python Flask 将新的咖啡馆(元素)添加到数据库(SQLite)?
    这是我的代码:@app.route("/add",methods=["POST"])defpost_new_cafe():new_cafe=Cafe(name=request.form.get("name"),map_url=request.form.get("map_url"),img_url=request.form.get("img......
  • 使用 tkinter 为 python 创建 GUI 时如何解决语法错误?
    我是一名Python初学者,决定使用tkinter制作一个小型GUI,该GUI接受用户(潜在餐馆)的3个输入,然后单击按钮后随机输出其中一家餐馆。我不断收到语法错误,并认为它与我的buttonfunc或调用它的命令有关。此代码尚未包含在GUI上输出餐厅的任何位置。任何帮助将不胜感激#Pyth......
  • 在 python 中打开 gnome 终端立即显示为僵尸
    作为背景,我正在编写一个脚本来训练多个pytorch模型。我有一个训练脚本,我希望能够在gnome终端中作为子进程运行。这样做的主要原因是我可以随时关注训练进度。如果我可能有多个GPU,我想在单独的窗口中多次运行我的训练脚本。为了实现这一点,我一直在使用popen。以下代码用于打......
  • python threading.Condition 的意外行为
    我正在尝试同步多个线程。我期望使用threading.Condition和threading.Barrier时的脚本输出大致相同,但事实并非如此。请解释一下为什么会发生这种情况。一般来说,我需要线程在一个无限循环中执行工作(一些IO操作),但是每个循环都是以主线程的权限开始的,而权限是仅在......
  • Python - 逆透视数据框
    我有一个按日期时间索引的表,每个日期时间都有多个层(中心和交货间隔):日期时间中心交货间隔结算点价格2024-01-0101:00:00休斯顿中心1......
  • 试图理解这个错误:致命的Python错误:PyEval_RestoreThread:该函数必须在持有GIL的情况下
    我有一个小型tkinter应用程序,我一直在其中实现最小的“拖放”,主要作为学习实验。我真正关心的是删除文件的文件路径。一切实际上都工作正常,直到我尝试在拖放后打包标签小部件。下面的最小工作示例。有问题的行会用注释指出。我通常不会在调试方面遇到太多麻烦,但我只是不知......
  • 如何使代码格式再次适用于 Python(Mac 上的 Visual Studio Code)?
    在Mac上,Option+Shift+F现在会显示“没有安装用于‘python’文件的格式化程序”。消息框:我尝试安装这个插件,但没有看到这种情况的变化:我已经为Python安装了这两个插件:但是正如@starball提到的,它可能已经减少了支持现在。......
  • 无法在 python 中安装 pip install expliot - bluepy 的 Building Wheel (pyproject.t
    在此处输入图像描述当我尝试在Windows计算机中通过cmd安装pipinstallexpliot包时,我收到2个错误名称×Buildingwheelforbluepy(pyproject.toml)didnotrunsuccessfully.│exitcode:1**AND**opt=self.warn_dash_deprecation......
  • python 用单斜杠-反斜杠替换url字符串中的双斜杠
    我的URL包含错误的双斜杠(“//”),我需要将其转换为单斜杠。不用说,我想保持“https:”后面的双斜杠不变。可以在字符串中进行此更改的最短Python代码是什么?我一直在尝试使用re.sub,带有冒号否定的正则表达式(即,[^:](//)),但它想要替换整个匹配项(包括前面......