diff options
author | Alon Levy <alon@pobox.com> | 2013-03-27 12:21:10 +0200 |
---|---|---|
committer | Alon Levy <alon@pobox.com> | 2013-04-15 09:51:21 +0300 |
commit | a80ebf3b64dce807d84ab3993984c211f55b47db (patch) | |
tree | 2e8eaebf18414ee511c0dc476a2be8d78253e46f /mediagoblin/templates | |
parent | 3cadb4a6cd1d5cfdef8712d00e4594345a15b4a7 (diff) | |
download | mediagoblin-a80ebf3b64dce807d84ab3993984c211f55b47db.tar.lz mediagoblin-a80ebf3b64dce807d84ab3993984c211f55b47db.tar.xz mediagoblin-a80ebf3b64dce807d84ab3993984c211f55b47db.zip |
add pdf media type
The new media type supports pdf and a subset of media recognized by libreoffice via
unoconv.
Every document added goes through:
* conversion to pdf with unoconv if not already a pdf
* creation of thumbnail and medium sized image, and pdfinfo generates
some information (even for unoconv produces docs - should fix this)
Poppler (pdftocairo, pdfinfo) is used. http://poppler.freedesktop.org/
A working but uglified pdf.js integration exists, which is enabled by
setting pdf.pdf_js=true mediagoblin_local.ini (disabled in mediagoblin.ini)
Adds one test to the test_submission test suite, and another separate test_pdf suite.
The tests are only run if media_types.pdf.processing.check_prerequisites passes, so
the test suite will not require any extra package.
TODO: make test suite say 'skipped' in that case instead of just 'ok'
Signed-off-by: Alon Levy <alon@pobox.com>
Diffstat (limited to 'mediagoblin/templates')
-rw-r--r-- | mediagoblin/templates/mediagoblin/base.html | 5 | ||||
-rw-r--r-- | mediagoblin/templates/mediagoblin/media_displays/pdf.html | 284 |
2 files changed, 288 insertions, 1 deletions
diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 66b95661..9c42a756 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -16,7 +16,10 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -#} <!doctype html> -<html> +<html +{% block mediagoblin_html_tag %} +{% endblock mediagoblin_html_tag %} +> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> diff --git a/mediagoblin/templates/mediagoblin/media_displays/pdf.html b/mediagoblin/templates/mediagoblin/media_displays/pdf.html new file mode 100644 index 00000000..35a61872 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/media_displays/pdf.html @@ -0,0 +1,284 @@ +{# +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +#} + +{% extends 'mediagoblin/user_pages/media.html' %} + +{% set medium_view = request.app.public_store.file_url( + media.media_files['medium']) %} + +{% if 'pdf' in media.media_files %} + {% set pdf_view = request.app.public_store.file_url( + media.media_files['pdf']) %} +{% else %} + {% set pdf_view = request.app.public_store.file_url( + media.media_files['original']) %} +{% endif %} + +{% set pdf_js = global_config.get('media_type:mediagoblin.media_types.pdf', {}).get('pdf_js', False) %} + +{% if pdf_js %} + {% block mediagoblin_html_tag %} + dir="ltr" mozdisallowselectionprint moznomarginboxes + {% endblock mediagoblin_html_tag %} +{% endif %} + +{% block mediagoblin_head -%} + {{ super() }} + + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> + +{% if pdf_js %} + <link rel="stylesheet" href="{{ request.staticdirect('/css/pdf_viewer.css') }}"/> + {# <link rel="resource" type="application/l10n" href="locale/locale.properties"/> #} + + <script type="text/javascript"> + var DEFAULT_URL = '{{ pdf_view }}'; + </script> + + {# TODO: include compatibility only if this is not either chrome or firefox #} + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/web/compatibility.js') }}"></script> + + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/external/webL10n/l10n.js') }}"></script> + + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/core.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/util.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/api.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/metadata.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/canvas.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/obj.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/function.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/charsets.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/cidmaps.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/colorspace.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/crypto.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/evaluator.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/fonts.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/glyphlist.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/image.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/metrics.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/parser.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/pattern.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/stream.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/worker.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/external/jpgjs/jpg.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/jpx.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/jbig2.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/src/bidi.js') }}"></script> + <script type="text/javascript">PDFJS.workerSrc = '{{ request.staticdirect('/extlib/pdf.js/src/worker_loader.js') }}';</script> + + <script type="text/javascript" src="{{ request.staticdirect('/extlib/pdf.js/web/debugger.js') }}"></script> + <script type="text/javascript" src="{{ request.staticdirect('/js/pdf_viewer.js') }}"></script> +{% endif %} + +{%- endblock %} + +{% block mediagoblin_media %} +{% if pdf_js %} + <div id="outerContainer"> + + <div id="sidebarContainer"> + <div id="toolbarSidebar"> + <div class="splitToolbarButton toggled"> + <button id="viewThumbnail" class="toolbarButton group toggled" title="Show Thumbnails" tabindex="2" data-l10n-id="thumbs"> + <span data-l10n-id="thumbs_label">Thumbnails</span> + </button> + <button id="viewOutline" class="toolbarButton group" title="Show Document Outline" tabindex="3" data-l10n-id="outline"> + <span data-l10n-id="outline_label">Document Outline</span> + </button> + </div> + </div> + <div id="sidebarContent"> + <div id="thumbnailView"> + </div> + <div id="outlineView" class="hidden"> + </div> + </div> + </div> <!-- sidebarContainer --> + + <div id="mainContainer"> + <div class="findbar hidden doorHanger hiddenSmallView" id="findbar"> + <label for="findInput" class="toolbarLabel" data-l10n-id="find_label">Find:</label> + <input id="findInput" class="toolbarField" tabindex="21"> + <div class="splitToolbarButton"> + <button class="toolbarButton findPrevious" title="" id="findPrevious" tabindex="22" 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="23" 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="24" data-l10n-id="find_highlight">Highlight all</label> + <input type="checkbox" id="findMatchCase" class="toolbarField"> + <label for="findMatchCase" class="toolbarLabel" tabindex="25" data-l10n-id="find_match_case_label">Match case</label> + <span id="findMsg" class="toolbarLabel"></span> + </div> + <div class="toolbar"> + <div id="toolbarContainer"> + <div id="toolbarViewer"> + <div id="toolbarViewerLeft"> + <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="4" data-l10n-id="toggle_sidebar"> + <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span> + </button> + <div class="toolbarButtonSpacer"></div> + <button id="viewFind" class="toolbarButton group hiddenSmallView" title="Find in Document" tabindex="5" data-l10n-id="findbar"> + <span data-l10n-id="findbar_label">Find</span> + </button> + <div class="splitToolbarButton"> + <button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="6" 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="7" 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="8"> + </input> + <span id="numPages" class="toolbarLabel"></span> + </div> + <div id="toolbarViewerRight"> + <input id="fileInput" class="fileInput" type="file" oncontextmenu="return false;" style="visibility: hidden; position: fixed; right: 0; top: 0" /> + + <button id="fullscreen" class="toolbarButton fullscreen hiddenSmallView" title="Switch to Presentation Mode" tabindex="12" data-l10n-id="presentation_mode"> + <span data-l10n-id="presentation_mode_label">Presentation Mode</span> + </button> + + <button id="openFile" class="toolbarButton openFile hiddenSmallView" title="Open File" tabindex="13" data-l10n-id="open_file"> + <span data-l10n-id="open_file_label">Open</span> + </button> + + <button id="print" class="toolbarButton print" title="Print" tabindex="14" data-l10n-id="print"> + <span data-l10n-id="print_label">Print</span> + </button> + + <button id="download" class="toolbarButton download" title="Download" tabindex="15" data-l10n-id="download"> + <span data-l10n-id="download_label">Download</span> + </button> + <!-- <div class="toolbarButtonSpacer"></div> --> + <a href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" title="Current view (copy or open in new window)" tabindex="16" data-l10n-id="bookmark"><span data-l10n-id="bookmark_label">Current View</span></a> + </div> + <div class="outerCenter"> + <div class="innerCenter" id="toolbarViewerMiddle"> + <div class="splitToolbarButton"> + <button class="toolbarButton zoomOut" id="zoom_out" title="Zoom Out" tabindex="9" data-l10n-id="zoom_out"> + <span data-l10n-id="zoom_out_label">Zoom Out</span> + </button> + <div class="splitToolbarButtonSeparator"></div> + <button class="toolbarButton zoomIn" id="zoom_in" title="Zoom In" tabindex="10" 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" oncontextmenu="return false;" tabindex="11" data-l10n-id="zoom"> + <option id="pageAutoOption" value="auto" selected="selected" data-l10n-id="page_scale_auto">Automatic Zoom</option> + <option id="pageActualOption" value="page-actual" data-l10n-id="page_scale_actual">Actual Size</option> + <option id="pageFitOption" value="page-fit" data-l10n-id="page_scale_fit">Fit Page</option> + <option id="pageWidthOption" value="page-width" data-l10n-id="page_scale_width">Full Width</option> + <option id="customScaleOption" value="custom"></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> + </div> + </div> + + <menu type="context" id="viewerContextMenu"> + <menuitem label="First Page" id="first_page" + data-l10n-id="first_page" ></menuitem> + <menuitem label="Last Page" id="last_page" + data-l10n-id="last_page" ></menuitem> + <menuitem label="Rotate Counter-Clockwise" id="page_rotate_ccw" + data-l10n-id="page_rotate_ccw" ></menuitem> + <menuitem label="Rotate Clockwise" id="page_rotate_cw" + data-l10n-id="page_rotate_cw" ></menuitem> + </menu> + + <div id="viewerContainer" tabindex="1"> + <div id="viewer" contextmenu="viewerContextMenu"></div> + </div> + + <div id="loadingBox"> + <div id="loading"></div> + <div id="loadingBar"><div class="progress"></div></div> + </div> + + <div id="errorWrapper" hidden='true'> + <div id="errorMessageLeft"> + <span id="errorMessage"></span> + <button id="errorShowMore" onclick="" oncontextmenu="return false;" data-l10n-id="error_more_info"> + More Information + </button> + <button id="errorShowLess" onclick="" oncontextmenu="return false;" data-l10n-id="error_less_info" hidden='true'> + Less Information + </button> + </div> + <div id="errorMessageRight"> + <button id="errorClose" oncontextmenu="return false;" data-l10n-id="error_close"> + Close + </button> + </div> + <div class="clearBoth"></div> + <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea> + </div> + </div> <!-- mainContainer --> + + </div> <!-- outerContainer --> + <div id="printContainer"></div> + +{% else %} + <a href="{{ pdf_view }}"> + <img id="medium" + class="media_image" + src="{{ medium_view }}" + alt="{% trans media_title=media.title -%} Image for {{ media_title}}{% endtrans %}"/> + </a> +{% endif %} +{% endblock %} + +{% block mediagoblin_sidebar %} + <h3>{% trans %}Download{% endtrans %}</h3> + <ul> + {% if 'original' in media.media_files %} + <li> + <a href="{{ request.app.public_store.file_url( + media.media_files.original) }}"> + {%- trans %}Original file{% endtrans -%} + </a> + </li> + {% endif %} + {% if 'pdf' in media.media_files %} + <li> + <a href="{{ request.app.public_store.file_url( + media.media_files.pdf) }}"> + {%- trans %}PDF file{% endtrans -%} + </a> + </li> + {% endif %} + </ul> +{% endblock %} |