سؤال

لدينا نموذج يستضيف عنصر تحكم WebBrowser.هذا هو التحكم الوحيد في النموذج.

نقوم بتمرير النموذج بمسار الملف لملف PDF مؤقت ويقوم بما يلي:

WebBrowser1.Navigate(Me._PathToPdf)

عند إغلاق النموذج، فإنه ينتقل بعيدًا عن ملف PDF:

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

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

بمجرد إغلاق النموذج، تقوم الفئة المستدعية بحذف ملف PDF المؤقت.

هذه العملية تعمل بشكل رائع...حتى قمنا بتثبيت Internet Explorer 8.لسبب ما، يؤدي الجمع بين IE8 وAdobe Acrobat 8 ​​(أو 9) إلى وضع مقبض قفل ملف إضافي على ملف PDF المؤقت.لا يختفي مقبض القفل الإضافي حتى يتم إيقاف تشغيل التطبيق بأكمله.يجب أن أذكر أيضًا أنه لا توجد أقفال على الملف حتى يتم فتح الملف بواسطة Acrobat.

يمكننا إعادة إنتاج هذا على أجهزة متعددة ويكون دائمًا مزيجًا من IE8 وAdobe Acrobat Reader.يمكننا تثبيت برنامج Foxit Reader 3 بدلاً من Adobe Acrobat وستسير الأمور بشكل جيد.وبالمثل، يمكننا تشغيل التطبيق على جهاز باستخدام IE7 وAdobe Acrobat، وستسير الأمور بشكل جيد.ولكن، عندما تخلط الجرعة السحرية من IE 8 وAcrobat، ينتهي بك الأمر إلى حالة من الفوضى.

هل يمكن لأحد أن يخبرني لماذا أحصل على قفل إضافي للملف يستمر حتى نهاية التطبيق؟

شكرًا.

يمكن العثور على مثال لتطبيق يوضح مشكلتي هنا: PDFLockProblemDemo.zip

هل كانت مفيدة؟

المحلول

يبدو لي أن المشاكل الحقيقية هي استخدام أ WebBrowser التحكم في استضافة البرنامج الإضافي لمتصفح الويب Adobe Reader لعرض ملفات PDF.أليس هناك طريقة أفضل لعرض ملفات PDF مباشرة دون الاعتماد على متصفح الويب؟ألا توفر Adobe SDK أو عنصر تحكم ActiveX الذي يمكنك استضافته مباشرة داخل النموذج الخاص بك؟


تحديث:نظرت حولي ووجدت هذا المشنور حيث يمكنهم الوصول إلى عنصر تحكم Adobe ActiveX (AxAcroPDFLib.AxAcroPDF) واتصل ببساطة:

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

نصائح أخرى

لدي إجابة لن تتطلب أي ملفات مؤقتة.

لقد اضطررت إلى إيجاد حل، بعد أن لم أكن في مزاج يسمح لي بإعادة كتابة كل التعليمات البرمجية الخاصة بي لاستخدام الملفات المؤقتة.

إذن، إليك ما ستفعله.

  1. قم بإنشاء قائمة من السلاسل للاحتفاظ بالملفات المراد حذفها
    Dim filesToDelete As List(Of String) = New List(Of String)

  2. تحتاج إلى ضبط متصفح الويب على ملف pdf آخر،
    (لقد قمت بإنشاء واحدة فارغة - أسود أو أبيض؛أيا كان يعمل للكم).
    مثل ذلك webbrowser1.navigate("blank.pdf" )

  3. أضف الملف المراد حذفه إلى قائمة السلاسل.لذا filesToDelete.Add(filename)

  4. الآن، ها هي الحيلة.لن يتم تحرير الموارد حتى تخرج من هذا الحدث.
    لذلك عليك التركيز على شيء آخر من شأنه أن يتسبب في إطلاق حدث آخر.
    في حالتي، كنت أستخدم Treeview لعرض ملف PDF.
    لذلك، بعد وضع علامة على الملف للحذف باستخدام الطريقة المذكورة أعلاه،
    سأقوم بتعيين Treeview على ملف مختلف.
    لذلك في TreeView1_BeforeSelect الطريقة، فعلت ما هو واضح:

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


    يمكنك اعتماد الحدث الخاص بك، لكنني متأكد من أنه بعد وضع علامة الحذف، يمكنك العثور على شيء يمكنك القيام به سيؤدي إلى إطلاق حدث آخر.فقط اتبع تدفق التعليمات البرمجية الخاصة بك، ماذا يحدث بعد ذلك.



إذن هذا هو الحال.نأمل أن يكون هذا ساعد شخص ما.

لم يتم العثور على حل حتى الآن، ولكن مزيد من المعلومات:لقد قمت في السابق باختبار استخدام XP Pro وAcrobat *.x و.NET 2.0 (الذي تم إنشاؤه باستخدام VS 2005).منذ ذلك الحين، قمت أيضًا باختبار مجموعة متنوعة من السيناريوهات التي تتضمن Vista وAcrobat 9.x و.NET 3.5 (المُصمم باستخدام VS 2008).

نفس النتائج بالرغم من ذلك:طالما أن المتصفح هو IE8، فلن يتم تحرير ملف PDF عند استدعاء Dispose() في عنصر تحكم WebBrowser.يتم إصداره عند إغلاق التطبيق، لكن هذا لا يساعدنا...

أتمنى أن يساعدك هذا.

واجهنا نفس المشكلة مع IE8 وAcrobat.في حالتنا، نحتاج ببساطة إلى أن نكون قادرين على الكتابة فوق ملف PDF المؤقت وإعادة عرضه.لقد وجدنا أنه يمكننا ببساطة فتح ملف PDF وكتابة 0 بايت ثم إغلاقه.بعد ذلك نقوم بفتح الملف ونكتب معلومات PDF الجديدة ثم نعيد عرض الملف المؤقت.

باختصار، لم نحل مشكلة قفل الملف، وبدلاً من ذلك تركنا مقبض الملف مرفقًا وأعدنا استخدام الملف حتى أغلق المستخدم التطبيق.

أتمنى أن يساعدك هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top