Как открыть PDF, используя ByteArray и Blob в angular js? - PullRequest
0 голосов
/ 25 марта 2020

Я хочу получить файл 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 напрямую?

Не могли бы вы мне помочь, пожалуйста?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...