【问题标题】:Printing a PDF file in Django在 Django 中打印 PDF 文件
【发布时间】:2018-01-28 16:11:07
【问题描述】:

我想在我的 Django 项目中创建一些东西,将模型对象的 FileField 中的 PDF 文件物理打印到纸上。像这样:

class PDF(models.Model):
    pdf = models.FileField(upload_to='pdffiles/', blank=True, null=True}

我想要做的主要事情是创建一个链接,该链接使用 Javascript 创建一个弹出窗口,其中包含一个输入字段,用户在该输入字段中从对象的 FileField 中输入 PDF 的名称,以及一个显示“打印”的按钮,该按钮触发物理打印功能(包括打开打印对话框)。我是否应该使用表单或视图来实现此功能,如果我应该使用 Javascript 来激活打印功能,我该怎么做?谢谢。

编辑:我正在考虑使用 print.js。有人可以告诉我如何在我的 Django 项目中实现 print.js 吗?我需要插入 Git 存储库中的哪些文件以及如何将它们链接到我的模板?

【问题讨论】:

    标签: javascript python django pdf printing


    【解决方案1】:

    如果我关注这个Question,我想你可以使用这个解决方案;

    在你的views.py

    from django.conf import settings
    from django.shortcuts import get_object_or_404
    from yourapp.models import PDF
    
    def pdf_viewer(request, pk):
        obj = get_object_or_404(PDF, pk=pk)
        pdf_full_path = settings.BASE_DIR + obj.pdf.url
        with open(pdf_full_path, 'r') as pdf:
            response = HttpResponse(pdf.read(), content_type='application/pdf')
            response['Content-Disposition'] = 'filename=%s' % obj.pdf.name
            return response
        pdf.closed
    

    然后urls.py;

    from django.conf.urls import url
    from yourapp.views import pdf_viewer
    
    urlpatterns = [
        url(r'^pdf-viewer/(?P<pk>\d+)/$', pdf_viewer, name='pdf_viewer_page'),
    ]
    

    模板里面怎么样?

    <button class="show-pdf">Show PDF</button>
    <div class="pdf-wrapper">
      <iframe id="pdf-iframe" frameborder="0" allowfullscreen></iframe>
    </div>
    
    <script>
    // you can using jQuery to load the pdf file as iframe.
    $('.show-pdf').click(function () {
        var src = '{% url "pdf_viewer_page" pk=obj.id %}';
        var iframe = $("#pdf-iframe");
    
        iframe.attr({'width': 560, 'height': 300});
        // iframe.attr('src', src); // to load the pdf file only.
    
        // to load and auto print the pdf file.
        iframe.attr('src', src).load(function(){
          document.getElementById('pdf-iframe').contentWindow.print();
        });
        return false;
    });
    </script>
    

    但是,如果您尝试使用 {{ obj.pdf.url }},请确保在此模板中返回字符串,例如:'/media/to/file.pdf'

    或者更简单(整页);

    <a href='{% url "pdf_viewer_page" pk=obj.id %}' target="_blank">Show PDF on new tab</a>
    

    【讨论】:

    • 我需要一个链接来创建一个模式,该模式具有一个允许用户输入文件名或从下拉框中选择的输入字段,以及一个打印出 PDF 文件的按钮名称与用户输入的名称相匹配。有没有不需要查看 PDF 的方法来做到这一点?那将是首选,但不是必需的。另外,我在您的代码中看到了启动打印过程的代码,但是人们需要做什么或单击以激活它?
    • 这是否适用于托管在例如 S3 上的文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2017-11-26
    • 2016-05-21
    • 2020-01-28
    • 2012-01-07
    相关资源
    最近更新 更多