Я хочу получить файл PDF, созданный с помощью jasperreport в angular с использованием Blob. Спина возвращает ResponseEntity<byte[]>
. Я предполагаю, что мне нужно преобразовать файл в правильном формате, но я не могу найти правильный путь и правильный формат.
НАЗАД
Ресурс:
@RequestMapping(value = "/entity/{entityId}/export",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<byte[]> exportEntity(@PathVariable() Long entityId) {
return ResponseEntity
.ok()
// Specify content type as PDF
.header("Content-Type", "application/pdf; charset=UTF-8")
// Tell browser to display PDF if it can
.header("Content-Disposition", "attachment;filename=entity.pdf")
.body(EntityService.printEntity(entityId));
}
EntityService:
public byte[] printEntity(Long entityId) {
Entity entity = entityRepository.findOneWithEagerRelationships(entityId);
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(Collections.singletonList(entity), false);
final Map<String, Object> parameters = new HashMap<>();
return reportsService.generatePDFReport("entity", parameters, dataSource);
}
JasperReportService:
public byte[] generatePDFReport(String inputFileName, Map<String, Object> params, JRDataSource dataSource) {
byte[] bytes = null;
try {
JasperPrint jasperPrint = getJasperPrint(inputFileName, params, dataSource);
bytes = JasperExportManager.exportReportToPdf(jasperPrint);
} catch (JRException e) {
e.printStackTrace();
}
return bytes;
}
private JasperPrint getJasperPrint(String inputFileName, Map<String, Object> params, JRDataSource dataSource) throws JRException {
JasperReport jasperReport = null;
InputStream reportStream = this.getClass().getResourceAsStream("/" + inputFileName + ".jrxml");
JasperDesign jd = JRXmlLoader.load(reportStream);
log.info("{} loaded. Compiling report", inputFileName);
jasperReport = JasperCompileManager.compileReport(jd);
return JasperFillManager.fillReport(jasperReport, params, dataSource);
}
FRONT
entity.service. js
Entity.$inject = ['$resource'];
function Entity($resource) {
var resourceUrl = 'api/entity/:entityId/export';
return $resource(resourceUrl, {}, {
'get': {
method: 'GET'
}
});
}
entity.controller. js
vm.loadEntity = function(){
Entity.get({entityId : 3},function(result){
console.log(result.body.type)
var blob = new Blob([result.body], { type: 'application/pdf' });
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = "test.pdf";
link.click();
});
}
На данный момент я получаю ответ в теле, но когда я нажимаю, чтобы получить PDF, PDF открывается, но оно пустое.
РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ
Мне удалось получить свой PDF-файл, используя следующую непосредственно в entity.controller. js:
$http.get('api/entity/3/export', {responseType: 'arraybuffer'}).
success(function(data) {
var blob = new Blob([data], { type: 'application/pdf' });
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = "test.pdf";
link.click();
});
Итак это здорово, но все же, как это сделать, чтобы установить тип ответа в моем entity.service. js напрямую?
Не могли бы вы мне помочь, пожалуйста?
Спасибо