2013-06-04 10 views
19

पर प्रस्तुत करना PhantomJS's पीडीएफ क्षमताओं को प्रतिपादित करना संभव है जब फैंटॉमजेएस सेलेनियम और पायथन के संयोजन में उपयोग किया जा रहा है? (यानी मीनिक page.render('file.pdf') सेलेनियम के माध्यम से पायथन के अंदर व्यवहार)।पायथन + सेलेनियम + फैंटॉमजेएस पीडीएफ

मुझे एहसास है कि यह GhostDriver का उपयोग करता है, और GhostDriver वास्तव में प्रिंटिंग के तरीके में बहुत अधिक समर्थन नहीं करता है।

यदि सेलेनियम नहीं है तो दूसरा विकल्प संभव है, मैं सभी कान हूं।

+0

क्या आपने Pypdf2 को देखा है? http://www.blog.pythonlibrary.org/tag/python-pdf-series/ – Amit

+0

@ प्रवेश: बल्कि बड़े पैमाने पर, क्योंकि मैं इसे हर समय उपयोग करता हूं। यहां तक ​​कि फसीट ने खुद कहा है कि "पीईपीडीएफ 2 को एचटीएमएल का कोई ज्ञान नहीं है"। यह किसी भी एचटीएमएल विश्वसनीय रूप से प्रस्तुत नहीं करेगा। – Rejected

+0

@ अस्वीकृत क्या आपको परीक्षण के दौरान सटीक स्थिति में होने वाले स्क्रीनशॉट की आवश्यकता है? या आप सिर्फ एक पेज लोड करना चाहते हैं और पीडीएफ में प्रस्तुत करना चाहते हैं? –

उत्तर

1

आप selenium.selenium.capture_screenshot('file.png') का उपयोग कर सकते हैं, लेकिन यह आपको एक पीजीएफ के रूप में एक पीएनजी के रूप में एक स्क्रीन शॉट देगा। एक पीडीएफ के रूप में एक स्क्रीनशॉट पाने का एक तरीका प्रतीत नहीं होता है। http://selenium.googlecode.com/git/docs/api/py/selenium/selenium.selenium.html?highlight=screenshot#selenium.selenium.selenium.capture_screenshot

+1

पीडीएफ एक महत्वपूर्ण कारक है। मैं कई कारणों से टेक्स्ट छवि, फॉर्म, एम्बेडेड मीडिया इत्यादि के लिए एक साधारण छवि पर नहीं जा सकता। – Rejected

1

की कोशिश की pdfkit:

यहाँ capture_screenshot के लिये दस्तावेज हैं? यह एचटीएमएल पृष्ठों से पीडीएफ फाइलें प्रस्तुत कर सकता है।

+0

मैंने इसे भी देखा है। पीडीएफकिट एचटीएमएल -> पीडीएफ को परिवर्तित करता है, लेकिन इसमें कोई और कार्यक्षमता नहीं है। यह निर्धारित करने के लिए सामग्री विश्लेषण कि किसी पृष्ठ में पीडीएफ से पहले वांछित सामग्री शामिल है, दुख की बात नहीं है। – Rejected

+0

हाँ, मुझे पीडीएफकिट के साथ एक ही समस्या है, मैं एक जेएस ढांचे के साथ इसका उपयोग कर अधिक उन्नत प्रतिपादन करना चाहता हूं, काफी परेशानी है .. :( – moodh

+0

"यह निर्धारित करने के लिए सामग्री विश्लेषण कि किसी पृष्ठ में वांछित सामग्री है या नहीं" - > ठीक है, क्या आप सामग्री विश्लेषण स्वयं नहीं कर सकते हैं और यदि यह मेल खाता है तो आप इसे पीडीएफकिट के साथ प्रस्तुत करने के लिए भेज सकते हैं। इस तरह मैं इसे करूँगा। – Jonathan

0

@rejected, मुझे पता है तुम subprocesses उपयोग करने के लिए नहीं चाहते उल्लेख है, लेकिन ...

आप वास्तव में उपप्रक्रिया संचार से अधिक आप प्रत्याशित लाभ उठाने के लिए सक्षम हो सकता है। सैद्धांतिक रूप से, आप Ariya's stdin/stdout example ले सकते हैं और इसे अपेक्षाकृत जेनेरिक रैपर स्क्रिप्ट के रूप में बढ़ा सकते हैं। यह पहले लोड करने के लिए एक पृष्ठ स्वीकार कर सकता है, फिर उस पृष्ठ पर अपने परीक्षण कार्यों (& निष्पादित) के लिए सुनो। अंततः, आप .render शुरू या यहाँ तक कि त्रुटि से निपटने के लिए एक सामान्य कब्जा कर सकता है:

try { 
    // load page & execute stdin commands 
} catch (e) { 
    page.render(page + '-error-state.pdf'); 
} 
+0

स्टडीन के माध्यम से प्राप्त कोड को निष्पादित करने के लिए 'eval' के माध्यम से किया जाना चाहिए, और ऐसा करने की कोशिश करने के अपने अनुभवों से, यह दोनों की जरूरत है इलाज और अविश्वसनीय। जब तक मैं गलत नहीं हूँ? – Rejected

+0

जबकि आप अपने इनपुट (एक विश्वसनीयता परिप्रेक्ष्य से) से सावधान रहना चाहते हैं, तो आपको शायद प्रक्रिया के बारे में चिंता करने की आवश्यकता नहीं होगी (मुझे लगता है) आप इस प्रक्रिया के स्वामी हैं। –

+0

अप्रत्याशित त्रुटियों पर तेज़ी से फेंकने के लिए आप विशिष्ट आदेशों आदि को श्वेत-सूची भी कर सकते हैं। हालांकि, सबसे अच्छा परिदृश्य मैं कल्पना करता हूं कि आप अपने परीक्षण (या अन्य तर्क) निकालते हैं जो एक अलग .js फ़ाइल में स्क्रीन कैप्चर करने से पहले हो सकता है और उसे पृष्ठ में लोड कर सकता है (http://phantomjs.org/api/phantom/ विधि/इंजेक्षन-js.html)। आपके पास पाइथन को अधिकतम फ़ाइल जेएस लोड करने के लिए अधिकतम पास पर एक तर्क हो सकता है। –

8

यहाँ एक समाधान GhostDriver के लिए सेलेनियम और विशेष आदेश का उपयोग है (यह GhostDriver 1.1.0 और बाद PhantomJS 1.9 काम करना चाहिए। 6, PhantomJS 1.9.8) के साथ परीक्षण किया:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

"""Download a webpage as a PDF.""" 


from selenium import webdriver 


def download(driver, target_path): 
    """Download the currently displayed page to target_path.""" 
    def execute(script, args): 
     driver.execute('executePhantomScript', 
         {'script': script, 'args': args}) 

    # hack while the python interface lags 
    driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute') 
    # set page format 
    # inside the execution script, webpage is "this" 
    page_format = 'this.paperSize = {format: "A4", orientation: "portrait" };' 
    execute(page_format, []) 

    # render current page 
    render = '''this.render("{}")'''.format(target_path) 
    execute(render, []) 


if __name__ == '__main__': 
    driver = webdriver.PhantomJS('phantomjs') 
    driver.get('http://stackoverflow.com') 
    download(driver, "save_me.pdf") 

भी एक ही सवाल here को मेरा उत्तर देखें।

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