Composition de documents

Discussions about image processing and document imaging.
Post Reply
Fabrice Caritey
Posts: 10
Joined: Mon May 21, 2007 7:24 pm

Composition de documents

Post by Fabrice Caritey » Mon May 21, 2007 7:35 pm

Bonjour, j'aimerais composer un document à l'aide de fichiers images et de pdf ainsi que de multi tiff. j'ai acheté gdpicture pro ce WE et y suis parvenu, mais pour cela j'utilise deux objets (1 gdpicture , et 1 gdviewer) et le presse papier ce qui n'est pas tres optimisé. Y aurait il moyen d'acceder directement au handle HBITMAP d'une page grâce à son numéro de page sans la copier dans le clipboard.

Voici mon code :

Code: Select all

  'viewer temporaire 
  tmpgdViewer4.Clear()
        
  If ePdf Then
      tmpgdViewer4.DisplayFromPdfFile(vpath)
  Else
      tmpgdViewer4.DisplayFromFile(vpath)
  End If
        
  'transfert des pages dans le bon viewer
  Label_info.Text = "Import des pages en cours ..."
  tmpgdViewer4.DisplayFirstFrame()
  For page As Integer = 0 To tmpgdViewer4.NumPages - 1
        Dim vIntPtr As IntPtr
        Label_info.Text = "Import page " + (page + 1).ToString + "/" + tmpgdViewer4.NumPages.ToString + " en cours ..."
        tmpgdViewer4.Copy2Clipboard()
        Indice = nImageCount + pagesidlengthbefore
        vIntPtr = New Bitmap(Clipboard.GetImage()).GetHbitmap
        Clipboard.Clear()
        imgId = oGdPicture.CreateImageFromHBitmap(vIntPtr)
        DeleteObject(vIntPtr)
        'tableau contenant les images id des pages en memoire dans gdpicture
        ReDim Preserve pagesId(Indice)
        pagesId(Indice) = imgId
           
        tmpgdViewer4.DisplayNextFrame()
        nImageCount = nImageCount + 1
  Next page

  tmpgdViewer4.ClosePicture()
désolé l'indentation passe pas ...

User avatar
Loïc
Site Admin
Posts: 5881
Joined: Tue Oct 17, 2006 10:48 pm
Location: France
Contact:

GetnativeImage / SetnativeImage

Post by Loïc » Tue May 22, 2007 10:54 am

Bonjour,

Vous pouvez effectivement optimiser votre code.
Il existe effectivement une méthode dans la classe GdViewer permettant de récupérer le handle d'une image, et une autre dans la classe cGdPicture permettant d'affecter une image native par rapport à son handle...


Voici le bout de code à supprimer:

Code: Select all

tmpgdViewer4.Copy2Clipboard() 
vIntPtr = New Bitmap(Clipboard.GetImage()).GetHbitmap 
Clipboard.Clear() 
imgId = oGdPicture.CreateImageFromHBitmap(vIntPtr) 
DeleteObject(vIntPtr) 
Vous pouvez tout simplement le remplacer par:

Code: Select all

oGdPicture.SetNativeImage(tmpgdViewer4.GetnativeImage())

Cordialement,

Loïc Carrère


PS: Pour l'indentation je crois qu'il faut utiliser la balise Code.

Fabrice Caritey
Posts: 10
Joined: Mon May 21, 2007 7:24 pm

Post by Fabrice Caritey » Wed May 23, 2007 11:07 pm

Merci, j'avais essayé avec setnativeimage, mais j'obtenais toujours que la premiere page, et j'avais laissé tombé, ça devait être un bug de ma part.

Toutefois j'ai ré-essayé avec votre code, je tombe sur un comportement étrange. les images disparaissent de la mémoire. Je m'explique, j'ai fait un petit gestionnaire de thumbnail, quand on clique sur la thumbnail on affiche dans un gdviewer l'image avec le handle contenu dans pagesid(1) etc.. pour les autres thumbnails. Avec votre code, le programme me fabrique bien les thumbnails au chargement des nouvelles pages dans l'objet gdpicture, mais quand je clique sur la thumbnail , j'ai une page blanche dans le visualisateur , j'ai donc perdu l'image au passage.


Code: Select all

 tmpgdViewer4.DisplayFirstFrame()
        For page As Integer = 0 To tmpgdViewer4.NumPages - 1

            oGdPicture.SetNativeImage(tmpgdViewer4.GetNativeImage())
            imgId = oGdPicture.GetNativeImage
            ReDim Preserve pagesId(Indice)
            pagesId(Indice) = imgId
            ReDim Preserve thumbsId(Indice)
            thumbsId(Indice) = oGdPicture.MakeThumbnail(70, 99)
            
            tmpgdViewer4.DisplayNextFrame()
            indice=indice + 1
        Next page
        tmpgdViewer4.ClosePicture()


Fabrice Caritey
Posts: 10
Joined: Mon May 21, 2007 7:24 pm

Post by Fabrice Caritey » Wed May 23, 2007 11:16 pm

je pense que ca vient du closepicture de tmpgdviewer4

alors j'ai essayé de rajouter un

Code: Select all

imgId = oGdPicture.CreateClonedImage(lastimgid)
avec lastimgid qui est egal à ogdpicture.GetNativeImage()

Dans ce cas tout va bien pour toutes les images, par contre au moindre chargement d'un pdf dans tmpgdviewer4, la ligne de code juste après tmpgdviwer4.closepicture(), fait exploser VB avec une exception de sécurité de office (je vois pas ce qu'office vient faire là d'ailleurs...).

User avatar
Loïc
Site Admin
Posts: 5881
Joined: Tue Oct 17, 2006 10:48 pm
Location: France
Contact:

Post by Loïc » Thu May 24, 2007 11:40 am

Bonjour,

Sans votre code complet ça m'est dificile d'identifier la source de l'erreur.

J'ai créé une petite appli en vb.net 2005 que vous pouvez télécharger ici: https://www.gdpicture.com/ressources/sup ... bsdemo.zip


Cette appli contient 1 objet gdviewer appelé PdfViewer ainsi que 4 autres objets gdviewer appelés respectivement Thumb1, Thumb2, Thumb3, et Thumb4. Aussi j'ai rajouté un bouton Button1.


Voici le code utilisé:

Code: Select all

Public Class Form1
    Dim pagesId() As Long

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oGdPicture As New GdpicturePro.cGdPicture
        Dim nCpt As Long

        oGdPicture.SetLicenceNumber("0372923568336516353471224 ") 'Evaluation key valid until 25 May 2007 https://www.gdpicture.com/demo.php
        PdfViewer.SetLicenceNumber("0372923568336516353471224 ") 'Evaluation key valid until 25 May 2007 https://www.gdpicture.com/demo.php
        PdfViewer.SetIsedQuickPDFLicenceNumber("354538350271B47ED3104F7CEC6FED8E ") 'Evaluation key valid until 4 June 2007 https://www.gdpicture.com/demo.php
        PdfViewer.DisplayFromPdfFile("c:\test.pdf")
        'Thumbnails creation
        ReDim Preserve pagesId(4)
        pagesId(0) = oGdPicture.CreateThumbnail(PdfViewer.GetNativeImage, 100, 100)
        For nCpt = 1 To 3
            PdfViewer.DisplayNextFrame()
            pagesId(nCpt) = oGdPicture.CreateThumbnail(PdfViewer.GetNativeImage, 100, 100)
        Next
        PdfViewer.ClosePicture()
        'Displaying thumbnails
        Thumb1.SetLicenceNumber("0372923568336516353471224 ") 'Evaluation key valid until 25 May 2007 https://www.gdpicture.com/demo.php
        Thumb1.DisplayFromImageRef(pagesId(0))
        Thumb3.SetLicenceNumber("0372923568336516353471224 ") 'Evaluation key valid until 25 May 2007 https://www.gdpicture.com/demo.php
        Thumb2.DisplayFromImageRef(pagesId(1))
        Thumb3.SetLicenceNumber("0372923568336516353471224 ") 'Evaluation key valid until 25 May 2007 https://www.gdpicture.com/demo.php
        Thumb3.DisplayFromImageRef(pagesId(2))
        Thumb4.SetLicenceNumber("0372923568336516353471224 ") 'Evaluation key valid until 25 May 2007 https://www.gdpicture.com/demo.php
        Thumb4.DisplayFromImageRef(pagesId(3))
    End Sub
End Class

Cette procédure est evidement fonctionelle et ne me cause aucun trouble.


Cordialement,

Loïc Carrère

User avatar
Loïc
Site Admin
Posts: 5881
Joined: Tue Oct 17, 2006 10:48 pm
Location: France
Contact:

Post by Loïc » Thu May 24, 2007 11:42 am

Sinon si votre problème persiste et que l'état d'avancement de votre projet n'induit pas une quelconque confidentialité, vous pouvez me l'envoyer à cette adresse: esupport (at) gdpicture (dot) com. Ainsi je vous corrigerai votre erreur.


Cordialement,

Loïc Carrère
Last edited by Loïc on Thu May 24, 2007 2:25 pm, edited 1 time in total.

Fabrice Caritey
Posts: 10
Joined: Mon May 21, 2007 7:24 pm

Post by Fabrice Caritey » Thu May 24, 2007 2:06 pm

merci pour votre réactivité, je vais vous envoyer un projet light , comportant la partie qui pose souci, d'ici ce WE . Il n'y a rien d'urgent ni de bloquant.

User avatar
Loïc
Site Admin
Posts: 5881
Joined: Tue Oct 17, 2006 10:48 pm
Location: France
Contact:

Post by Loïc » Thu May 24, 2007 2:25 pm

Ok ça marche, j'attends donc votre email.

Cordialement,

Loïc Carrère

User avatar
Loïc
Site Admin
Posts: 5881
Joined: Tue Oct 17, 2006 10:48 pm
Location: France
Contact:

Post by Loïc » Fri May 25, 2007 10:28 am

Bonjour,

C'est bien ce qui me semblait. L'erreur provient d'un autre endroit dans votre code. Ce n'est pas la génération d'imagettes qui pose problème.

Voici votre erreur:

Vous récupérez dans un tableau pagesId() les valeurs retournées par la méthode GetNativeImage() du controle GdViewer pour chaque page affichée.

Le problème c'est qu'à chaque changement de page dans le fichier PDF l'objet image généré précédement est systématiquement détruit par le composant gdviewer. Il ne vous reste donc dans votre tableau que des pointeurs vers des zones mémoires libérées ou réutilisées par d'autres processus (d'ou l'erreur générée par office).

Si vous voulez conserver en mémoire tous les objets images générés par le control GdViewer (ce que je vous déconseil fortement car votre application va consomer beaucoup de mémoire) je vous suggère de faire un second appel à la méthode MakeThumbnail en passant comme valeurs de paramètres de dimentions les dimentions réelles de l'image source.

Ceci dit, je ne comprends pas trop l'interrêt de faire ça. Si vous avez besoin de réafficher une page du pdf courant il vous suffit d'utiliser la méthode DisplayFrame()

Voilà j'espère que ça va vous aider à résoudre votre problème.

Cordialement,

Loïc Carrère

Fabrice Caritey
Posts: 10
Joined: Mon May 21, 2007 7:24 pm

Post by Fabrice Caritey » Fri May 25, 2007 3:11 pm

merci pour toutes ces infos, je comprend maintenant mieux l'endroit ou ça crashait et pourquoi. Je ne pensais pas que l'objet etait detruit entre chaque displayframe. l'interet de garder tout cela en mémoire est de pouvoir agir sur le document et l'ordre des pages et de pouvoir composer interactivement un document à partir de multiples sources, pdf tif , gif jpeg , plusieurs pdf etc... de pouvoir enlever des pages et appliquer des focntions sur les pages. Tout cela afin de permettre a l'utilisateur de se composer un document complet.

Effectivement c'est énorme en mémoire. Une solution sera peut etre de passer par des sauvegardes à la volée et des pages temporaires sur disque. Tout cela est pour l'instant au stade étude de faisabilité.

User avatar
Loïc
Site Admin
Posts: 5881
Joined: Tue Oct 17, 2006 10:48 pm
Location: France
Contact:

Post by Loïc » Fri May 25, 2007 4:14 pm

Ok je comprends ainsi pourquoi vous tenez à récupérer le handle de chaque image...

Comme vous l'avez dit le mieux est de passer par des fichiers temporaires.


Cordialement,

Loïc Carrère

Post Reply

Who is online

Users browsing this forum: No registered users and 2 guests