Problem z resource

0

Witajcie. Pisząc swoją aplikację, jako plik resource dodałem do niej pdfa, o nazwie "guide.pdf". Następnie wrzuciłem na formę komponent Adobe PDF Reader i napisałem coś takiego:

        private void axAcroPDF1_OnError(object sender, EventArgs e)
        {
            axAcroPDF1.src = "guide.pdf";
        }

Na końcu wszystko zbuildowałem, jednak po uruchomieniu programu, zamiast pdfa, wyświetlane jest puste okno. Czy ktoś mógłby mi powiedzieć dlaczego tak się dzieje?

Z góry dziękuję za pomoc.

0

Powiem inaczej. Chcę stworzyć aplikację, która będzie wyświetlała plik .pdf który nie znajduje się na dysku, tylko jest wbudowany w tą aplikację. Jak krok po kroku to zrobić?

0

Czemu używasz zdarzenia OnError i gdzie masz je podpięte?

0

Wiem, zauważyłem już ten błąd. Zmieniłem to na po kliknięciu na button, jednak nadal nie działa. Dodaję plik do resources, ustawiam Build Action jako Embedded Resource i używam funkcji:

axAcroPDF1.LoadFile("guide.pdf");

Jednak pdf wciąż nie jest ładowany. Wyświetlane jest białe okno.

0

A co to za komponent i skąd?

0

Wbudowany już w w Microsoft Visual C# 2008 Express Edition, a nazwy się axAcroPDF czy Adobe PDF Reader...

0

O ile się nie mylę, do wydobycia pliku z resource nie wystarczy podać jego nazwy. Potrzebne są odpowiednie metody. Poczytaj może tu:

http://kumarnitesh.wordpress.com/2008/04/16/how-to-use-resource-file-in-c/

0

Ok, dzięki. Sprawdzę. Kurczę, ale to przecież musi być proste jak bułka z masłem! Pełno ludzi dołącza do swoich aplikacji manuale w postaci pdfa więc powinno się znaleźć kilku co sypną kodem od ręki. Hmm. Może pozory mylą.

0

Nie ma wbudowanego. Z tego co rozumiem dodałeś COMową wtyczkę, która instaluje się razem z PDF Readerem, ale nieważne.

LoadFile jak sama nazwa wskazuje służy do odczytania pliku z dysku, a nie wczytania strumienia z zasobów.
A to, co dodałeś do resources nie nazywa się "guide.pdf" tylko Properties.Resources.guide i jest typu byte[].

Jesteś pewien, że te manuale w postaci pdfów dostarczają jako wbudowane zasoby, a nie oddzielne pliki? Przecież to jest bez sensu!
W ramach obejścia zawsze można sobie to z zasobów zapisać do pliku tymczasowego i dać do wczytania kontrolce. :D

0

Ale ja nie chcę w ogóle przechowywać tego pliku na dysku! Oto chodzi, że chcę zrobić takie zabezpieczenie, połączone z systemem logowania. Użytkownik jeśli posiada konto na pewnej stronie, może się zalogować swoimi danymi ze strony do aplikacji i wyświetlany jest mu plik .pdf. W takim razie jak mogę korzystając z tej wtyczki odpalić plik .pdf z resources?

0

Napisałem coś takiego:

System.Reflection.Assembly assm =
System.Reflection.Assembly.GetExecutingAssembly();
using (System.IO.Stream stm =
assm.GetManifestResourceStream("guide.pdf"))

tylko jak to teraz przypisać, aby wyświetliło tego pdfa przy użyciu axAcroPDF1?

0

Strumień nic Ci nie da, bo wtyczka nie obsługuje strumieni tylko pliki. Możesz to obejść używając plik tymczasowego, np. tak:

string tempFile = Path.GetTempFileName();
File.WriteAllBytes(tempFile, Properties.Resources.guide);
this.axAcroPDF1.LoadFile(tempFile);

Lepszego rozwiązania na tę chwilę, z uwagi na ograniczenie wtyczki nie widzę.

0

Ok, ale jak nie chcę zapisywać pliku W OGÓLE na dysku, to mogę rozejrzeć się za inną wtyczką?

0

No chyba tak. O ile są. Nie wiem, nie znam się. Mówię tylko to, co widzę. ;P

0

A jak już miałbym przenosić ten plik do TEMP, to jak mogę zablokować w czasie działania programu dostęp do tego katalogu i jak zrobić, aby po zamknięciu programu automatycznie się kasował?

0

Znalazłem takie coś:
http://www.codeproject.com/KB/applications/PDFViewerControl.aspx
Mógłby ktoś pomóc mi tego użyć? Pragnę załadować plik pdf do tej kontrolki. Tylko jeden plik, czyli od razu chcę wywalić możliwość otwierania/zapisu plików oraz najlepiej wyłączyć toolbar. Kompletnie nie mogę tego ogarnąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1