Ich hatte das gleiche Problem, aber oben eine RESTFUL webservice
dafür verwenden und ein komplexes Datenobjekt haben, das ich posten muss.
Meine Lösung: Wie das jQuery Plugin baue ich ein temporäres Formular und reiche es ein. Aber ich sende das Datenobjekt als Parameter mit json Inhalt (ich verwende hier AngularJS
aber es sollte auch mit jQuery.param()
arbeiten.)
Javascript:
$('<form target="_blank" action="' + appConstants.restbaseurl + '/print/pdf" method="POST">' +
"<input name='data' value='" + angular.toJson($scope.versicherung) + "' />" +
'</form>').appendTo('body').submit().remove();
auf der Server-Seite verwenden wir ein CXF REST Service
mit einem JACKSON
Provider:
Frühling 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>
in der Steuerung i extrahieren ed die param und konvertiert sie zurück in ein Java Pojo:
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;
}
}
in der Printservice i die pdf-Binär- und die Antwort bauen:
@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();
}
Diese Lösung (auch für IE9 für alle Browser funktioniert, wo Daten-URLs zu behandeln und auf Tablets und Smartphone und es haben keine Probleme mit Popupblocker
Definieren Sie 'seine Standard-Sache'. –
das wäre was auch immer der Browser normalerweise mit einer Antwort mit dem Inhaltstyp auf PDF eingestellt ist. Öffnen Sie einen Leser, fragen Sie nach einem Download-Ort usw. – bryanvick