 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
mns Lt

Registrado: 15 Oct 2008Mensajes: 95
|
Publicado: Mie 11 May, 2011 9:29 pm Asunto: Rellenar un pdf automaticamente |
|
|
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 |
|
 |
mns Lt

Registrado: 15 Oct 2008Mensajes: 95
|
Publicado: Mie 11 May, 2011 10:47 pm Asunto: |
|
|
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 |
|
 |
mns Lt

Registrado: 15 Oct 2008Mensajes: 95
|
Publicado: Vie 13 May, 2011 12:59 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 15 May, 2011 1:45 am Asunto: |
|
|
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 |
|
 |
mns Lt

Registrado: 15 Oct 2008Mensajes: 95
|
Publicado: Dom 15 May, 2011 5:49 am Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|