PHP / पर्ल के माध्यम से उपयोगकर्ताओं के ब्राउज़र में एक पीडीएफ फाइल दिखाएं


121

मैं अपने उपयोगकर्ताओं को पीडीएफ फाइलें दिखाना चाहता हूं। कारण है कि मैं पीडीएफ दिखाने के लिए सीजीआई का उपयोग करता हूं क्या मैं पीडीएफ के लिए क्लिकों को ट्रैक करना चाहता हूं, और सहेजे गए पीडीएफ के वास्तविक स्थान को क्लॉक करना चाहता हूं।

मैं इंटरनेट पर खोज कर रहा हूं और केवल पाया गया कि उपयोगकर्ताओं को सेव डायलॉग कैसे दिखाएं और एक पीडीएफ बनाएं, उपयोगकर्ताओं को फाइलें न दिखाएं।

जो मैं चाहता था, वह उपयोगकर्ताओं को मेरी पीडीएफ फाइलें दिखाने के लिए है, पीडीएफ बनाने या डाउनलोड करने के लिए नहीं । यहाँ मुझे आधिकारिक php प्रलेखन मिला है:

<?php
header('Content-type: application/pdf');
readfile('the.pdf');
?>

इसके अलावा मेरा Google-खोज-परिणाम पर्ल कोड:

open(PDF, "the.pdf") or die "could not open PDF [$!]";
binmode PDF;
my $output = do { local $/; <PDF> };
close (PDF);

print "Content-Type: application/pdf\n";
print "Content-Length: " .length($output) . "\n\n";
print $output

यदि आप इसे रूबी पर करते हैं, तो कृपया मुझे कहें। लेकिन मुझे यकीन नहीं है कि अगर मेरा सर्वर रेल का समर्थन करता है।

क्षमा करें यदि मेरा कोड पीडीएफ को दिखाने के लिए विधि से बहुत दूर है, क्योंकि मुझे पीडीएफ प्रसंस्करण के बारे में कुछ भी नहीं पता है और इस समस्या को कैसे लागू किया जाए।

यह मान लें कि उपयोगकर्ताओं के पास Adobe Reader प्लग-इन है। तो, मेरी समस्या को कैसे ठीक करें?

संपादित करें : मैं सादे पीडीएफ फाइल दिखाना चाहता हूं। मेरा प्राथमिक उद्देश्य: मेरी पीडीएफ फाइलों को ट्रैक करें और कुछ फैंसी यूआरएल का उपयोग करें।

संपादित करें : यहाँ मेरा मुख्य php कोड है:

<?php
$file='/files/the.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="the.pdf"');
@readfile($file);
?>

संपादित करें : अब कोड काम कर रहा है। लेकिन लोडिंग प्रगति बार (एडोब रीडर एक्स प्लगइन पर) दिखाई नहीं देता है। क्यों? कोई मुझे मदद कर सकता है? यहाँ मेरा मुख्य कोड है:

<?php
$file='./files/the.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="the.pdf"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
@readfile($file);
?>

संपादित करें : मेरी सभी समस्याओं का हल। यहाँ अंतिम कोड है:

<?php
$file = './path/to/the.pdf';
$filename = 'Custom file name for the.pdf'; /* Note: Always use .pdf at the end. */

header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Accept-Ranges: bytes');

@readfile($file);
?>

धन्यवाद! :)


4
"शो" केवल तभी संभव है जब ग्राहक के पास एक्रोबेट रीडर प्लग-इन स्थापित हो। अन्यथा, इसे हमेशा डाउनलोड फ़ाइल के रूप में परोसा जाएगा, इसके बारे में आप कुछ नहीं कर सकते। पीडीएफ का रास्ता देखना भी असंभव है, यह पता लगाना तुच्छ है। क्या करने की कोशिश कर रहे हैं? शायद कुछ विकल्प हैं यदि हम आपके लक्ष्यों के बारे में अधिक जानते हैं
Pekka

4
एडोब रीडर प्लगइन केवल तभी आवश्यक है जब आप एक ऐसे ब्राउज़र का उपयोग कर रहे हैं जो पीडीएफ को मूल रूप से नहीं संभालता है। यह भी, यदि पीडीएफ को PHP / पर्ल के माध्यम से ब्राउज़र में भेजा जाता है, तो वास्तविक पीडीएफ पथ को अस्पष्ट करना बहुत संभव है, या यहां तक ​​कि डॉक्रो के बाहर भी है, इसलिए यह सीधे पहुंच योग्य नहीं है।
स्टीफन

1
एडोब रीडर केवल तभी आवश्यक है जब उपयोगकर्ता एक ब्राउज़र का उपयोग कर रहा है जो पीडीएफ को मूल रूप से नहीं संभालता है ...
GolezTrol

@ यह वास्तविक पथ को अस्पष्ट करने के लिए निश्चित रूप से संभव है, लेकिन ओपी को लगता है कि चोरी को रोकने के लिए URL को अस्पष्ट करना है।
पेकाका

मान लेते हैं कि उपयोगकर्ताओं के पास एडोब रीडर प्लग-इन है। तो, मेरी समस्या को कैसे ठीक करें?
मंदराशि

जवाबों:


49

मुझे लगता है कि आप चाहते हैं कि PDF डाउनलोड करने के लिए मजबूर करने के बजाय ब्राउज़र में प्रदर्शित करे। यदि ऐसा है, तो Content-Dispositionहेडर को मान के साथ सेट करने का प्रयास करेंinline

यह भी याद रखें कि यह ब्राउज़र सेटिंग्स से भी प्रभावित होगा - कुछ ब्राउज़र हमेशा पीडीएफ फाइलों को डाउनलोड करने या उन्हें एक अलग एप्लिकेशन में खोलने के लिए कॉन्फ़िगर किया जा सकता है (उदाहरण के लिए Adobe Reader)


हाँ। लेकिन जब मैं आपके सुझाव का प्रयास कर रहा होता हूं, मुझे एक त्रुटि मिलती है, "फ़ाइल '% PDF-' से शुरू नहीं होती है।" मैं 'सामग्री-विवाद: इनलाइन; फ़ाइल नाम = "the.pdf" '। क्या मैंने गलती की है?
12

4
<; php शीर्ष लेख ('सामग्री-प्रकार: अनुप्रयोग / पीडीएफ'); शीर्ष लेख ('सामग्री-विवाद: इनलाइन; फ़ाइल नाम = "। पीडीएफ"'); readfile ( '/ dir / to / the.pdf'); ?>
डिमासनी

ऐसा लगता है कि यह एक मान्य पीडीएफ फाइल नहीं है?
स्टीफन

@Stephen जब मैं फ़ाइल के लिए सही खोलता हूं, तो यह काम करता है। लेकिन जब मैं इनलाइन सामग्री के उपयोग का उपयोग करता हूं, तो यह काम नहीं करता है।
मंदाशी

7
सुनने के लिए अच्छा है, और समाधान जानने के लिए बहुत अच्छा है! यह अच्छा होगा यदि आप अंतिम कोड दिखा सकते हैं कि आप किस हेडर को भेज रहे हैं, किसी और के लिए जो इस सवाल पर आता है।
स्टीफन

18
    $url ="https://yourFile.pdf";
    $content = file_get_contents($url);

    header('Content-Type: application/pdf');
    header('Content-Length: ' . strlen($content));
    header('Content-Disposition: inline; filename="YourFileName.pdf"');
    header('Cache-Control: private, max-age=0, must-revalidate');
    header('Pragma: public');
    ini_set('zlib.output_compression','0');

    die($content);

परीक्षण किया और ठीक काम करता है। यदि आप फ़ाइल को इसके बजाय डाउनलोड करना चाहते हैं, तो प्रतिस्थापित करें

    Content-Disposition: inline

साथ में

    Content-Disposition: attachment

आप संपीड़न बंद क्यों कर रहे हैं? ini_set ( 'zlib.output_compression', '0');
पहेली प्लस

क्योंकि zlib संपीड़न ob_gzhandler () के साथ काम नहीं करता है और यह एक पूर्ण स्क्रिप्ट के बजाय कोड का एक स्निपेट है। Ngnix php की तुलना में कम्प्रेशन को बेहतर तरीके से हैंडल करता है। अगर यह आपके ऐप और सर्वर सेटअप के अनुरूप है तो आप zlib का उपयोग कर सकते हैं।
करीम

4

आप एक पीडीएफ रेंडर को संशोधित कर सकते हैं जैसे कि xpdf या फिर अपने सर्वर पर ग्राफिक्स इमेज में रेंडर करने के लिए ई-मेल करें और फिर यूजर को इमेज डिलीवर करें। यह Google की पीडीएफ फाइलों के बारे में त्वरित दृष्टिकोण काम करता है, वे इसे स्थानीय रूप से प्रस्तुत करते हैं, फिर उपयोगकर्ता को चित्र वितरित करते हैं। कोई डाउनलोड की गई पीडीएफ फाइल, और स्रोत बहुत अच्छी तरह से अस्पष्ट है। :)


मूल दस्तावेज़ की चोरी को रोकने के लिए यह वास्तव में एकमात्र सुरक्षित तरीका है।
पेकाका

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

इसके अलावा, यह चोरी नहीं होगी, क्योंकि मूल अभी भी है।
स्वेन्ते

@ शेवेंट - मुझे संदेह है कि बौद्धिक संपदा के मालिक आपके तर्क से सहमत होंगे।
ashleedawg

@ यशलेग: मुझे शक है कि "बौद्धिक संपदा" है। यह केवल सूचना हैकिंग बनाने के लिए हैकिंग है, ऐसा लगता है कि न केवल एक वैध व्यवसाय मॉडल है, बल्कि यहां तक ​​कि जनता के लिए नवाचार की रक्षा के लिए भी सार्थक है।
श्वेन्ते जुएल

1

डाउनलोड के बजाय पीडीएफ डिस्प्ले करने का सबसे सुरक्षित तरीका एक तत्व objectया iframeतत्व का उपयोग करके इसे एम्बेड करना प्रतीत होता है। Google के PDF व्यूअर की तरह 3rd पार्टी समाधान भी हैं।

एक सिंहावलोकन के लिए HTML में एंबेड पीडीएफ के लिए सबसे अच्छा तरीका देखें ।

वहाँ भी है doPDF , एक जावा आधारित इन-ब्राउज़र PDF व्यूअर। मैं इसकी गुणवत्ता पर बात नहीं कर सकता लेकिन यह दिलचस्प लग रहा है।


0

आप http://www.fpdf.org पर उपलब्ध fpdf वर्ग का भी उपयोग कर सकते हैं । यह फाइल पर आउटपुट देने और ब्राउजर पर प्रदर्शित करने दोनों के लिए विकल्प देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.