PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Zone répétée et aperçu de pages PDF
Zone répétée et aperçu de pages PDF
Débuté par Julien V, 04 déc. 2018 15:59 - 3 réponses
Membre enregistré
134 messages
Posté le 04 décembre 2018 - 15:59
Bonjour,

Je rencontre actuellement des difficultés pour alimenter une zone répétée contenant un champ image qui doit faire apparaitre une vignette pour chaque page d'un document PDF.

Soit :

- une variable chemin contenant le chemin vers le fichier PDF
- une zone répétée ZR_pages contenant :
- un champ IMG_apercu
- les attributs ATT_apercu (lié à la valeur de IMG_apercu) et ATT_apercu_page (lié à la valeur NuméroPage de IMG_apercu).

Ci-dessous le code d'alimentation de la zone répétée :
SELON fExtraitChemin( chemin, fExtension )

CAS ~= ".pdf" :

jMax = PDFNombreDePages( chemin )
POUR j = 1 À jMax

k = ZoneRépétéeAjouteLigne( ZR_pages )
ZR_pages[ k ].ATT_apercu = chemin
ZR_pages[ k ].ATT_apercu_page = j

FIN // POUR j = 1 À jMax

FIN // SELON fExtraitChemin( chemin, fExtension )


La zone répétée s'alimente bien et plutôt rapidement.



Par contre, la navigation au scroll est un vrai calvaire sur les fichiers volumineux.

J'ai voulu partir sur une piste de copie d'image cachée avec un champ IMG_apercu_PDF hors écran avec le code suivant :

IMG_apercu_PDF = chemin

jMax = PDFNombreDePages( chemin )
POUR j = 1 À jMax
IMG_apercu_PDF..NuméroPage = j
buffer = dSauveImagePNG( IMG_apercu_PDF, enMémoire )
ZR_pages[ k ].ATT_apercu = buffer
FIN // POUR j = 1 À jMax

Là c'est l'inverse, la navigation est OK par contre la génération des images est super lente.
Je me retrouve aussi avec des bords noirs là où ça devrait être transparent.

J'ai essayé avec dcopie, mais le rendu est très mauvais avec problème de proportions et d'opacité...

Est-ce qu'il y aurait un moyen de positionner la bonne page sur une image hors écran (IMG_apercu_PDF) et faire une copie simple du champ vers une image de zone répétée en respectant les proportions et l'opacité ?
Membre enregistré
134 messages
Posté le 05 décembre 2018 - 10:22
Pour le moment la solution cracra que j'ai trouvée est de mettre une image temporaire lors du scroll avec le code suivant :

Evénement( lproc_maj_pages_scroll, "ZR_pages", WM_VSCROLL )

Procedure lproc_maj_pages_scroll( _message <utile>, _wParam, _lParam <utile> )

i, iMax est un entier

SELON _wParam

CAS 8 : // SB_ENDSCROLL, fin du scroll

iMax = ZoneRépétéeOccurrence( ZR_pages )
POUR i = 1 À iMax

SI fExtraitChemin( ZR_pages[ i ].ATT_chemin, fExtension ) ~= ".pdf" ALORS
ZR_pages[ i ].ATT_apercu = ZR_pages[ i ].ATT_chemin
FIN // SI fExtraitChemin( ZR_pages[ i ].ATT_chemin, fExtension ) ~= ".pdf" ALORS

FIN // POUR i = 1 a imax

AUTRE CAS :

iMax = ZoneRépétéeOccurrence( ZR_pages )
POUR i = 1 À iMax

SI fExtraitChemin( ZR_pages[ i ].ATT_chemin, fExtension ) ~= ".pdf" ALORS
ZR_pages[ i ].ATT_apercu = IMG_apercu_TMP
FIN // SI fExtraitChemin( ZR_pages[ i ].ATT_chemin, fExtension ) ~= ".pdf" ALORS

FIN // POUR i = 1 a imax

FIN // SELON _wParam

Il y a quand même un temps de latence lors du réaffichage des vignettes.

Et bon, il doit forcément y avoir une solution pour afficher la bonne vignette et avoir un scroll normal
Message modifié, 05 décembre 2018 - 10:26
Membre enregistré
134 messages
Posté le 05 décembre 2018 - 16:53
Désolé de spammer sur ce problème, je pense que j'y suis presque...

Si je fais un mix champ image caché et variable image comme suit
Image est une Image

IMG_apercu_PDF = _document.fichiers[ i ].chemin

jMax = PDFNombreDePages( _document.fichiers[ i ].chemin )

POUR j = 1 À jMax

k = ZoneRépétéeAjouteLigne( ZR_pages )

IMG_apercu_PDF..NuméroPage = j
VariableRAZ( Image )
dDébutDessin( Image, dEffacer + dAvecOpacité )
Image.Largeur = IMG_apercu_PDF..Largeur
Image.Hauteur = IMG_apercu_PDF..Hauteur
dCopie( IMG_apercu_PDF, Image, 0, 0, IMG_apercu_PDF..Largeur, IMG_apercu_PDF..Hauteur, 0, 0, Image.Largeur, Image.Hauteur )

ZR_pages[ k ].ATT_apercu = Image

FIN // POUR j = 1 À jMax

J'ai une génération rapide des vignettes, un scroll normal

MAIS avec uniquement la première page du PDF sur toutes les vignettes alors que je positionne bien IMG_apercu_PDF..NuméroPage = j avant de faire la copie...
Membre enregistré
134 messages
Posté le 06 décembre 2018 - 11:38
Bonjour,

Pour ceux que ça intéresse, ci-dessous une solution qui fonctionne plutôt pas mal :

Procedure lproc_initialiser()

i, iMax, j est un entier
chemin est une chaîne
buffer est un Buffer

// Chemin du fichier PDF
chemin = "C:\test.pdf"

// On place le PDF dans un buffer
buffer = fChargeBuffer( chemin )

// RAZ de la zone répétée
ZoneRépétéeSupprimeTout( ZR_pages )
ZR_pages..AffichageActif = Faux

// On boucle sur le nombre de pages du PDF
iMax = PDFNombreDePages( chemin )
POUR i = 1 À iMax

// Pour chaque page on ajoute une ligne à la zone répétée
j = ZoneRépétéeAjouteLigne( ZR_pages )

// On appelle la procédure de génération d'apercu
ZR_pages[ j ].ATT_apercu = _iproc_apercu( i )

FIN // POUR i = 1 À iMax

ZR_pages..AffichageActif = Vrai

PROCEDURE INTERNE _iproc_apercu( _i est un entier )

// On crée dynamiquement un champ image invisible
// en Homothétique centré
c est un Champ
c <- ChampCrée( DonneGUID(), typImage, 0, 0, 100, 150, Faux )
c..ImageMode = imgHC

// On affecte avec le buffer, positionné sur la bonne page
c = buffer
c..NuméroPage = _i

// On fait une copie dans une variable image
img est une Image
VariableRAZ( img )
dDébutDessin( img, dEffacer + dAvecOpacité )
img.Largeur = c..Largeur
img.Hauteur = c..Hauteur
dCopie( c, img, 0, 0, c..Largeur, c..Hauteur, 0, 0, img.Largeur, img.Hauteur )

// Suppression du champ
ChampSupprime( c )

// Renvoi de la variable image
RENVOYER img

FIN // PROCÉDURE INTERNE _iproc_apercu( _i est un entier )