Avatar billede loopit Nybegynder
02. december 2008 - 22:20 Der er 7 kommentarer

Åbne pdf-fil fra res-fil.

Hjælp!

Jeg har i mit projekt inkluderet en res-fil indeholdende en pdf-fil i implementation afsnittet. D.v.s. at pdf-filen bliver inkluderet i min exe-fil. Ved tryk på en button skal pdf-filen åbnes med Adobe Reader. Jeg har et kode-eksempel, som kan åbne en jpg-fil. Det må være muligt at omskrive koden således at pdf-file kan åbnes med ShellExecute:
ShellExecute (Application.handle,nil,'MyPdf.pdf',nil,nil,SW_SHOW);

Eksempel. jpg-fil i res-fil åbnes og tegnes på image-komponent:

procedure TForm1.btnPDFClick(Sender: TObject);
var
  img_0270 : TJPEGImage; // PDF-fil type?
  ResStream : TResourceStream;
begin
  try
    img_0270 := TJPEGImage.Create; // PDF-fil type?
    ResStream := TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA);
    img_0270.LoadFromStream(ResStream);
    Image1.Canvas.Draw(0,0,img_0270); // ShellExecute!
      finally
        img_0270.Free;
        ResStream.Free;
  end;
end;
Avatar billede hrc Mester
02. december 2008 - 23:39 #1
Var det ikke en idé at inkludere Adobe i dit program? Det er slet ikke svært hvis altså din Delphi kan importere en ActiveX til komponentpaletten. Derfra er der en metode der hedder LoadFromFile (eller noget lignende).

Du bliver nødt til at gemme PDF-filen i temp-kataloget og åbne det derfra. Desværre kan man ikke streame direkte til komponenten.

En anden irriterende sag, der vedrører sikkerheden er, at nok er der en LoadFromFile men der mangler en SaveToFile. Bevæger dig over i "Trusted Functions"-verdenen kan det dog lade sig gøre.
Avatar billede hrc Mester
02. december 2008 - 23:42 #2
I øvrigt stod dine "Creater" på den forkerte side af try'en. Objekter oprettes udenfor try-finally for fejler oprettelsen er der intet at frigive.

procedure TForm1.btnPDFClick(Sender: TObject);
var
  img_0270: TJPEGImage; // PDF-fil type?
  ResStream: TResourceStream;
begin
  img_0270 := TJPEGImage.Create; // PDF-fil type?
  ResStream := TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA);
  try
    img_0270.LoadFromStream(ResStream);
    Image1.Canvas.Draw(0,0,img_0270); // ShellExecute!
  finally
    img_0270.Free;
    ResStream.Free;
  end;
end;
Avatar billede hrc Mester
03. december 2008 - 07:35 #3
Jeg brugte "Import Component", Type-library og valgte der "Adobe Acrobat 8.0 Browser Control Type Library 1.0" til at generere komponenten
Avatar billede loopit Nybegynder
03. december 2008 - 20:59 #4
Hej hrc

Tak for dine kommentarer. Jeg har prøvet at bruge AcroPDF ActiveX komponenten og kan godt åbne en ekstern pdf-fil med den direkte i mit eget program/form med følgende kode:
AcroPDF1.LoadFile('MyPDF.pdf');

Jeg vil dog gerne have pdf-filen kompileret ind i selve exe-filen - derfor res-filen.
Ellers andre forslag:-)
Avatar billede hrc Mester
04. december 2008 - 08:12 #5
Du kan ikke åbne et pdf-dokument med AcroPDF uden at den skal en tur omkring temp-kataloget for at kunne bruge LoadFile, tro mig. Jeg har prøvet!
Avatar billede loopit Nybegynder
04. december 2008 - 20:55 #6
Hej

Hvad mener du med at pdf-dokumentet skal en tur omkring temp-kataloget - hvilket temp-katalog?

Det jeg har gjort er at smide en AcroPDF komponent på formen og skriver følgende simple kode:

procedure TForm1.FormCreate(Sender: TObject);
begin
AcroPDF1.LoadFile('sc2000.pdf');
end;

Pdf-filen 'sc2000.pdf' er placeret i samme folder som projektet.
Avatar billede hrc Mester
05. december 2008 - 13:09 #7
Hvis du skal åbne denne fil (sc2000.pdf) nogetsteds, bør det være fra PC'ens temp-katalog som altid er skrivebart. Hvis alle slags kunder skal kunne bruge programmet, kan du ikke vide om de (i værste tilfælde) kører programmet på Citrix - og så har du balladen for der er dit programkatalog sandsynligvis skrivebeskyttet. Det er derfor det er dobbelt irriterende at man ikke kan streame PDF'en direkte til AcroPDF men skal gemme den som fil først.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester