문제

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 파일을 삭제합니다.

이 프로세스는 인터넷 익스플로러를 설치할 때까지 훌륭하게 작동합니다. 전체 응용 프로그램이 종료 될 때까지 여분의 잠금 핸들이 사라지지 않습니다. 또한 파일이 Acrobat에 의해 열릴 때까지 파일에 잠금 장치가 없다고 언급해야합니다.

우리는 이것을 여러 기계에서 재현 할 수 있으며 항상 IE8과 Adobe Acrobat Reader의 조합입니다. 우리는 Adobe Acrobat 대신 Foxit Reader 3을 설치할 수 있으며 일이 잘 작동합니다. 마찬가지로, 우리는 IE7과 Adobe Acrobat을 사용한 컴퓨터에서 앱을 실행할 수 있으며 일이 잘 작동합니다. 그러나 IE 8과 Acrobat의 마법의 물약을 혼합하면 혼란에 빠졌습니다.

누구든지 내가 애플리케이션이 끝날 때까지 지속되는 여분의 파일 잠금을받는 이유를 말해 줄 수 있습니까?

감사.

내 문제를 보여주는 예제 응용 프로그램은 여기에서 찾을 수 있습니다. pdflockproblemdemo.zip

도움이 되었습니까?

해결책

실제 문제는 a를 사용하는 것 같습니다 WebBrowser Adobe Reader Web Browser 플러그인을 호스팅하려면 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. WebBrowser를 다른 PDF 파일로 설정해야합니다.
    (나는 블랭크를 만들었습니다 - 검은 색 또는 흰색; 당신에게 맞는 것이 무엇이든).
    그처럼 webbrowser1.navigate("blank.pdf" )

  3. 문자열 목록에 삭제할 파일을 추가하십시오. 그래서 filesToDelete.Add(filename)

  4. 자, 여기 트릭이 있습니다. 이 이벤트에서 나올 때까지 리소스는 공개되지 않습니다.
    따라서 다른 이벤트가 해고 될 다른 일에 중점을 두어야합니다.
    제 경우에는 PDF를보기 위해 TreeView를 사용했습니다.
    따라서 위의 메소드를 사용하여 삭제 파일을 표시 한 후
    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 인 한 Webbrowser 컨트롤에서 Dispose () 호출 할 때 PDF 파일이 해제되지 않습니다. 앱이 닫히면 출시되지만 도움이되지 않습니다 ...

도움이 되었기를 바랍니다.

우리는 IE8과 Acrobat과 같은 문제가있었습니다. 우리의 경우 우리는 단순히 임시 PDF를 덮어 쓸 수 있어야하고이를 redisplay 할 수 있어야했습니다. 우리는 단순히 PDF를 열고 0 바이트를 작성한 다음 닫을 수 있음을 발견했습니다. 그 후 우리는 파일을 열고 새 PDF 정보를 작성한 다음 임시 파일을 재생합니다.

요약하면 파일 잠금 문제를 해결하지 않고 대신 파일 핸들을 첨부하고 사용자가 앱을 닫을 때까지 파일을 재사용했습니다.

도움이 되었기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top