Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Rellenar un pdf automaticamente

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Rellenar un pdf automaticamente Responder citando

Hola a todos

Sigo usando bcb6

Estoy mirando a ver si puedo rellenar un pdf ya creado (impreso de hacienda) con campos sacados de una bd.

Hacerlo directamente creo que va a ser dificil ( si alguien sabe algo sería genial)

La otra manera que pensé era la de extraer las imágenes del mismo y meterlas en un quickReport con un QrImage , pero no tengo ni idea de como extraerlas del pdf.

Si alguien tiene alguna idea, estoy un poco bastante perdido con esto.

Gracias anticipadas.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Seguro que no es la forma adecuada pero bueno,el problema radica en que estos formularios tienen un código de barras que cambia cada vez que se tiene que rellenar uno, entonces probare lo siguiente a ver si funciona, primero exportare el pdf a imagen con pdfxchange viewer (esto no lo hare desde mi programa), luego los cargaré en un qrimagen
y encima todos los qrdblabel para los datos que tenga que introducir
y metere otro encima para el codigo de barras , al cargar el pdf con el ocx de acrobat por ejemplo, el codigo de barras cambiará , asi que gracias a esta funcion que he encontrado en el foro
https://cppbuilder.es/viewtopic.php?t=7190&highlight=imprimircontrol

meteré un boton, por ejemplo debajo del acropdf1 en la posición donde va el codigo de barras , hare una captura de pantalla y meteré el codigo de barras capturado en el qrimage2 y así supongo que irá bien , se que es una chapuzada seguro , pero bueno si tiene que ir bien me da igual .
Ya os cuento cuando lo tenga hecho...........
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Lo que hice antes con lo del pdf "va bien", incluso me han dicho en hacienda que me cogerian los formularios, pero no es lo suyo ,ya que lo que quiere el cliente es hacerlo desde su pagina web, ahora estoy intentando rellenarlo automaticamente a traves de la web de hacienda , encontre un codigo en el foro que va perfecto para rellenar el login de mail.yahoo.com que va perfecto
pero el problema de la pagina de hacienda es que va con frames y no logro captura los campos del formulario ni de coña , en esto del webbrowser estoy pez pez
estoy probando con esto pero de momento no hay manera, creo que solo consigo capturar el frame , pero de ahi no paso, realmente no se que estoy haciendo pero bueno, si hay alguna alma caritativa se lo ruego porque no me entero con esto

la página es esta: https://www2.agenciatributaria.gob.es/es13/h/ie03700t.html

typedef std::map<CComVariant> MapField;
MapField mf;
mf["A010101"] = L"43000000K"; // id del campo// el frame se llama "pagi" si no voy mal y el form se llama "censo036"
mf["A010102"] = L"nombre y apellidos";

CComQIPtr<IHTMLDocument2> doc(web->Document);
CComPtr<IHTMLFramesCollection2> frames;
doc->get_frames(&frames);
CComPtr<IDispatch> disp;
VARIANT n, vFrame;
n.vt = VT_I4;
n.intVal = 1;
HRESULT hr = frames->item(&n,&vFrame);// (Variant("pagi"), Variant());
if (SUCCEEDED(hr))
{
ShowMessage("hola"); // hasta aqui parece que funciona
CComQIPtr<IHTMLFrameElement> frame(disp);
CComQIPtr<IHTMLInputElement> field;
for (MapField::iterator ite = mf.begin(); ite != mf.end(); ite++)
{
disp = 0;
// a partir de aqui ni idea(todo mal)

// item no es de frame // no se como hacerlo , no me entero/////////////////////////if (SUCCEEDED(frame-> item(ite->first, //CComVariant(), &disp)) && disp)
{
field = disp;
field->put_value(ite->second);
}
}
//form->submit();
}


gracias de antemano
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Espero que te sirva este pequeño ejemplo, siento no poder ayudarte mucho más ya que estoy en medio de un trabajo en el que voy muy mal de tiempo y estoy algo agobiadillo con el..

Lo de los .PDF he visto que hay alguna librería de pago (algo cara) para rellenar los formularios. Aunque seguro que buscando información de algún API de Adobe en su web habrá algo de información al respecto, pero en este momento no tengo tiempo para mirarlo.

Código:
// Añadimos: #include<mshtml.h> #include<map> #include<atl\atlbase.h>

typedef std::map<CComVariant, CComBSTR> MapField;
MapField mf;
mf["A010101"] = L"43000000K";
mf["A010102"] = L"nombre y apellidos";

// "web" es TCppWebBrowser
CComQIPtr<IHTMLDocument2> doc(web->Document);

    // Obtenemos la lista de frames
CComPtr<IHTMLFramesCollection2> frames;
doc->get_frames(&frames);
// long numFrames;  frames->get_length(&numFrames);

    // De la lista seleccionamos el frame llamado "pagi"
CComVariant frameDisp;
OleCheck(frames->item(&CComVariant("pagi"), &frameDisp));
CComQIPtr<IHTMLWindow2> frame(frameDisp.pdispVal);

    // Obtenemos el documento de dicho frame
CComPtr<IHTMLDocument2> docFrame;
frame->get_document(&docFrame);

    // Seleccionamos el form llamado "censo036"
CComPtr<IHTMLElementCollection> forms;
docFrame->get_forms(&forms);
CComPtr<IDispatch> disp;
HRESULT hr = forms->item(CComVariant("censo036"), CComVariant(), &disp);

if (SUCCEEDED(hr) && disp)
{
    CComQIPtr<IHTMLFormElement> form(disp);
    CComQIPtr<IHTMLInputElement> field;
    for (MapField::iterator ite = mf.begin(); ite != mf.end(); ite++)
    {
        disp = 0;
        if (SUCCEEDED(form->item(ite->first, CComVariant(), &disp)) && disp)
        {
            field = disp;
            field->put_value(ite->second);
        }
    }
    // form->submit();
}

Lo de las comprobaciones dobles en cosas como "if (SUCCEEDED(hr) && disp)..." es porque la propia documentación de Microsoft dice que el que devuelva "S_OK" no es garantía de que el puntero que ha devuelto es válido y dice que también es necesario comprobar que no sea nulo..

PD: Por favor, al pegar código es importante marcar la casilla "Deshabilitar HTML en este mensaje" para que al encontrarse '<' o '>' no lo interprete como etiquetas de HTML y se vea correctamente, si te fijas faltan partes.. y otro detalle sería bueno siempre pegar el código entre las etiquetas "[ code ]..[ /code ]" (sin los espacios) para que se vea correctamente indentado y sea más cómoda su lectura: https://cppbuilder.es/faq.php?mode=bbcode
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

genial , muchisimas gracias , ahora ya me da para ir continuando, ni se me pasó por la cabeza lo de capturar el document del mismo frame ,
que cosas , ya ire contando el progreso ,muchas gracias de nuevo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.