Drukowanie raportów Jasper z Oracle Apex - część 2

Z tego tutoriala dowiesz się jak zintegrować Oracle Apex z serwerem raportów Jasper. Jeśli nie wiesz jak zainstalować i skonfigurować środowisko Jasper Reports, przeczytaj nasz wcześniejszy poradnik. Dowiesz się z niego które komponenty potrzebujesz i jak przygotować i udostępnić swój pierwszy raport.

Tworzenie strony w Oracle Apex

Najczęściej potrzeba jest następująca. W Apex przechodzimy do strony gdzie mamy przycisk "drukuj" lub "pobierz" po którego wciśnięciu możemy pobrać lub wyświetlić dokument. Przycisk powowoduje połączenie się danym adresem URL do którego wysyłamy dane logowania i dodatkowe parametry jak np numer faktury czy zakres czasowy raportu.

Nasz przycisk nazywać się będzie "generate_document". Po jego utworzeniu przejdź do zakładki "Processing" i utwórz nowy proces - "create process". Nadaj mu nazwę "call_jasper". Typ procesu to "PL/SQL Code". W sekcji "Server-side conditions" wybierz "When button pressed" i przycisk "generate_document".

Ważne: pamiętaj by we właściwościach strony, w sekcji "Advanced => Reload on Submit" ustawić "Always". Inaczej po wciśnięcku przycisku otrzymasz komunikat:

Error: SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

Tworzenie procedury PL SQL

Jasper Server udostępnia REST API, zbudować wiec musimy procedurę która połączy się z tym API - wyśle dane logowania, dodatkowe parametry i pobierze dokument. Proces autoryzacji jest oddzielony od pobierania dokumentu w Jasper Server REST API. Musimy wiec wykonać dwa zapytania. W pierwszym autoryzujemy się. W drugim pobieramy dokument.

Nasza procedura, która pobierze raport z kolekcji przykładowych raportów po zainstalowaniu Jasper Server wygląda następująco:

DECLARE
  v_blob                 BLOB;
  v_file_name            VARCHAR2 (25) := 'Employees.pdf';
  v_vcContentDisposition VARCHAR2 (25)  := 'inline';

  v_offer_id VARCHAR2(10) := :OFFER_ID; -- your offer ID
  v_hostname   VARCHAR2(30) := 'localhost'; -- your hostname, eg: localhost
  v_port       NUMBER       := '8080'; -- port of JasperReports Server, eg: 8080
  v_username   VARCHAR2(50) := 'jasperadmin'; -- jasper server username
  v_password   VARCHAR2(50) := 'jasperadmin' -- jasper server password

  v_jasper_string VARCHAR2(30) := v_username || ';' || v_password;

  v_login_url  VARCHAR2(100):=
    'http://' || v_hostname || ':' || v_port || '/jasperserver/rest_v2/login';
  -- modify URL to your needs
  v_report_url VARCHAR2(100):=
    'http://' || v_hostname || ':' || v_port || '/jasperserver/rest_v2/reports/analysis/reports/' || v_file_name;
BEGIN
  -- log into jasper server
-- you can also use POST method and send j_username & j_password as headers

  v_blob := apex_web_service.make_rest_request_b(
    p_url => v_login_url,
    p_http_method => 'GET',
    p_parm_name => apex_util.string_to_table('j_username;j_password',';'),
    p_parm_value => apex_util.string_to_table(v_jasper_string,';')
  );
  -- download file
  v_blob := apex_web_service.make_rest_request_b(

    p_url => v_report_url,
    p_http_method => 'GET',
    p_parm_name => apex_util.string_to_table('offer_id',';'),
    p_parm_value => apex_util.string_to_table(v_offer_id,';')

  );

  --OWA_UTIL.mime_header ('application/pdf', FALSE);  -- view your pdf file
  OWA_UTIL.MIME_HEADER( 'application/octet', FALSE ); -- download your pdf file
  HTP.p('Content-Length: ' || DBMS_LOB.GETLENGTH(v_blob));
  HTP.p('Content-Disposition: ' || v_vcContentDisposition ||'; filename="' || v_file_name || '"');
  OWA_UTIL.http_header_close;
  WPG_DOCLOAD.DOWNLOAD_FILE(v_blob);

  APEX_APPLICATION.STOP_APEX_ENGINE;

EXCEPTION

  WHEN OTHERS THEN
    RAISE;
END;

Jeśli wprowadzisz tę procedurę (login i hasło oraz scieżka do testowego raportu zadziała z domyślnymi ustawieniami serwera po instalacji, zmień URL do właściwego) po zapisaniu zmian i kliknięciu na przycisk generujący dokument powinno wyskoczyć okno z pobieranym dokumentem.

Zauważ że procedura zawiera parametry dokumentu - "p_param_name". By pobrać raport "Employees.pdf" nie potrzebujesz tych parametrów. Użyj ich do własnych raportów.

Pobieranie dokumentu z servera Jasper w innym formacie

O formacie dokumentu który otrzymasz z serwera decyduje rozszerzenie raportu. Jeśli zmienisz nazwę z "Employees.pdf" na "Employees.xlsx", otrzymasz dokument Excela.