Contexto

Si necesitan consumir reportes a JasperServer desde Laravel, es posible utilizar Jaspersoft Rest Client, y decidí compartir una de las configuraciones que utilicé inicialmente, puede que les de una idea de cómo implementarlo y mejorar el consumo de reportes usando una API de éste tipo

Qué es Laravel?

Laravel es un framework de código abierto para desarrollar aplicaciones y servicios web con PHP 5 y PHP 7. Su filosofía es desarrollar código PHP de forma elegante y simple, evitando el código espaguetiofficial site.

Qué es Jaspersoft Rest Client?

Es una librería que se utilizar para realizar peticiones e interactuar con los reportes alojados en Jasper Reports Server a través de la API REST en PHP nativo. Esto permite incrustar más fácilmente los datos en el servidor de reportes, o realizar tareas administrativas en el servidor utilizando PHP.

Requerimientos para éste ejemplo

El proyecto se puede descargar del repositorio https://github.com/jesusferm/Laravel-10-Jaspersoft-Rest-Client

  • SO Fedora 38 (Puede usarse otro SO, sin embargo se utilizó una distro GNU/Linux)
  • XAMPP 8.2.4
  • PHP 8.2.4
  • Laravel 10
  • Jaspersoft Rest Client
  • Composer

Configuración de Jasper Server

** Importante! Se asume que se cuenta con Jasper Server configurado y con al menos un reporte, ya sea con conexión a base de datos o no.

Descargar Laravel 10

Crear el proyecto de laravel 10 https://github.com/jesusferm/Laravel-10-Jaspersoft-Rest-Client

composer create-project --prefer-dist laravel/laravel laravelcv10-jasper

**Si sólo se clona el repositorio, no olvidar ejecutar el comando composer update, para actualizar y descargar los paquetes:

composer update

Entrar al proyecto desde la terminal y descargar el paquete:

composer require jaspersoft/rest-client

Configuración de Laravel

Configurar el archivo .env con los accesos de jasperserver

JASPER_SERVER_USERNAME=jasperadmin
JASPER_SERVER_PASSWORD=jasperadmin
JASPER_SERVER_URL=http://localhost:8080/jasperserver

Configurar autoload

Añadir los siguiente elementos en el autoload:

[...]

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/"
    },
    "files": [
        "app/Helpers/jasper.php"
    ]
},

[...]

Archivo helper reports

Crear en dentro del directorio App/Helpers/helpers el archivo jasper.php y añadir lo siguiente ** Aquí se configura la jasper server, por lo que si las contraseñas o dirección url, no corresponden a las predeterminadas, realizar el cambio

<?php
use Illuminate\Support\Facades\Storage;
use Jaspersoft\Client\Client;

function reporte($idRegistro, $name, $params, $type = 'pdf')
{
    try {
        $client = new Client(env('JASPER_SERVER_URL'), env('JASPER_SERVER_USERNAME'), env('JASPER_SERVER_PASSWORD'));
        $report = $client->reportService()->runReport('/reports/'.$name, $type, null, null, $params);
        $nombre_temporal = str_replace('/', '_', $name).'_'.$idRegistro.'.'.$type;
        Storage::disk('public')->put('reports/'.$nombre_temporal, $report);

        return 'storage/reports/'.$nombre_temporal;
    } catch (Throwable $error) {
        return 'error '.$error;
    }
}

Añadir al archivo web.php

Route::get('/', function () {
    return view('welcome');
})->name('/');

Route::get('reports', 'App\Http\Controllers\ReportController@index')->name('reports');

Crear el controlador ReportController.php

php artisan make:controller ReportController --resource

Y añadir en el método index

public function index()
{
    $params = [
        'nombre_movimiento' => 'Determinación del trámite',
        'autoriza' => '',
        'cargo' => '',
    ];
    $pdf = reporte(1, 'Codeigniter/reporteuno', $params, 'pdf');
    return view('report', compact('pdf'));
}

Crear la vista report.blade.php

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <title>Test Report Jasper Laravel 10 | linuxitos</title>
        <link rel="icon" href="{{ asset('assets/images/favicon.png')}}" type="image/png">
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous">
        <link rel="preconnect" href="https://fonts.bunny.net">
        <link href="https://fonts.bunny.net/css?family=figtree:400,600&display=swap" rel="stylesheet" />
    </head>
    <body class="antialiased">
        <div class="container">
            <main>
                <div class="py-5 text-center">
                    <a href="{{route('/')}}">
                        <img class="d-block mx-auto mb-4" src="{{asset('assets/images/logo.svg')}}" alt="" width="200">
                    </a>
                    <h1 class="d-inline">Welcome to Laravel!</h1> <small class="small align-top">v{{ Illuminate\Foundation\Application::VERSION }}</small>
                </div>
                <div class="row">
                    <div class="col-md-12">
                        <p>
                            PDF: <a href="{{asset($pdf)}}" target="_blank">{{asset($pdf)}}</a>
                        </p>
                    </div>
                </div>
                <div class="row">
                    <div class="col-md-12">
                        <embed src="{{asset($pdf)}}" type="application/pdf" width="100%" height="600px"/>
                    </div>
                </div>
                <div class="ml-4 text-center text-sm text-gray-500 dark:text-gray-400 sm:text-right sm:ml-0">
                    Laravel v{{ Illuminate\Foundation\Application::VERSION }} (PHP v{{ PHP_VERSION }})
                </div>
            </main>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-HwwvtgBNo3bZJJLYd8oVXjrBZt8cqVSpeBNS5n7C8IVInixGAoxmnlMuBnhbgrkm" crossorigin="anonymous"></script>
    </body>
</html>

Crear enlace con link

Verificar que el directorio storage/app/public/reports exista, en caso de que no, crearlo manualmente.

php artisan storage:link

Iniciar el proyecto

php artisan serve

Abrir el enlace http://127.0.0.1:8000/reports

El proyecto completo lo pueden descargar de GitHub

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *