2009-04-30 11 views
6

हमारे पास एक ऐसा फॉर्म है जो WebBrowser नियंत्रण होस्ट करता है। यह फ़ॉर्म पर एकमात्र नियंत्रण है।WinForms में IE 8 होस्टिंग और एक पीडीएफ खोलना

हम प्रपत्र एक अस्थायी पीडीएफ फाइल की फ़ाइल पथ गुजरती हैं और यह करता है:

WebBrowser1.Hide() 
WebBrowser1.Navigate("about:blank") 

Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete 
    Application.DoEvents() 
    System.Threading.Thread.Sleep(50) 
Loop 

एक बार:

WebBrowser1.Navigate(Me._PathToPdf) 

जब प्रपत्र बंद हो रहा है, यह पीडीएफ फाइल से चला फॉर्म बंद है, कॉलिंग क्लास फिर अस्थायी पीडीएफ फ़ाइल हटा देता है।

यह प्रक्रिया बहुत अच्छी तरह से काम करती है ... जब तक हम इंटरनेट एक्सप्लोरर 8 स्थापित नहीं करते हैं। किसी कारण से, IE8 और Adobe Acrobat 8 ​​(या 9) का संयोजन अस्थायी पीडीएफ फ़ाइल पर एक अतिरिक्त फ़ाइल लॉक हैंडल को रखा जाता है। अतिरिक्त लॉक हैंडल तब तक नहीं जाता जब तक कि पूरा एप्लिकेशन बंद न हो जाए। मुझे यह भी जिक्र करना चाहिए कि फाइल पर कोई तालाब नहीं है जब तक कि एक्रोबैट द्वारा फ़ाइल खोला नहीं जाता है।

हम इसे कई मशीनों पर पुन: पेश कर सकते हैं और यह हमेशा आईई 8 और एडोब एक्रोबैट रीडर का संयोजन होता है। हम एडोब एक्रोबैट के बजाय फॉक्सिट रीडर 3 स्थापित कर सकते हैं और चीजें ठीक काम करती हैं। इसी प्रकार, हम आईई 7 और एडोब एक्रोबैट के साथ एक मशीन पर ऐप चला सकते हैं, और चीजें ठीक काम करती हैं। लेकिन, जब आप आईई 8 और एक्रोबैट की जादू औषधि को मिलाते हैं, तो आप एक गड़बड़ी के साथ खत्म हो जाते हैं।

क्या कोई मुझे बता सकता है कि मुझे एक अतिरिक्त फ़ाइल लॉक क्यों मिल रहा है जो एप्लिकेशन के अंत तक जारी रहता है?

धन्यवाद।

एक उदाहरण अनुप्रयोग है कि मेरी समस्या को दर्शाता है यहां पाया जा सकता: PDFLockProblemDemo.zip

+0

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

उत्तर

1

मुझे लगता है कि वास्तविक समस्याएं WebBrowser नियंत्रण का उपयोग कर रही हैं ताकि पीडीएफ प्रदर्शित करने के लिए एडोब रीडर वेब ब्राउज़र प्लगइन होस्ट किया जा सके। वेब ब्राउजर पर निर्भरता पेश किए बिना सीधे पीडीएफ प्रदर्शित करने का कोई बेहतर तरीका नहीं है? क्या एडोब एक एसडीके या एक ActiveX नियंत्रण प्रदान नहीं करता है जिसे आप सीधे अपने फॉर्म के अंदर होस्ट कर सकते हैं?


अद्यतन: मैं चारों ओर देखा और this post जहां वे एक एडोब ActiveX नियंत्रण (AxAcroPDFLib.AxAcroPDF) और केवल फोन का उपयोग पाया:

axAcroPDF1.LoadFile("mypdf.pdf"); 
axAcroPDF1.Show(); 
+1

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

1

फिर भी कोई समाधान नहीं पाया है, लेकिन और अधिक जानकारी: पहले मैं के साथ XP प्रो, एक्रोबेट * .x और .NET 2.0 (के साथ बनाया का परीक्षण किया था वीएस 2005)। तब से, मैंने विभिन्न परिदृश्यों में भी परीक्षण किया है जिनमें Vista, Acrobat 9.x और .NET 3.5 (VS 2008 के साथ बनाया गया) शामिल है।

वही परिणाम हालांकि: जब तक ब्राउज़र IE8 है, तब तक जब आप WebBrowser नियंत्रण पर Dispose() को कॉल करते हैं तो पीडीएफ फ़ाइल रिलीज़ नहीं होती है। ऐप बंद होने पर इसे रिलीज़ किया जाता है, लेकिन इससे हमें मदद नहीं मिलती है ...

उम्मीद है कि इससे मदद मिलती है।

+0

हां, यह सटीक रूप से वर्णन करता है कि हम क्या चल रहे हैं। अद्यतन के लिए धन्यवाद। –

0

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

संक्षेप में, हमने फ़ाइल लॉकिंग समस्या को हल नहीं किया है, इसके बजाय हमने फ़ाइल संभाल संलग्न कर दिया है और जब तक उपयोगकर्ता ने ऐप बंद नहीं किया है तब तक फ़ाइल का पुन: उपयोग किया है।

उम्मीद है कि इससे मदद मिलती है।

1

मैं एक जवाब है कि किसी भी अस्थायी फ़ाइलों की आवश्यकता नहीं होगी।

मुझे एक समाधान बनाने के लिए मजबूर होना पड़ा, जब मैं अस्थायी फ़ाइलों का उपयोग करने के लिए अपने सभी कोड को फिर से लिखने के मूड में नहीं था।

तो, आप यहां क्या करते हैं।

  1. नष्ट करने के लिए
    Dim filesToDelete As List(Of String) = New List(Of String)

  2. आप किसी अन्य पीडीएफ फाइल करने के लिए webbrowser निर्धारित करने की आवश्यकता फ़ाइलों धारण करने के लिए तार की एक सूची बनाएं,
    (मेरे द्वारा बनाए गए एक खाली एक - काला या सफेद, जो कुछ के लिए काम करता आप)।
    तो webbrowser1.navigate("blank.pdf")

  3. स्ट्रिंग्स की सूची में हटाए जाने के लिए फ़ाइल जोड़ें। तो filesToDelete.Add(filename)

  4. अब, यह चाल है। जब तक आप इस घटना से बाहर नहीं निकलेंगे तब तक संसाधन जारी नहीं किए जाएंगे।
    तो आपको किसी और चीज पर ध्यान केंद्रित करने की आवश्यकता है जो किसी अन्य घटना को निकाल दिया जाएगा।
    मेरे मामले में, मैं पीडीएफ देखने के लिए एक वृक्षदृश्य का उपयोग कर रहा था।
    तो, उपर्युक्त विधि का उपयोग करके हटाने के लिए फ़ाइल को चिह्नित करने के बाद,
    मैं ट्रीव्यूव को एक अलग फ़ाइल में सेट कर दूंगा।
    तो TreeView1_BeforeSelect विधि में, मैं स्पष्ट किया:

    If filesToDelete.Count > 0 Then
        For Each f As String In filesToDelete
            File.Delete(f)
        Next
        filesToDelete.Clear()
    End If


    आप अपना खुद का कार्यक्रम अपना सकते हैं, लेकिन मुझे यकीन है कि डिलीट के लिए अंकन करने के बाद, आप ऐसा करने के लिए कुछ ढूंढ सकते हैं जिससे एक और घटना आग लग जाएगी। बस अपने कोड के प्रवाह का पालन करें, आगे क्या होता है।


तो वहाँ तुम्हारे पास है
। उम्मीद है कि यह किसी की मदद की।

+0

किसी ईवेंट को फायर करने के बजाय आप केवल '' 'आवेदन 'दे सकते हैं। डीओईवेंट्स()' '' और फिर हटाएं। –