Ver PDF dentro de la aplicación

User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Ver PDF dentro de la aplicación

Post by karinha »

Maravilloso. Muy bien.
João Santos - São Paulo - Brasil
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Re: Ver PDF dentro de la aplicación

Post by fgondi »

Hola,

Estoy probando el ejecutable que has enviado, con un pdf de 302KB con 2 hojas, y no se vé. aparece el cuadro dentro de la clase tRichEdit5, pero no carga el pdf
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Ver PDF dentro de la aplicación

Post by cnavarro »

fgondi wrote:Hola,

Estoy probando el ejecutable que has enviado, con un pdf de 302KB con 2 hojas, y no se vé. aparece el cuadro dentro de la clase tRichEdit5, pero no carga el pdf
Fernando
Construye el ejecutable con el source que he puesto y prueba de nuevo
Yo lo he probado con PDFs más grandes

Si tienes algún problema envíame un correo
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Ver PDF dentro de la aplicación

Post by cnavarro »

Esta versión también ve los ficheros dentro de un .zip

https://bitbucket.org/fivetech/fivewin- ... explor.exe
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
Carles
Posts: 937
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona
Contact:

Re: Ver PDF dentro de la aplicación

Post by Carles »

Fernando,

Y porque no se encarga Windows de buscar el programa que tenga cada uno configurado ?

Code: Select all

    nRet := ShellExecute( GetWndApp(), ,cFile, ,cFilePath( cFile ), SW_SHOW )
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Ver PDF dentro de la aplicación

Post by cnavarro »

Carles

Yo he entendido que necesita mostrar el pdf dentro de un "control" en su aplicación, y no en una ventana externa
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
Carles
Posts: 937
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona
Contact:

Re: Ver PDF dentro de la aplicación

Post by Carles »

Vale,

Pues prueba con esto para jugar un poco con el tema...

Code: Select all

#include 'fivewin.ch'

#define SW_SHOW 5
#define SW_HIDE 0

STATIC oWnd

*--------------
FUNCTION MAIN()
*--------------
    
    DEFINE WINDOW oWnd MDI 
    ACTIVATE WINDOW oWnd ON INIT Test()
    
RETU NIL

*--------------
FUNCTION Test()
*-------------- 
    LOCAL cFile     := 'manual.pdf'
    LOCAL nRet      := ShellExecute( oWnd:hWnd, ,cFile, ,cFilePath( cFile ), SW_HIDE )
    LOCAL hWndPdf
    
    SysWait(1)
    
    hWndPdf := FindWindow(0, cFile + " - Adobe Reader" )        

    SetParent( hWndPdf, oWnd:hWnd ) 

RETU NIL
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Re: Ver PDF dentro de la aplicación

Post by fgondi »

Gracias Carles por la información,

Ese sistema ya lo había probado (en concreto para capturar una excel), pero provoca problemas.

1.- Si ya está abierta la aplicación externa, captura toda ella. Por tanto el documento que estuviese viendo, externo a mi aplicación, también quedaría capturado dentro de mi aplicación.

2º.- Si no está abierto, parece que funciona bien, hasta que intenta abrir un documento externo a mi aplicación, sin haber cerrado la captura generada. Este documento externo se abre dentro de mi aplicación.

De nuevo muchas gracias Carles.

Seguiré trabajando con la opción de Cristobal.
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
User avatar
Carles
Posts: 937
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona
Contact:

Re: Ver PDF dentro de la aplicación

Post by Carles »

Fernando,

Entiendo :D . Y has probado de usar activex con el shell.explorer ? Esto seguro te funciona y solo tendrias de crear un html de 4 lineas para leer tus pdf's. La ventaja de usar shell.explorer es que seguro q esta en todos los ordenadores de tus clientes, otros activex ya implica gestión de si existe o no. Si necesitas un ejemplo te lo publico
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Re: Ver PDF dentro de la aplicación

Post by fgondi »

Carles,

Usar el activex del Explorer fue mi primera opción.
En versiones mas modernas del navegador, se abren directamente los pdf. En las antiguas no, pero, tal y como dices, con 4 líneas de código se puede forzar a que las abra.

El navegador usa internamente el activex de acrobat (si está instalado) y sería la opción perfecta.

Sin embargo, tengo otros problemas, que estoy intentando resolver, que me obligan a ejecutar las aplicaciones con "Compatibilidad para XP" y al ejecutarse con esa compatibilidad no cargan los pdf's.
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
User avatar
Carles
Posts: 937
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona
Contact:

Re: Ver PDF dentro de la aplicación

Post by Carles »

Fernando,

Para XP no se como poder hacerlo via activex :( . Ya contaras... (Yo si son casos puntuales como dices, chequearia la version win que usas y si es XP lanzaria un winexec() y sino via activex empotrado en la app)

Ya contaras como te has salido...
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
HunterEC
Posts: 723
Joined: Tue Sep 04, 2007 8:45 am

Re: Ver PDF dentro de la aplicación

Post by HunterEC »

Cristobal:

Excelente programa. Muy profesional. Tiene un pequeño "bug" cuando escoges del menu un tipo de fichero y no hay de ellos, se cancela con un error.
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Ver PDF dentro de la aplicación

Post by cnavarro »

Solucionado, gracias

https://bitbucket.org/fivetech/fivewin- ... explor.exe

Code: Select all


#include "fivewin.ch"
#include "RichEdi5.ch"

//----------------------------------------------------------------------------//

REQUEST HB_CODEPAGE_ESWIN

Static oRTF
Static cRTF
Static nFilter
Static cDirName
Static aFilesTxt
Static aFilesImg
Static aFilesObj
Static aFilesAll

//----------------------------------------------------------------------------//

function Main()

   local aImages
   local oWnd
   local oFont
   local oBrush
   local oBrw
   local nWBrw   := 300

   FW_SetUnicode( .t. )
   HB_CDPSELECT( "ESWIN" )
   HB_SETCODEPAGE( "UTF8" ) // Harbour (not xHarbour) to display unicode filenames

   aFilesTxt := { "RTF", "ZIP", "TXT", "PRG", "C", "CPP", "H", "CH", "RC", "INI", "BAT", "MAK", "XML", "LOG", "PPO" }
   aFilesImg := { "BMP", "PNG", "JPG", "ICO", "DIB", "PCX", "GIF", "WMF" }
   aFilesObj := { "DOC", "XLS", "PPT", "PDF", "DOCX", "XLSX" }
   aFilesAll := { "DBF" }

   //ReadDir()
   
   nFilter  := 0
   cDirName := hb_CurDrive() + ":\" + CurDir()
   aImages  := ReadFolder()

   DEFINE FONT oFont NAME "VERDANA" SIZE 0,-14
   //DEFINE BRUSH oBrush FILE "..\bitmaps\backgrnd\stone.bmp"
   
   DEFINE WINDOW oWnd TITLE " FWExplorer: Visor de Documentos - [ TRichEdit Control ]"
   oWnd:SetFont( oFont )
   
   SET MESSAGE OF oWnd TO "" 2015
   DEFINE BUTTONBAR oWnd:oBar SIZE 70, 32 2015

   DEFINE BUTTON OF oWnd:oBar PROMPT "Exit"   CENTER ACTION ( oWnd:End() )   
   DEFINE BUTTON OF oWnd:oBar PROMPT "Rtf"    CENTER ACTION ( nFilter := 1, ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "Text"   CENTER ACTION ( nFilter := 11, ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "Images" CENTER ACTION ( nFilter := 2 , ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "Object" CENTER ACTION ( nFilter := 3 , ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "Dbf"    CENTER ACTION ( nFilter := 4 , ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "All"    CENTER ACTION ( nFilter := 0 , ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "Folder" CENTER ;
      ACTION ( cDirName := cGetDir( "Select Folder", GetCurDir() + "\" ), ;
               SetCurDir( cDirName ), ;
               oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )

   @ oWnd:oBar:nHeight,0 XBROWSE oBrw SIZE nWBrw, -oWnd:oMsgBar:nHeight ;
      PIXEL OF oWnd DATASOURCE aImages COLUMNS 1 CELL LINES NOBORDER

   WITH OBJECT oBrw
      :l2007 := .F.
      :aCols[ 1 ]:cHeader := "Files"
      :nStretchCol   := 1
      :bChange       := { | o | VerDoc( o ) }
      :bLDblClick    := { | o | LookOthers( oBrw ) }
      :bClrStd       := { || { If( oBrw:aRow[ 3 ] == 1, CLR_BLUE, CLR_HRED ), CLR_WHITE } }
      :bKeyDown      := { |n,f| if( n = VK_RETURN, Eval( oBrw:bLDblClick ), ) }
      :CreateFromCode()
   END

   WITH OBJECT oWnd
      :nWidth     := ScreenWidth()  * 0.6
      :nHeight    := ScreenHeight() * 0.6
   END

   @ oWnd:oBar:nHeight, nWBrw RICHEDIT5 oRTF VAR cRTF OF oWnd ;
     SIZE oWnd:nWidth - (nWBrw+18), oBrw:nHeight*1.82 PIXEL NOBORDER HSCROLL

   ACTIVATE WINDOW oWnd CENTERED ON INIT VerDoc( oBrw ) ;
   ON PAINT ( oRTF:SetSize( oWnd:nWidth - (nWBrw+18), oBrw:nHeight-2 ) ) //ON INIT oWnd:SetControl( oRTF )
   
   RELEASE FONT oFont
   //RELEASE BRUSH oBrush

return nil

//----------------------------------------------------------------------------//

Function VerDoc( oBrw )

   local nOpc      := 0
   local lText     := .F.
   //local cFile     := AnsiToWide( AllTrim( oBrw:aRow[ 2 ] ) )
   local cFile     := if( Len( oBrw:aArrayData ) > 0, AllTrim( oBrw:aRow[ 2 ] ), "" )
   local aFiles    := {}
   local cText     := ""
   
   if !Empty( cFile )
      if !Empty( Ascan( aFilesTxt, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
         nOpc  := 1
      endif
      if Empty( nOpc )
         if !Empty( Ascan( aFilesImg, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
            nOpc  := 2
         endif
      endif
      if Empty( nOpc )
         if !Empty( Ascan( aFilesObj, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
            nOpc  := 3
         endif
      endif
      if Empty( nOpc )
         if !Empty( Ascan( aFilesAll, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
            nOpc  := 4
         endif
      endif
   endif
   oRTF:SetClear()
   oRTF:SelectAll()
   oRTF:Del()

   Do Case
      Case nOpc = 0
         lText  := .T.
         oRTF:SetText( "<File Format not supported>" )
      
      Case nOpc = 1

         if Upper( cFileExt( cFile ) ) <> "RTF"
            if Upper( cFileExt( cFile ) ) == "ZIP"         
               aFiles := hb_GetFilesInZip( cFile )
               if !Empty( aFiles )
                  cText  += Upper( cFileNoPath( cFile ) ) + "=> " + CRLF
                  AEVal( aFiles, { | a | cText += Chr( 9 ) + Chr( 9 ) + Chr( 9 ) + a + CRLF } )
                  lText  := .T.
                  oRTF:SetText( cText )
               endif
            else
               lText  := .T.
               oRTF:SetText( MemoRead( cFile ) )
            endif
         else
            oRTF:LoadFromRTFFile( cFile )
         endif
      
      Case nOpc = 2
      
         oRTF:InsertPictureFile( cFile )

      Case nOpc = 3
         
         oRTF:InsertObject( cFile ) //+ Chr( 0 ) )

      Case nOpc = 4
         lText  := .T.
         oRTF:SetText( "<File Format not supported: Double Click or Intro>" )

      Otherwise
      
         oRTF:LoadRTF( cFile )      

   EndCase

Return nil

//----------------------------------------------------------------------------//

Static Function LookOthers( oBrw )

   local nOpc      := 0
   
   if !Empty( Ascan( aFilesTxt, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
      nOpc  := 1
   endif
   if Empty( nOpc )
      if !Empty( Ascan( aFilesImg, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
         nOpc  := 2
      endif
   endif
   if Empty( nOpc )
      if !Empty( Ascan( aFilesObj, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
         nOpc  := 3
      endif
   endif
   if Empty( nOpc )
      if Upper( cFileExt( oBrw:aRow[ 2 ] ) ) = "DBF"
         XBrowse( oBrw:aRow[ 2 ] )
      else
         MsgInfo( "Format not supported", oBrw:aRow[ 2 ] )
      endif
   endif

Return nil

//----------------------------------------------------------------------------//

static function ReadFolder()

   local aImages  := {}
   local aSub     := { "*" }
   local c
   local x
   local cPath    := cDirName
   local aDir
   local aAlls    := {}

   AEVal( aFilesTxt, { | a | AAdd( aAlls, a ) } )
   AEVal( aFilesImg, { | a | AAdd( aAlls, a ) } )
   AEVal( aFilesObj, { | a | AAdd( aAlls, a ) } )
   AEVal( aFilesAll, { | a | AAdd( aAlls, a ) } )

   Do Case
      Case nFilter = 0
           aSub    := { "*" }
      Case nFilter = 1
           aSub    := { "rtf" } 
      Case nFilter = 11
           aSub    := aClone( aFilesTxt )
           aSub    := ADel( aSub, 1 )
           ASize( aSub, Len( aSub ) - 1 )
      Case nFilter = 2
           aSub    := aClone( aFilesImg )
      Case nFilter = 3
           aSub    := aClone( aFilesObj )
      Case nFilter = 4
           aSub    := { "dbf" } 
   EndCase
   
   for each c in aSub
      aDir     := Directory( cPath + "\*." + c )
      AEval( aDir, { | a | AAdd( aImages, { Lower( a[ 1 ] ), ;
                           Lower( TrueName( cPath + "\" + a[ 1 ] ) ), 0 } ) } )
   next
   For x = 1 to Len( aImages )
      if !Empty( Ascan( aAlls, Upper( cFileExt( aImages[ x ][ 2 ] ) ) ) )
         aImages[ x ][ 3 ] := 1
      endif
   Next x
   
   ASort( aImages,,,{ | x, y | Lower( x[ 1 ] ) < Lower( y[ 1 ] ) } )

return aImages

//----------------------------------------------------------------------------//

C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Ver PDF dentro de la aplicación

Post by Carlos Mora »

Hola a todos,

retomando la solución propuesta por Antonio, y que además serviría para más cosas...

https://bitbucket.org/chromiumembedded/cef

Chrome embebido en las aplicaciones. No es una tarea fácil pero seria más que interesante poder tener un browser tan completo dentro de nuestras aplicaciones, y con su js y todo lo que eso conlleva.

¿Que os parece?
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Ver PDF dentro de la aplicación

Post by Carlos Mora »

Chrome MFC ...

https://github.com/VladimirRybakov/cef-mfc

más cerca aun! Un control TCef no estaria mal :)
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Post Reply