Bonjour,
J'ai fait une commande qui permet d'envoyer dans une OUTQ un fichier binaire provenant de l'IFS tel quel sans la moindre modification.
Le problème est que cela fonctionne seulement "presque" comme je le souhaiterais
Je vous présente ici mon développement et en dessous mon problème.
Ci-dessous les sources :
Le *CMD PRTRAWLe CLLE PRTRAWC
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CMD PROMPT('Impr RAW d''un fichier IFS') PARM KWD(IFSFILE) TYPE(*CHAR) LEN(256) MIN(1) EXPR(*YES) PROMPT('FICHIER IFS') PARM KWD(OUTQ) TYPE(QUAL1) MIN(1) PROMPT('Nom de l''OUTQ') PARM KWD(TYPE) TYPE(*CHAR) LEN(4) RSTD(*YES) DFT(*PDF) SPCVAL((*PDF)) PROMPT('Type de fichier') QUAL1: QUAL TYPE(*NAME) LEN(10) MIN(1) QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) SPCVAL((*LIBL) (*CURLIB)) PROMPT('Bibliothèque')Le C PRTRAW£
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 pgm parm(&ifsfile &outq &type) /****************************************************************/ /* ATTENTION : BLANCS INTERDITS DANS LE NOM DE FICHIER &ifsfile */ /****************************************************************/ dcl var(&ifsfile) type(*char) len(256) /* Nom complet avec chemin du fichier brut */ dcl var(&outq) type(*char) len(20) /* Nom de l'outq destinataire nom+bib */ dcl var(&type) type(*char) len(4) /* Type de fichier : *PDF, ... */ dcl var(&cmd) type(*char) len(1000) /* Commande QSH */ dcl var(&pcl) type(*char) len(22) /* Nom du fichier temporaire PCL */ dcl var(&numtrav) type(*char) len(6) /* Numéro du travail */ dcl var(&noutq) type(*char) len(10) /* Nom de l'outq destinataire */ dcl var(&boutq) type(*char) len(10) /* Bibliothèque de l'outq destinataire */ rtvjoba nbr(&numtrav) chgvar var(&pcl) value('/tmp/avirer_' *cat &numtrav *cat '.pcl') if cond(&type *eq '*PDF') then(do) /* Variable d'environnement nécessaire pour le pgm ghostscript */ addenvvar envvar(GS_LIB) replace(*yes) + value('/QOpenSys/usr/local/bin:+ /QOpenSys/usr/local/share/ghostscript/8.54/lib:+ /QOpenSys/usr/local/share/ghostscript/8.54/Resource/fonts') /* Conversion du PDF en PCL */ chgvar var(&cmd) + value('/QOpenSys/usr/local/bin/gs -q -dQUIET -dBATCH -dNOPAUSE ' *cat + '-dNORANGEPAGESIZE -sPAPERSIZE=a4 -sDEVICE=ljet4 -sOutputFile="' *cat + &pcl *tcat '" -f ' *cat &ifsfile *bcat '> /dev/null 2>&1') strqsh cmd(&cmd) enddo /* Impression en raw du fichier PCL */ chgvar var(&noutq) value(%sst(&outq 1 10)) chgvar var(&boutq) value(%sst(&outq 11 10)) ovrprtf file(qsysprt) tofile(qsys/qsysprt) outq(&boutq/&noutq) + rplunprt(*no) devtype(*userascii) spool(*yes) ovrscope(*job) /* ovrscope(*job) car prtraw£ qui est un pgm C n'est pas dans le même actgrp */ call pgm(util/prtraw£) parm(&pcl) dltovr file(qsysprt) lvl(*job) /* Suppression du fichier PCL temporaire */ del objlnk(&pcl) fin:endpgmLes commandes pour la compilation de tout cela
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 /*****************************************************/ /* Ce programme doit être compilé avec les options : */ /* SYSIFCOPT(*IFSIO) et TGTCCSID(*HEX) */ /*****************************************************************************************************/ /* argv[1] est le nom complet du fichier IFS par ex /home/bafolrg/test.pcl */ /* voir : http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.ibm.as400.misc/2006-07/msg00274.html */ /*****************************************************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <recio.h> #define LONG_ENREG_PRTF 132 int main(int argc, char *argv[]) { FILE *FichierEntree; _RFILE *prtf; char buffer[LONG_ENREG_PRTF+1]; char ModeEcritureFichierPRTF[50]; int len; FichierEntree = fopen(argv[1], "rb, o_ccsid=65535"); if(FichierEntree == NULL) return(1); sprintf(ModeEcritureFichierPRTF, "wr, lrecl=%d", LONG_ENREG_PRTF); prtf = _Ropen("QSYSPRT", ModeEcritureFichierPRTF); memset(buffer, 0x00, sizeof(buffer)); len = fread(buffer, sizeof(char), LONG_ENREG_PRTF, FichierEntree); while(len>0) { _Rwrite(prtf, buffer, LONG_ENREG_PRTF); memset(buffer, 0x00, sizeof(buffer)); len = fread(buffer, sizeof(char), LONG_ENREG_PRTF, FichierEntree); } _Rclose(prtf); fclose(FichierEntree); return 0; }Maintenant le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 crtbndc pgm(util/prtraw£) srcfile(util/qsrcspool) output(*print) sysifcopt(*ifsio) tgtccsid(*hex) crtbndcl pgm(util/prtrawc) srcfile(util/qsrcspool) dftactgrp(*no) actgrp(*caller) crtcmd cmd(util/prtraw) srcfile(util/qsrcspool) pgm(util/prtrawc)
Avec la commande suivante seule, le fichier PDF ne s'imprime pas et il ne se passe strictement rien sur l'imprimante :En revanche les commandes suivantes impriment le PDF correctement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part PRTRAW IFSFILE('/home/outq/FRKO_WAG_2/KS735831.pdf') OUTQ(BAFOINFO)Le programme bizarre fait la chose suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CALL PGM(util/bizarre) PRTRAW IFSFILE('/home/outq/FRKO_WAG_2/KS735831.pdf') OUTQ(BAFOINFO)et le contenu de bizarre£ est on ne peu plus simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 pgm crtbndrpg pgm(qtemp/bizarre£) srcfile(util/qsrcspool) dftactgrp(*no) actgrp(SPOOL) output(*none) replace(*yes) fin:endpgmEt pour chaque impression de PDF que je veux faire, si je ne lance pas la compilation de ce programme bizarre£ qui n'est jamais utilisé, cela ne fonctionne pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part c seton lr
Je n'arrive pas à faire le moindre lien entre l'impression correcte et la compilation du programme bizarre£
Est-ce une histoire de groupe d'activation ? D'ovrprtf incorrect ?
Qui a une idée ?
Ou bien suis-je condamné à compiler avant chaque impression ?
A oui encore une info : je suis en V5R3
Partager