# XMLHttpRequest PDF

**URL:** <https://foros.velneo.com/t/xmlhttprequest-pdf/9434>\
**Category:** Velneo\
**Created:** [13 Abril, 2017 09:48 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434 "2017-04-13T09:48:25Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![robertocofiex](https://avatars.discourse-cdn.com/v4/letter/r/9de0a6/32.png) [@robertocofiex](https://foros.velneo.com/u/robertocofiex)\
**Post date:** [13 Abril, 2017 09:48 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/1 "2017-04-13T09:48:25Z")

</div>

Hola, estoy intentando conectar a través de XMLHttpRequest al servidor de la AEAT para la presentación y obtención de las declaraciones de IVA etc.

Para imprimir un modelo 131( Se podrá hacer con cualquier otro 303,202,etc) se envían unos datos en POST y la AEAT devuelve un pdf.

Con el envío que hago de datos el xhr.errorCode es 0 xhr.status es 200 es decir todo ok.

El problema es que los datos que recibo en xhr.response es:

%PDF-1.4  
%???  
3 0 obj  
\<\</Filter/FlateDecode/Length 467\>\>stream  
x???An?0E?:?,[??p??P?N???A+?4t??6???z???drb5?

Lo guardo en un fichero pdf. pero es un fichero dañado. Entiendo que se devuelve el pdf en otro formato pero no se continuar.

Ayuda???.

Saludos.

---

<div class="post-metadata">

**Author:** ![manuel.rd](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/manuel.rd/32/3508_2.png) [@manuel.rd](https://foros.velneo.com/u/manuel.rd)\
**Post date:** [13 Abril, 2017 12:01 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/2 "2017-04-13T12:01:02Z")

</div>

Dudo mucho que la AEAT te deje acceder usando una simple conexión enviando la información por POST. Cualquier podría acceder a la información de otro.

---

<div class="post-metadata">

**Author:** ![robertocofiex](https://avatars.discourse-cdn.com/v4/letter/r/9de0a6/32.png) [@robertocofiex](https://foros.velneo.com/u/robertocofiex)\
**Post date:** [13 Abril, 2017 20:19 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/3 "2017-04-13T20:19:53Z")

</div>

Efectivamente, Hacienda no ofrece datos privados pero es un envió de predeclaracion, envías los datos los valida y emite el PDF, lo imprimes, se paga en entidades bancarias y ok. No se hace ninguna presentación ni nada por eso el acceso al servicio es libre… Es un servicio de validación e impresión.

Puedo pasar toda la información pero mi dificultad es en cómo se recibe de la AEAT el PDF.

No me importaría compartir todo lo que se de la construcción y datos para la presentación de declaraciones en la AEAT. El avance sería muy positivo para la comunidad Velneo.

Muchas Gracias wikan por responder. Creo que el tema es cómo se reciben y convierten los datos recibidos.

---

<div class="post-metadata">

**Author:** ![manuel.rd](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/manuel.rd/32/3508_2.png) [@manuel.rd](https://foros.velneo.com/u/manuel.rd)\
**Post date:** [14 Abril, 2017 00:56 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/4 "2017-04-14T00:56:14Z")

</div>

Prueba a recibir por VByteArray y luego a guardarlo en un fichero como PDF.

---

<div class="post-metadata">

**Author:** ![robertocofiex](https://avatars.discourse-cdn.com/v4/letter/r/9de0a6/32.png) [@robertocofiex](https://foros.velneo.com/u/robertocofiex)\
**Post date:** [14 Abril, 2017 07:42 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/5 "2017-04-14T07:42:51Z")

</div>

Gracias, pero esto es lo que no se hacer.¿ Como es?

---

<div class="post-metadata">

**Author:** ![manuel.rd](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/manuel.rd/32/3508_2.png) [@manuel.rd](https://foros.velneo.com/u/manuel.rd)\
**Post date:** [14 Abril, 2017 11:41 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/6 "2017-04-14T11:41:07Z")

</div>

Especifica el [responseType](https://velneo.es/info_v7_20_es/velneo_vdevelop/scripts/clases/core/xmlhttprequest/#responseType)

Tienes los ejemplos en la parte inferior.

---

<div class="post-metadata">

**Author:** ![cristianvg2003](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/cristianvg2003/32/5239_2.png) [@cristianvg2003](https://foros.velneo.com/u/cristianvg2003)\
**Post date:** [14 Abril, 2017 14:00 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/7 "2017-04-14T14:00:09Z")

</div>

Hola, prueba con mi libreria de para manejo de http request,

en el readme =\>[vajax](https://github.com/Heavyblade/vajax) vas a ver dos ejemplos de como descargar binarios.

Un saludo,

---

<div class="post-metadata">

**Author:** ![robertocofiex](https://avatars.discourse-cdn.com/v4/letter/r/9de0a6/32.png) [@robertocofiex](https://foros.velneo.com/u/robertocofiex)\
**Post date:** [16 Abril, 2017 10:07 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/8 "2017-04-16T10:07:22Z")

</div>

Siguiendo vuestras indicaciones he hecho este código. Me crea el pdf pero no le meto nada. En cambio sí existe respuesta del servidor.

Pongo el código entero. Por los datos de la variable “fic” no os preocupéis porque son los mios personales y es todo inventado.

A ver si podéis ayudarme. Muchas gracias.

* * *

importClass(“XMLHttpRequest”);  
importClass( “VFile” );

var url=“[https://www6.aeat.es/wlpl/PFTW-PICW/ServVali](https://www6.aeat.es/wlpl/PFTW-PICW/ServVali)”;

var xhr=new XMLHttpRequest();  
xhr.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);

xhr.open(“POST”, url,false);  
var fic="\<T131020171T0000\>\<AUX\> 5.90 B10459873 \</AUX\>\<T13101000\> I44401428CGARCIA MARTIN ROBERTO 20171T6471000000000009861200020000000000000019722 000000000000000000000000000000000000000 000000000000000000000000000000000000000 000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000009861200000000000001972200000000000000000000000000000000000000000000000000000000000000000000000000000000197220000000000000000000000000000000000000000000000197220000000000000000000000000000000000000000000000197220000000000000000000000000000019722 \</T13101000\>\</T131020171T0000\>";  
var datos=“HID=IE51310A&IDI=ES&LEV=000000000000&FIC=”+fic+"&RUT=&PRG=&FIN=&EJF=2017&MOD=131";

xhr.send(datos);

alert(xhr.status);  
alert(xhr.response);

if((xhr.errorCode==0)&&(xhr.status==200)){

var fi = new VFile( “C://a.pdf” );

```
if ( fi.open( VFile.OpenModeWriteOnly | VFile.OpenModeTruncate) ) {
	alert(xhr.response);
	
				fi.write(xhr.response);
				fi.close();
			}
			else
				{
					alert( "No se pudo abrir el fichero" );
				}
}

```

* * *

---

<div class="post-metadata">

**Author:** ![manuel.rd](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/manuel.rd/32/3508_2.png) [@manuel.rd](https://foros.velneo.com/u/manuel.rd)\
**Post date:** [16 Abril, 2017 16:38 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/9 "2017-04-16T16:38:17Z")

</div>

Sigues sin definir la respuesta como VByteArray, estarás recibiendo un string puro y duro.

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [16 Abril, 2017 19:14 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/10 "2017-04-16T19:14:50Z")

</div>

Hola robertocofiex.

Como te está indicando Manuel (y no le haces caso) debes decirle a la clase **XmlHttpRequest** que el resultado obtenido en XMLHttpRequest.response lo entregue tal cual y sin conversiones de formato. Esto se realiza con la propiedad XMLHttpRequest. **responseType**.

Como ya nos tiene acostumbrados, la documentación de Velneo es confusa y no aclara para nada su funcionamiento.  
A la propiedad responseType se le pueden asignar 3 valores:

- **Cadena vacía** -\> El valor por defecto. ¡¡OJO!! en este caso la codificación de XMLHttpRequest.response será siempre UTF-8. Si lo que estamos esperando es Texto codificado como ISO-8859-1/15, tendremos que tenerlo en cuenta.
- “ **json** ” -\> La propiedad XMLHttpRequest.response contendrá un objeto JSON de javascript. Lo que hace Velneo es convertir el texto recibido en el response y parsearlo en un objeto JSON. Nos ahorra el comando JSON.parse(XMLHttpRequest.response).
- “ **arraybuffer** ” -\> La propiedad XMLHttpRequest.response contendrá un objeto VByteArray del API de Velneo. En este caso Velneo no realiza conversiones de ningún tipo, nos entrega los datos del response tal cual le han llegado.

En tu caso, por lo tanto, si dejas la propiedad **responseType** en blanco, Velneo te entrega el PDF como un String en formato UTF-8 que no tiene nada que ver con el contenido binario que tiene un fichero PDF y de allí viene el fallo.

Asigna el valor XMLHttpRequest.responseType = “arraybuffer” antes de enviar el request y verás como todo funciona bien.

Sin embargo, no todo es tan fácil. ¿Cómo sabemos que el contenido de response es un PDF o Texto plano?  
Pues debemos consultar la cabecera **Content-Type** del response.

En tu caso, tendremos 2 tipos de contenido:  
1º.- Content-Type = “application/pdf” -\> Los datos del response son un bufer binario **PDF**  
2º.- Content-Type = “text/html; charset=ISO-8859-1” -\> Ha ocurrido **un Error** en la validación del modelo 131

Así, consultando el valor de la cabecera Content-Type sabremos que extensión asignamos al fichero de disco, pdf o html.

De forma resumida, tu ejemplo quedaría:

```auto
importClass("XMLHttpRequest")
importClass( "VFile" )
importClass("VProcess");

var xhr = new XMLHttpRequest()

// **************************************************************
// Validación del registro para el modelo 131 de la AEAT

// Indicamos que no haya modificación de los datos recibidos
xhr.responseType = "arraybuffer"
// Tipo de dato del Request
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
// Abrimos conexión
xhr.open("POST", "https://www6.aeat.es/wlpl/PFTW-PICW/ServVali", false)
// Datos para la validación del Registro del Modelo 131 de la AEAT
var cDatos = "\
HID=IE51310A&IDI=ES&LEV=000000000000&FIC=<T131020171T0000><AUX> \
                                 5_90 B10459873 \
                                                                                                    \
                                                               </AUX><T13101000> I44401428CGARCIA MA\
RTIN ROBERTO 20171T64710000000000098612000\
20000000000000019722 000000000000000000000000000000000000000 000000000000000000000000000000000\
000000 000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000\
0009861200000000000001972200000000000000000000000000000000000000000000000000000000000000000000000000\
0000001972200000000000000000000000000000000000000000000001972200000000000000000000000000000000000000\
00000000197220000000000000000000000000000019722 \
                                                                                                    \
        </T13101000></T131020171T0000>&RUT=&PRG=&FIN=&EJF=2017&MOD=131"

// Enviamos el Request
xhr.send(cDatos)

if (parseInt(xhr.status) == 200) {
	var cTipo_Respuesta = xhr.getResponseHeader("Content-Type")
	var cNombre_fichero = ""
	if (cTipo_Respuesta) {
		switch(cTipo_Respuesta.match(/(\w+\/)/)[0]) {
			case "text/":
				// El byteArray es texto HTML codificado como Latin1 (ISO-8859-1)
				var cNombre_fichero = theApp.clientCachePath() + "_aeat_validar_error.html"
				break;
			case "application/":
				// Tenemos un byteArray con el PDF
				var cNombre_fichero = theApp.clientCachePath() + "_aeat_validar_borrador.pdf"
				break;
		}
	}
	if (cNombre_fichero) {
		// Guardamos el resultado en fichero de disco
		var oFile = new VFile(cNombre_fichero)
		if ( oFile.open( VFile.OpenModeWriteOnly | VFile.OpenModeTruncate) ) {
                        // Guardamos directamente el bytearray a disco
			oFile.write(xhr.response)
			oFile.close()
			// Visualizar documento desde Velneo -> Ejecutar documento (CPATH_FICHERO)
			var oProceso = new VProcess(theRoot)
			oProceso.setProcess("MiApp/PRO_VER_DOCUMENTO")
			oProceso.setVar("CPATH_FICHERO", cNombre_fichero)
			oProceso.exec()
		} else {
			// Si no ha sido posible abrir el fichero se muestra error
			alert( "No se pudo crear el fichero " + oFile.fileName(), "Error" );
		}
	}
}

```

Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![robertocofiex](https://avatars.discourse-cdn.com/v4/letter/r/9de0a6/32.png) [@robertocofiex](https://foros.velneo.com/u/robertocofiex)\
**Post date:** [17 Abril, 2017 18:22 UTC](https://foros.velneo.com/t/xmlhttprequest-pdf/9434/11 "2017-04-17T18:22:36Z")

</div>

Efectivamente faltaba el detalle apuntado por Manuel. Gracias a todos funciona perfectamente.

Sigo con ello, ahora estoy con la firma digital. Necesito leer un fichero con la firma electronica e incluirlo en los datos para enviar. Como está codificado y lo tengo que concatenar con los datos enviados en el POST, ¿Debo utilizar algún tipo de variable especial??

Por si es de vuestro interés lo que estoy realizando es la conexión, presentación y descarga de la AEAT de los impuestos de manera desatendida, para que la presentación sea directa, sin navegador y sin intervención del usuario.

Nuevamente muchas gracias.
