Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-11-2024
Saltimbanki Saltimbanki is offline
Miembro
 
Registrado: oct 2024
Posts: 10
Poder: 0
Saltimbanki Va por buen camino
Abrir pdf con builder

Hola, quiero abrir un pdf mediante codigo y no se ni por donde empezar, me puede alguien hechar una mano ??
Gracias
Responder Con Cita
  #2  
Antiguo 14-11-2024
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Código PHP:
AnsiString aa="c:\\info.pdf";
ShellExecute(this->Handle,"open"pchar(aa), NULLNULL,SW_SHOWNORMAL); 
https://www.clubdelphi.com/foros/showthread.php?t=91239

Última edición por Casimiro Noteví fecha: 14-11-2024 a las 19:23:04.
Responder Con Cita
  #3  
Antiguo 14-11-2024
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 321
Poder: 4
pgranados Va por buen camino
Si te refieres con abrir un archivo PDF para que el usuario lo vea, puedes hacer lo que dijo Casimiro, si no. Se mas especifico con tu pregunta
Responder Con Cita
  #4  
Antiguo 15-11-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.435
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Añado que ShellExecute tal y como lo ha puesto [Casimiro] abrirá el PDF con el programa que tengas asignado por defecto a ese tipo de documentos, el resultado será el mismo que si pulsas doble click sobre el documento desde el Explorador de archivos de Windows.

Si deseas abrirlo con otro programa (Visor de PDF, Edge, Firefox,...) también se puede hacer, pero deberás especificarlo en la llamada.

Código Delphi [-]
  ShellExecute(Handle,'open', PChar('Firefox'), PChar('r:\FAQs.pdf'), nil, SW_SHOWNORMAL);
  ShellExecute(Handle,'open', PChar('MsEdge'), PChar('r:\FAQs.pdf'), nil, SW_SHOWNORMAL);
  ShellExecute(Handle,'open', PChar('C:\Utils\SumatraPDF-3.2-64.exe'), PChar('r:\FAQs.pdf'), nil, SW_SHOWNORMAL);
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 15-05-2025
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Poder: 3
navbuoy Va por buen camino
Si estás haciendo una aplicación VCL (lo más común en C++ Builder), podés usar un TOleContainer para incrustar Acrobat Reader dentro del formulario (sí, como un objeto embebido de Office).

Pasos:
Agregá un TOleContainer al formulario.

código para cargar el PDF:

Código:
OleContainer1->CreateObjectFromFile("C:\\ruta\\a\\archivo.pdf", false);
OleContainer1->DoVerb(ovShow);
Esto abre el PDF incrustado en tu app usando el visor predeterminado de Windows (normalmente Adobe Reader o Edge).
Si el usuario no tiene visor PDF instalado, esto puede fallar.

Componentes de terceros (profesionales)
Hay librerías que cargan y renderizan PDFs sin necesidad de Adobe. Algunas opciones:

Debenu Quick PDF Library (muy potente)

WPViewPDF de WPCubed

Gnostice PDFtoolkit

PDFium (open source, pero más complejo de integrar en C++ Builder)

�� Algunos son pagos, pero tienen versiones de prueba o gratuitas limitadas.


¿Qué necesitas para usar PDFium en C++ Builder?
1. Descargar PDFium ya compilado
Podés bajar una versión precompilada aquí:

https://github.com/bblanchon/pdfium-binaries

Buscá la versión Windows x86 (32 bits) o x64, dependiendo de tu app.

Necesitarás al menos estos archivos:

pdfium.dll

fpdfview.dll.lib (opcional, si vas a hacer linking estático, pero puedes ignorar esto si usás LoadLibrary)

fpdfview.h (cabecera principal)

2. Crear el wrapper en C++ Builder
Primero necesitás cargar dinámicamente la DLL y mapear las funciones que vas a usar.

�� Cabecera: pdfium_wrapper.h

Código:
#ifndef PDFIUM_WRAPPER_H
#define PDFIUM_WRAPPER_H

#include <windows.h>
#include <fpdfview.h>

class PDFiumWrapper {
private:
    HMODULE hPdfium;
    bool loaded;

public:
    PDFiumWrapper() : hPdfium(NULL), loaded(false) {}

    bool LoadPDFium(const String& dllPath) {
        hPdfium = LoadLibrary(dllPath.c_str());
        if (!hPdfium)
            return false;

        FPDF_InitLibrary();
        loaded = true;
        return true;
    }

    void UnloadPDFium() {
        if (loaded) {
            FPDF_DestroyLibrary();
            FreeLibrary(hPdfium);
            loaded = false;
        }
    }

    // Simple test: cargar documento
    FPDF_DOCUMENT LoadPDF(const String& filePath) {
        return FPDF_LoadDocument(filePath.c_str(), NULL);
    }

    ~PDFiumWrapper() {
        UnloadPDFium();
    }
};

#endif
�� Ejemplo de uso en tu Formulario

Código:
#include "pdfium_wrapper.h"

PDFiumWrapper* pdfium;

void __fastcall TForm1::FormCreate(TObject *Sender) {
    pdfium = new PDFiumWrapper();
    if (!pdfium->LoadPDFium("pdfium.dll")) {
        ShowMessage("Error cargando PDFium");
        return;
    }

    FPDF_DOCUMENT doc = pdfium->LoadPDF("ejemplo.pdf");
    if (!doc) {
        ShowMessage("No se pudo abrir el PDF.");
    } else {
        ShowMessage("PDF cargado correctamente.");
        FPDF_CloseDocument(doc);
    }
}

void __fastcall TForm1::FormDestroy(TObject *Sender) {
    delete pdfium;
}
�� Cosas importantes:
No renderiza automáticamente en un TImage. Tendrías que usar FPDF_RenderPageBitmap y dibujar en un HBITMAP o TBitmap.

Necesitás tener pdfium.dll junto al ejecutable.

Vamos a mostrar la primera página de un PDF en un TImage en C++ Builder, usando PDFium.

�� ¿Qué necesitamos?
pdfium.dll en la misma carpeta que el .exe.

Cabecera fpdfview.h (ya incluida en el paso anterior).

Un TImage en tu Form.

PDFium cargado como en la clase PDFiumWrapper.

✨ Paso a paso para renderizar la primera página en un TImage
1. Agrega estos includes:

Código:
#include <fpdfview.h>
#include <fpdf_doc.h>
#include <fpdf_text.h>
#include <fpdf_dataavail.h>
#include <fpdf_formfill.h>
#include <fpdf_save.h>
#include <fpdfedit.h>
2. Crea un método que renderice:

Código:
void RenderPageToImage(FPDF_DOCUMENT doc, int pageIndex, TImage* image) {
    FPDF_PAGE page = FPDF_LoadPage(doc, pageIndex);
    if (!page) {
        ShowMessage("No se pudo cargar la página.");
        return;
    }

    int width = (int)FPDF_GetPageWidth(page);
    int height = (int)FPDF_GetPageHeight(page);

    // Ajustar tamaño del componente TImage
    image->Width = width;
    image->Height = height;
    image->Picture->Bitmap->SetSize(width, height);

    // Crear bitmap compatible con PDFium
    FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0); // 0 = sin alpha
    FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF); // blanco

    // Renderizar página al bitmap
    FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0);

    // Obtener buffer del bitmap
    void* buffer = FPDFBitmap_GetBuffer(bitmap);
    int stride = FPDFBitmap_GetStride(bitmap);

    // Copiarlo a un TBitmap
    Bitmap->PixelFormat = pf32bit;
    for (int y = 0; y < height; ++y) {
        void* dest = image->Picture->Bitmap->ScanLine[y];
        void* src = (BYTE*)buffer + y * stride;
        memcpy(dest, src, width * 4);
    }

    FPDFBitmap_Destroy(bitmap);
    FPDF_ClosePage(page);
}
3. Llama al render desde ButtonClick:

Código:
void __fastcall TForm1::Button1Click(TObject *Sender) {
    PDFiumWrapper* pdfium = new PDFiumWrapper();
    if (!pdfium->LoadPDFium("pdfium.dll")) {
        ShowMessage("No se pudo cargar PDFium");
        return;
    }

    FPDF_DOCUMENT doc = pdfium->LoadPDF("ejemplo.pdf");
    if (!doc) {
        ShowMessage("No se pudo abrir el PDF");
        return;
    }

    RenderPageToImage(doc, 0, Image1); // Página 0 en el TImage1

    FPDF_CloseDocument(doc);
    pdfium->UnloadPDFium();
    delete pdfium;
}

Última edición por navbuoy fecha: 15-05-2025 a las 13:17:54.
Responder Con Cita
  #6  
Antiguo 15-05-2025
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.435
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por navbuoy Ver Mensaje
Si estás haciendo una aplicación VCL...
ChatGPT o similar?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Abrir fichero txt con c++builder y siempre EAccessViolation joeyjr C++ Builder 4 09-12-2016 20:14:10
Abrir simultáneamente dos formularios Builder c++ fabiodidone C++ Builder 15 01-10-2016 21:45:29
No se pudo abrir la Tabla: Report Builder elvymena Impresión 0 28-12-2010 19:41:37
Abrir directorio C++ Builder...? Ðαяισš C++ Builder 9 25-01-2009 18:36:02
Como abrir y modificar un archivo de Excel en builder pollo_c C++ Builder 0 17-08-2007 16:07:27


La franja horaria es GMT +2. Ahora son las 06:39:05.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi