Tuve el mismo problema pero en la parte superior uso un RESTFUL webservice
para esto y tengo un objeto de datos complejo que debo publicar.
Mi solución: como el jQuery Plugin construyo un temp form y lo presento. Pero i enviar el objeto de datos como un parámetro con el contenido JSON (yo uso aquí AngularJS
pero debería funcionar con jQuery.param()
también.)
Javascript:
$('<form target="_blank" action="' + appConstants.restbaseurl + '/print/pdf" method="POST">' +
"<input name='data' value='" + angular.toJson($scope.versicherung) + "' />" +
'</form>').appendTo('body').submit().remove();
en el lado del servidor se utiliza un CXF REST Service
con un JACKSON
Proveedor:
primavera Config:
<jaxrs:server id="masterdataService" address="/">
<jaxrs:serviceBeans>
<ref bean="printRestServiceBean" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
<bean class="de.controller.ExceptionHandler" />
</jaxrs:providers>
</jaxrs:server>
en el controlador I Extracto ed el parámetro y lo convirtió de nuevo a un Pojo Java:
package de.controller;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
@Path(Constants.PRINT_PATH)
@Consumes({ MediaType.APPLICATION_JSON, "application/x-www-form-urlencoded"})
@Produces("application/pdf; charset=UTF-8")
public class PrintRestController {
@Autowired
private PrintService printService;
@POST
@Produces("application/pdf")
@Path("/pdf")
public Response getPDF(@FormParam("data") String data) {
return printService.getPDF(json2Versicherung(data));
}
private Versicherung json2Versicherung(String data) {
Versicherung lVersicherung = null;
try {
ObjectMapper mapper = new ObjectMapper();
lVersicherung = mapper.readValue(data, Versicherung.class);
} catch(Exception e) {
LOGGER.error("PrintRestController.json2Versicherung() error", e);
}
return lVersicherung;
}
}
en el PRINTSERVICE construyo el binario pdf y la respuesta:
@Override
public Response getPDF(Versicherung pVersicherung) {
byte[] result = ... //build the pdf from what ever
ResponseBuilder response = Response.ok((Object) result);
response.header("Content-Disposition", "inline; filename=mypdf.pdf");
return response.build();
}
Esta solución funciona para todos los navegadores (incluso para IE9 que puede no maneja las URLs de datos) y en tabletas y teléfonos inteligentes y no tiene problemas con popupblockers
Define 'its default thing'. –
que sería lo que el navegador normalmente hace con una respuesta con el tipo de contenido establecido en PDF. Abra un lector, solicite una ubicación de descarga, etc. – bryanvick