自定义file_view以在浏览器中查看pdf

时间:2014-12-16 22:55:10

标签: plone

我仍在为Intranet运行Plone 3.0.6。我试图升级到当前版本,但总是遇到障碍。当我有更多时间的时候,我会再做一次。

目前,我只需要自定义/ portal_skins / plone_content / file_view,使其在浏览器中打开pdf附件,而不是下载它们。我们正在安装一个新的信息亭系统,它将在浏览器中显示PDF,但无法浏览和查看文件系统中的文件。

我已经做了很多搜索,发现其他人已经做了这个,但不是因为我正在运行的版本。我不是任何类型的开发人员,所以我无法弄清楚他们在我的系统上做了什么。

这是file_view的当前代码。

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
      lang="en"
      metal:use-macro="here/main_template/macros/master"
      i18n:domain="plone">

<body>

<div metal:fill-slot="main">
    <tal:main-macro metal:define-macro="main" 
           tal:define="size python:here.getObjSize(here);
                       content_type here/get_content_type|here/Format;
                       kssClassesView context/@@kss_field_decorator_view; 
                       getKssClasses nocall:kssClassesView/getKssClassesInlineEditable">

        <div tal:replace="structure provider:plone.abovecontenttitle" />

        <h1 class="documentFirstHeading"> 
            <metal:field use-macro="python:here.widget('title', mode='view')">
            Title
            </metal:field>
        </h1>

        <div tal:replace="structure provider:plone.belowcontenttitle" />

        <p class="documentDescription">
            <metal:field use-macro="python:here.widget('description', mode='view')">
            Description
            </metal:field>
        </p>

        <div tal:replace="structure provider:plone.abovecontentbody" />


        <p>
            <metal:field use-macro="python:here.widget('file', mode='view')">
            File
            </metal:field>
        </p>

        <div tal:condition="python: content_type.startswith('text')">
            <h2 i18n:translate="heading_file_contents">File contents</h2>
            <pre tal:content="here/get_data|here/data|nothing">
            </pre>
        </div>

        <div metal:use-macro="here/document_relateditems/macros/relatedItems">
            show related items if they exist
        </div>

        <div tal:replace="structure provider:plone.belowcontentbody" />

    </tal:main-macro>
</div>

</body>

</html>

我还搜索了at_download并找到了/ Plone / portal_skins / archetypes / at_download。它包含以下代码:

if traverse_subpath:
    field = context.getWrappedField(traverse_subpath[0])
else:
    field = context.getPrimaryField()
return field.download(context)

有人能告诉我需要更改哪些内容才能在浏览器中查看PDF文件吗?

目前,当我选择指向PDF的链接时,它看起来像这样。 http://intranet.internal.lan/somewhere/Test.pdf/at_download/file

我需要它看起来像这样。

http://intranet.internal.lan/somewhere/Test.pdf

(没有/ at_download / file)

非常感谢任何帮助。

由于

大卫

2 个答案:

答案 0 :(得分:1)

我不知道它是否在plone 3.x.x中有效,但是 我正在使用plone 4.1.6,我想渲染一个pdf文件 在浏览器中(在chrome和firefox中工作)并像这样放置 在页面模板中:

<a tal:attributes="href string:${edicao_url}/@@images/field_pdf"  target="_blank">View PDF</a>

网址显示:

http://localhost:8080/plone_site/content-type/@@images/field_pdf/

因此,字段field_pdf是内容类型的属性! 啊,我正在使用Dexterity的内容类型!

希望这对您有所帮助! = d

答案 1 :(得分:0)

你是对的,你需要这样的东西:

<object id="pdfRenderer" data="/path/to/document.pdf" type="application/pdf" style="height: 700px;">
    </object>

如果您未将view附加到网址,则可以通过触发文件下载来实现。

例如:

要触发下载,您必须在文件类型上实现此功能或修补现有文件类型。 可能的入口点是FileFied index_html方法。

这是Plone 4.3.x的一个工作示例:

from plone.app.blob import field
from plone.app.blob.download import handleIfModifiedSince, handleRequestRange
from urllib import quote
from webdav.common import rfc1123_date
from zope.component import getMultiAdapter


class FileField(field.FileField):

    def index_html(self, instance, REQUEST=None, RESPONSE=None,
                   charset='utf-8', disposition='inline'):
        """Kicks download.
        Writes data including file name and content type to RESPONSE
        """

        if REQUEST is None:
            REQUEST = instance.REQUEST

        if RESPONSE is None:
            RESPONSE = REQUEST.RESPONSE

        RESPONSE.setHeader('Last-Modified', rfc1123_date(instance._p_mtime))
        RESPONSE.setHeader('Content-Type', self.getContentType(instance))
        RESPONSE.setHeader('Accept-Ranges', 'bytes')

        if handleIfModifiedSince(instance, REQUEST, RESPONSE):
            return ''

        length = self.get_size(instance)
        RESPONSE.setHeader('Content-Length', length)

        filename = self.getFilename(instance)
        if filename is not None:
            if isinstance(filename, unicode):
                filename = filename.encode(charset, errors="ignore")

            # Create a user agent specific disposition header
            # IE needs an url quoted filename
            # Other browsers need an unquoted filename
            user_agent = REQUEST.get('HTTP_USER_AGENT', '')
            if 'MSIE' in user_agent:
                header_value = '%s; filename=%s' % (disposition,
                                                    quote(filename))
            else:
                header_value = '%s; filename="%s"' % (disposition, filename)
            RESPONSE.setHeader("Content-disposition", header_value)

        request_range = handleRequestRange(instance, length, REQUEST, RESPONSE)

        # Notify file downloads, but do not notify range requests
        if not ('start' in request_range and request_range['start'] > 0):
            portal_state = getMultiAdapter((instance, instance.REQUEST),
                                           name='plone_portal_state')

        return self.get(instance).getIterator(**request_range)

在实施新功能之前,您应该考虑升级您的Plone网站,这可能会再次阻止您!