2014-07-26 7 views
5

मैं ब्राउज़र पर प्रदर्शित सामग्री के साथ पीडीएफ फ़ाइल का पूरा पथ प्रदर्शित करना चाहता हूं। मेरी स्क्रिप्ट में एक इनपुट एचटीएमएल है, जहां उपयोगकर्ता फाइल का नाम इनपुट करेगा और फॉर्म जमा करेगा। स्क्रिप्ट फ़ाइल की खोज करेगी, अगर उपनिर्देशिका में पाई जाती है तो फाइल सामग्री को ब्राउज़र में आउटपुट करेगा और उसका नाम भी प्रदर्शित करेगा। मैं सामग्रियों को प्रदर्शित करने में सक्षम हूं लेकिन पूर्ण जुर्माना नाम भी एक साथ प्रदर्शित करने में असमर्थ हूं या यदि मैं फ़ाइल नाम प्रदर्शित करता हूं तो मुझे सामग्री के लिए कचरा चरित्र प्रदर्शन मिलता है। कृपया गाइड करें।सीजीआई पायथन लिपि का उपयोग कर पीडीएफ फ़ाइल सामग्री के साथ-साथ ब्राउजर में इसका पूरा नाम कैसे प्रदर्शित करें?

enter link description here

स्क्रिप्ट 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 

html फ़ाइल नाम के लिए सिर्फ 1 इनपुट क्षेत्र के साथ एक नियमित एचटीएमएल है।

उत्तर

4

यह संभव नहीं है। कम से कम इतना आसान नहीं है। कुछ वेब ब्राउज़र पीडीएफ प्रदर्शित नहीं करते हैं लेकिन उपयोगकर्ता को फ़ाइल डाउनलोड करने के लिए कहते हैं, कुछ स्वयं उन्हें प्रदर्शित करते हैं, कुछ बाहरी पीडीएफ व्यूअर घटक एम्बेड करते हैं, कुछ बाहरी पीडीएफ व्यूअर शुरू करते हैं। HTML में पीडीएफ एम्बेड करने के लिए कोई मानक, क्रॉस ब्राउज़र तरीका नहीं है, यदि आप मनमाने ढंग से पाठ और पीडीएफ सामग्री प्रदर्शित करना चाहते हैं तो इसकी आवश्यकता होगी।

प्रत्येक ब्राउज़र पर काम करने वाला एक फ़ॉलबैक समाधान, सर्वर पर पीडीएफ पेजों को छवियों के रूप में प्रस्तुत करेगा और क्लाइंट को उनकी सेवा करेगा। यह सर्वर पर कुछ तनाव डालता है (प्रोसेसर, मेमोरी/डिस्क कैशिंग, बैंडविड्थ के लिए डिस्क)।

कुछ आधुनिक, HTML5 सक्षम ब्राउज़र एक कैनवास तत्व पर Mozilla's pdf.js के साथ पीडीएफ प्रस्तुत कर सकते हैं।

अन्य के लिए आप <embed>/<object>described on Adobe's The PDF Developer Junkie Blog Adobe की प्लगइन का उपयोग करने के लिए इस्तेमाल करने की कोशिश कर सकता है।


सर्वर

प्रतिपादन और छवियों के रूप में पीडीएफ पृष्ठ दिखाने पर पृष्ठों प्रतिपादन पृष्ठों की संख्या क्वेरी करने के लिए और निकालने और छवि के रूप में दिए गए पृष्ठ प्रस्तुत करने के लिए सर्वर पर कुछ सॉफ्टवेयर की जरूरत है।

पृष्ठों की संख्या xpdf या libpoppler कमांड लाइन उपयोगिताओं से pdfinfo कार्यक्रम के साथ निर्धारित किया जा सकता। पीडीएफ फ़ाइल से जेपीजी छवि में एक पेज को कनवर्ट करना छविमैजिक टूल्स से convert के साथ किया जा सकता है। एक बहुत ही सरल सीजीआई इन कार्यक्रमों का उपयोग कर कार्यक्रम:

#!/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() 

libpoppler के लिए पाइथन बाइंडिंग नहीं है, इसलिए बाहरी pdfinfo कार्यक्रम के लिए कॉल कि मॉड्यूल के साथ काफी आसानी से बदला जा सकता है। इसका उपयोग पीडीएफ पृष्ठों पर लिंक जैसे पृष्ठों के लिए एचटीएमएल छवि मानचित्र बनाने के लिए अधिक जानकारी निकालने के लिए भी किया जा सकता है। libcairo पायथन बाइंडिंग स्थापित करने के साथ बाहरी प्रक्रिया के बिना किसी पृष्ठ को प्रस्तुत करना भी संभव हो सकता है।

+0

क्या आप एक वैकल्पिक समाधान सुझा सकते हैं जहां इसे हासिल किया जा सकता है? – user956424

+0

@ user956424 मैंने जवाब के कुछ समाधान जोड़े हैं। – BlackJack

+0

http://stackoverflow.com/users/3815611/blackjack मैं इसे सीजीआई, पायथन अकेले का उपयोग करके प्राप्त करना चाहता हूं..नो जेएस – user956424

संबंधित मुद्दे