2014-07-26 14 views
5

Ich möchte den vollständigen Pfad der PDF-Datei zusammen mit ihren im Browser angezeigten Inhalten anzeigen. Mein Skript hat ein Eingabe-HTML, wo der Benutzer den Dateinamen eingibt und das Formular abschickt. Das Skript sucht nach der Datei, wenn sie in den Unterverzeichnissen gefunden wird, gibt sie den Inhalt der Datei in den Browser aus und zeigt auch ihren Namen an. Ich bin in der Lage, den Inhalt anzuzeigen, aber nicht in der Lage, den vollen feinen Namen auch gleichzeitig anzuzeigen. Oder, wenn ich den Dateinamen zeige, bekomme ich Müllzeichenanzeige für den Inhalt. Bitte führen.Wie wird der PDF-Dateiinhalt sowie der vollständige Name im Browser mit dem CGI-Python-Skript angezeigt?

enter link description here

Skript a.py:

import os 
import cgi 
import cgitb 
cgitb.enable() 
import sys 
import webbrowser 

def check_file_extension(display_file): 
    input_file = display_file 
    nm,file_extension = os.path.splitext(display_file) 
    return file_extension 

form = cgi.FieldStorage() 

type_of_file ='' 
file_nm = '' 
nm ='' 
not_found = 3 

if form.has_key("file1"): 
    file_nm = form["file1"].value 

type_of_file = check_file_extension(file_nm) 

pdf_paths = [ '/home/nancy/Documents/',] 

# Change the path while executing on the server , else it will throw error 500 
image_paths = [ '/home/nancy/Documents/'] 


if type_of_file == '.pdf': 
    search_paths = pdf_paths 
else: 
    # .jpg 
    search_paths = image_paths 
for path in search_paths: 
    for root, dirnames, filenames in os.walk(path): 
     for f in filenames: 
      if f == str(file_nm).strip(): 
       absolute_path_of_file = os.path.join(root,f) 
       # print 'Content-type: text/html\n\n' 
       # print '<html><head></head><body>' 
       # print absolute_path_of_file 
       # print '</body></html>' 
#     print """Content-type: text/html\n\n 
# <html><head>absolute_path_of_file</head><body> 
# <img src=file_display.py /> 
# </body></html>""" 
       not_found = 2 
       if search_paths == pdf_paths: 
        print 'Content-type: application/pdf\n' 
       else: 
        print 'Content-type: image/jpg\n' 
       file_read = file(absolute_path_of_file,'rb').read() 
       print file_read 
       print 'Content-type: text/html\n\n' 
       print absolute_path_of_file 
       break 
     break 
    break 

if not_found == 3: 
    print 'Content-type: text/html\n' 
    print '%s not found' % absolute_path_of_file 

Die html ist eine regelmäßige html mit nur 1 Eingabefeld für Dateinamen.

Antwort

4

Es ist nicht möglich. Zumindest nicht so einfach. Einige Webbrowser zeigen keine PDFs an, sondern bitten den Benutzer, die Datei herunterzuladen, einige zeigen sie selbst an, einige betten eine externe PDF-Viewer-Komponente ein, andere starten einen externen PDF-Viewer. Es gibt keine browserübergreifende Standardmethode zum Einbetten von PDF in HTML, die benötigt wird, wenn Sie den PDF-Inhalt als beliebigen Text und anzeigen möchten.

Eine Ausweichlösung, die in jedem Browser funktioniert, würde die PDF-Seiten auf dem Server als Bilder rendern und diese an den Client liefern. Dies belastet den Server (Prozessor, Speicher/Festplatte für Caching, Bandbreite).

Einige moderne HTML5-fähige Browser können PDFs mit Mozilla's pdf.js auf einem Canvas-Element darstellen.

Für andere können Sie versuchen, <embed>/<object> zu verwenden, um das Plugin von Adobe als described on Adobe's The PDF Developer Junkie Blog zu verwenden.


Rendering der Seiten auf dem Server

Rendering und dazu dient, die PDF-Seiten als Bilder benötigen einige Software auf dem Server die Anzahl der Seiten abzufragen und eine bestimmte Seite als Bild zu extrahieren und rendern.

Die Anzahl der Seiten kann mit dem Programm von pdfinfoXpdf oder die libpoppler Befehlszeilenprogrammen bestimmt werden. Das Konvertieren einer Seite aus der PDF-Datei in ein JPG-Bild kann mit convert aus den ImageMagick-Tools erfolgen. Ein sehr einfaches CGI-Programm mit Hilfe dieser Programme:

#!/usr/bin/env python 
import cgi 
import cgitb; cgitb.enable() 
import os 
from itertools import imap 
from subprocess import check_output 

PDFINFO = '/usr/bin/pdfinfo' 
CONVERT = '/usr/bin/convert' 
DOC_ROOT = '/home/bj/Documents' 

BASE_TEMPLATE = (
    'Content-type: text/html\n\n' 
    '<html><head><title>{title}</title></head><body>{body}</body></html>' 
) 
PDF_PAGE_TEMPLATE = (
    '<h1>{filename}</h1>' 
    '<p>{prev_link} {page}/{page_count} {next_link}</p>' 
    '<p><img src="{image_url}" style="border: solid thin gray;"></p>' 
) 

SCRIPT_NAME = os.environ['SCRIPT_NAME'] 


def create_page_url(filename, page_number, type_): 
    return '{0}?file={1}&page={2}&type={3}'.format(
     cgi.escape(SCRIPT_NAME, True), 
     cgi.escape(filename, True), 
     page_number, 
     type_ 
    ) 


def create_page_link(text, filename, page_number): 
    text = cgi.escape(text) 
    if page_number is None: 
     return '<span style="color: gray;">{0}</span>'.format(text) 
    else: 
     return '<a href="{0}">{1}</a>'.format(
      create_page_url(filename, page_number, 'html'), text 
     ) 


def get_page_count(filename): 

    def parse_line(line): 
     key, _, value = line.partition(':') 
     return key, value.strip() 

    info = dict(
     imap(parse_line, check_output([PDFINFO, filename]).splitlines()) 
    ) 
    return int(info['Pages']) 


def get_page(filename, page_index): 
    return check_output(
     [ 
      CONVERT, 
      '-density', '96', 
      '{0}[{1}]'.format(filename, page_index), 
      'jpg:-' 
     ] 
    ) 


def send_error(message): 
    print BASE_TEMPLATE.format(
     title='Error', body='<h1>Error</h1>{0}'.format(message) 
    ) 


def send_page_html(_pdf_path, filename, page_number, page_count): 
    body = PDF_PAGE_TEMPLATE.format(
     filename=cgi.escape(filename), 
     page=page_number, 
     page_count=page_count, 
     image_url=create_page_url(filename, page_number, 'jpg'), 
     prev_link=create_page_link(
      '<<', filename, page_number - 1 if page_number > 1 else None 
     ), 
     next_link=create_page_link(
      '>>', 
      filename, 
      page_number + 1 if page_number < page_count else None 
     ) 
    ) 
    print BASE_TEMPLATE.format(title='PDF', body=body) 


def send_page_image(pdf_path, _filename, page_number, _page_count): 
    image_data = get_page(pdf_path, page_number - 1) 
    print 'Content-type: image/jpg' 
    print 'Content-Length:', len(image_data) 
    print 
    print image_data 


TYPE2SEND_FUNCTION = { 
    'html': send_page_html, 
    'jpg': send_page_image, 
} 


def main(): 
    form = cgi.FieldStorage() 
    filename = form.getfirst('file') 
    page_number = int(form.getfirst('page', 1)) 
    type_ = form.getfirst('type', 'html') 

    pdf_path = os.path.abspath(os.path.join(DOC_ROOT, filename)) 
    if os.path.exists(pdf_path) and pdf_path.startswith(DOC_ROOT): 
     page_count = get_page_count(pdf_path) 
     page_number = min(max(1, page_number), page_count) 
     TYPE2SEND_FUNCTION[type_](pdf_path, filename, page_number, page_count) 
    else: 
     send_error(
      '<p>PDF file <em>{0!r}</em> not found.</p>'.format(
       cgi.escape(filename) 
      ) 
     ) 


main() 

Es gibt Python-Bindings für libpoppler, so der Aufruf an das externe pdfinfo Programm könnte ganz einfach mit diesem Modul ersetzt werden. Es kann auch verwendet werden, um mehr Informationen für die Seiten wie Links auf den PDF-Seiten zu extrahieren, um HTML-Image-Maps für sie zu erstellen. Mit den installierten libcairo Python-Bindungen ist es sogar möglich, das Rendern einer Seite ohne einen externen Prozess durchzuführen.

+0

Können Sie eine alternative Lösung vorschlagen, wo dies erreicht werden kann? – user956424

+0

@ user956424 Ich habe einige Antworten auf die Antwort hinzugefügt. – BlackJack

+0

http://stackoverflow.com/users/3815611/blackjack Ich möchte dies mit CGI, Python alone..no js erreichen – user956424