Automatiser l’impression d’un état en PDF via PDFCreator

Ces articles pourraient également vous intéresser...

67 réponses

  1. Terry dit :

    Est-ce qu’il est possible de développer VBA en utilisant ” MSaccess” et “Nuance PDF converter”? Mon client me dit qu’il n’arrive pas a trouver le code pour utiliser Nuance en VBA?

    • Hervé Inisan dit :

      Sur le site de Nuance Converter, je n’ai pas trouvé d’API de programmation. Ça impliquerait effectivement qu’il n’y a de solution native pour piloter Nuance Converter.
      Les pistes que j’aurais seraient de modifier l’imprimante par défaut (activer Nuance), et d’imprimer un état ensuite.

  2. Yannick dit :

    Bonjour,

    J’aimerai pouvoir depuis une application access, générer depuis un document PDF déjà existant, qui contient plusieurs pages, un fichier pour chaque page de ce document.

    Pour le moment j’ai trouvé le code qui permet d’ouvrir à l’écran ce fameux fichier PDF, mais depuis, j’ai la bras ankylosés à force de ramer sur le sable de mon seuil d’incompétence.

    Alors je lance un HELP de chez HELP.

    Yannick

    • Hervé Inisan dit :

      Si le PDF est déjà créé, Access n’a aucun outil pour extraire chaque page (ce n’est pas son métier).
      Un outil comme PDFtk peut sans doute faire l’affaire (on peut l’utiliser via une interface graphique ou en ligne de commande).

  3. Elie dit :

    Bonjour,

    J’ai access 2013 et j’utilise votre code et il fonctionne très bien pour la version 1.7.3 de pdfCreator, par contre pour la nouvelle version 2.0.2 il ne fonctionne pas. Pensez vous à l’occasion pouvoir nous aider avec un module adapté à la nouvelle version 2.0.2

    Merci encore pour vos excellents tutos

    • Hervé Inisan dit :

      Merci pour le retour, je vais tester sur la nouvelle version.
      Pour info : ça coince à quel endroit du code ?

      • Elie dit :

        ça coince en premier lieu ici
        ‘ Instancier un nouvel objet PDFCreator
        Set pdfc = New clsPDFCreator

        bien que dans la référence j’ai modifié la référence en cochant la nouvelle fournit avec pdfcreator

        • Hervé Inisan dit :

          Si ça coince aussi tôt, c’est que les noms ou les types d’objets ont été changés. Je vais télécharger une version récente dès que possible, et je posterai un article sur le sujet.

          • bonjour

            j’utilise ce type de macro depuis longtemps et j’ai le même problème qu’Elie sur le pc d’une personne ayant la version plus recente de PDF Creator. Avez vous pu trouver la bonne commande ?

            big merci
            fmi

          • Hervé Inisan dit :

            J’attends encore un peu avant d’adapter les articles : depuis la version 1.9 (environ) de PDFCreator, ils sont en train de faire évoluer leur interface COM, donc le modèle objet utilisé en VBA. Le problème est que cette interface n’est pas encore stabilisée, les choses peuvent encore évoluer.

  4. Christophe dit :

    Bonjour,

    J’ai deux petites questions, est-il possible d’ouvrir automatiquement le fichier créer ?
    Serait-il difficile t’intégrer une fonction envoie par mail ?

    Je vous remercie
    Christophe

  5. Aboutitrite dit :

    Merci beaucoup Hervé.
    Je vais essayer ça.

  6. Hervé Inisan dit :

    Aboutitrite > Cet autre article du blog devrait plus convenir à tes besoins (le nom du PDF est variable dans l’exemple donné en lien).

  7. Aboutitrite dit :

    Merci pour tous,
    Mon problème est, je veux imprimer en pdf chaque enregistrement d’état qui prend la clé comme nom du fichier pdf. je n’arrive pas !
    Merci de votre aide.

  8. Hervé Inisan dit :

    Stéphane Fortin > Généralement, ce genre de phénomène est dû à un problème de références. Est-ce que la référence PDFCreator est correctement cochée ? Est-ce qu’il y a des références signalées “manquantes” ?

  9. Stéphane Fortin dit :

    Petite sitation particulière, aussitôt que je crée le module avec le script ci-haut mentionné pour imprimer mes États Access avec PDFcreator j’obtiens un message d’erreur “Erreur de compilation dans l’expression ‘Mid([T_Personne.NM],9,3)’”. Semble bien que la fonction Mid() ne repond plus avec le script en question.

    Assitôt que je supprime le module, je peux ouvrir mes états qui contiennent des Mid().

    Y a-t-il une solution pour rectifier le problème?

    Merci beaucoup!

    Stéphane

  10. Hervé Inisan dit :

    Florent > Merci pour le retour. C’est bien aussi quand ça marche ! :)

  11. Florent dit :

    Un petit commentaire non pas pour soulever un problème mais pour dire que tout a bien fonctionné sous Access2003/Win XP. Un état à imprimer en PDF en le découpant en 291 états renommés, en appliquant l’exemple 4 avec une boucle associée pour définir le nom de chq pdf, boucle sur une table contenant les 291 noms. Bravo et merci

  12. Hervé Inisan dit :

    2M > Ce ne sera sans doute pas une boucle For Each, mais plutôt une boucle While. L’idée est de lancer l’impression d’un état filtré pour chaque document PDF séparé. Pas clair, hein ?! Concrètement : si j’ai 1000 clients, et que 30 m’intéressent (1 page chacun), j’invoque SaveAsPDF avec le paramètre strWhere (voir exemple 2) de manière à filtrer sur 1 seul client à la fois. Dans le cas des clients, le filtre se fera sur le numéro de client par exemple.

    Dans ton cas, quel critère permettra d’isoler chaque page ?

  13. 2M dit :

    Hervé Inisan > Oui exactement, je souhaite imprimer chaque page de l’etat sur un PDF. J’ai essayé de modifier le code VBA mais je n’y arrive pas.

    Il me faudrait ce code dans une boucle For Each…

  14. Hervé Inisan dit :

    2M > En fait, au sens Access, un état est un seul document avec un ensemble de pages. J’imagine que la question est plutôt : “comment imprimer séparément les différentes pages d’un état ?”

  15. 2M dit :

    Bonjour,

    Comment faire pour generer un PDF par état ? au lieu d’un PDF avec tous les états.

    Merci pour votre aide.

  16. Hervé Inisan dit :

    juanma > A priori, ça veut dire que le contexte dans lequel l’instruction a été appelé n’est pas bon. En plus clair : au moment où le OpenReport est invoqué, il est impossible d’imprimer un état, ou l’état n’est pas disponible. Est-ce que l’état existe bien ? N’est pas ouvert en mode Création ?

  17. juanma dit :

    “la commande ou l’action open.report n’est pas disponible pour le moment”.
    C’est ce que j’obtiens avec access 2003.
    J’aimerais savoir ce qui cloche.
    merci pour ce billet si intéressant.

  18. Hervé Inisan dit :

    Fabien > Merci pour le retour !

  19. Fabien dit :

    Cette fois ci c’est la bonne :-)
    Pour que l’état soit généré en couleur et non en noir et blanc :
    …/
    DefaultPrinter = .cDefaultPrinter
    .cDefaultPrinter = “PDFCreator”
    .cClearCache

    ‘Pour forcer le mode couleur
    ‘Ouverture en preview mode caché du rapport
    DoCmd.OpenReport strReportName, acViewPreview, , strWhere, acHidden
    ‘Forçage du parametre couleur pour l’imprimante
    Reports(strReportName).Printer.ColorMode = acPRCMColor

    ‘ Imprimer l’état
    DoCmd.OpenReport strReportName, acViewNormal, , strWhere
    ‘Fermeture du rapport
    DoCmd.Close acReport, strReportName, acSaveNo
    /….

    @+

  20. Fabien dit :

    stp Annule mon commentaire précédent.
    Celà devait être un coup de chance.
    Aprés de nouveaux essais le fichier est toujours en noir et blanc :-(
    Désolé
    @+

  21. Fabien dit :

    Bonjour,
    Merci à Hervé pour ce source. Toujours aussi futé ;-)
    Pour le soucis de génération du document en noir & blanc alors qu’il devrait être en couleur, la commande Application.Printer.ColorMode = acPRCMColor juste avant le DoCmd.OpenReport strReportName, acViewNormal, , strWhere régle le probléme dans mon cas.
    @+

  22. Kro dit :

    Un grand merci a Herve pour son code save as pdf que j’ai redecoupe sans vergogne. Et merci a NooB pour l’adresse du magicien Lebans. J’avoue que n’ayant rien compris, c’est vraiment par acquis de conscience que j’ai installe les 2 fichiers dll dans le meme dossier que ma base et au miracle :Ca fonctionne; J’ai beau relancer le code 12 fois pas de bug , je suis presque confiante dans la 13eme fois. A bientot et merci

  23. Hervé Inisan dit :

    Le NooB > Effectivement, les outils de Lebans sont généralement très bien, c’est une forme de vaudou qui marche. :-)

    Le seul truc, depuis quelque temps : Lebans étant “retiré d’Access”, ces outils ne vont sans doute plus évoluer, et le support n’est plus assuré.

  24. Le NooB dit :

    Si le code plante, l’impression est redirigée sur l’imprimante papier, et encore, pas toujours =).
    Je crois que c’est lié à la version d’Access. Pour ma part, cela arrivait de façon aléatoire, je pouvais imprimer une 20aine de pdf, et planter sur le 21ème. Parfois le premier. Redémarrage de la machine, rien n’y fait. Le lendemain matin, ça peut remarcher…. Limite vaudou, l’exorcisme c’est deux posts plus haut =)

  25. Hervé Inisan dit :

    TuneUp > Curieux effectivement. C’est un bug que je ne reproduis pas sur ma machine. Est-ce que tu as essayé les toutes dernières versions de PDFCreator, au cas où ?

  26. Le NooB dit :

    Pour Sabine et Chachamars
    J’utilise 2003 aussi, ainsi que 2002. Pas de “saveaspdf” donc. J’utilisais PDFCreator (routine PDFForge relayée par Cafeine)depuis bien six ans.

    Le problème c’est qu’il y a toujours un moment où ça plante et je n’ai jamais trouvé pourquoi… “OpenReport”.. “C’est trop lent” “la commande n’est pas disponible pour l’instant”… Je préfère ne pas penser au temps que j’y ai passé.

    Et j’ai trouvé la méthode “Lebans”. Lui part d’un snapshot pour faire un pdf. Simple comme bonjour pour paramétrer le chemin et nom de fichier. Et cerise sur le gâteau, livré avec un outil qui lie deux pdf en un seul.

    http://www.lebans.com/reporttopdf.h

  27. Tuneup dit :

    Merci Hervé pour ton code!

    J’ai le même soucis que Sabine, je travaille avec Access 2003
    et PDFCreator est bien installé.

    La tâche est redirigée vers l’imprimante…

    Que faire ?

  28. Hervé Inisan dit :

    Sabine > PDFCreator est bien installé sur la machine ? (même si ce n’est pas l’imprimante par défaut)

  29. Deseint Sabine dit :

    Merci pour ce code qui à l’air simple à priori.
    Mais chez moi çà ne fonctionne pas.
    Je travaille avec ACCESS 2003.
    C’est la commande Openreport qui fonctionne pas : elle imprime l’état sous format papier avec une imprimante qui n’est même pas configurée par défaut ??!!
    Pourquoi çà ne fonctionne pas chez moi :(

  30. tijan dit :

    A force de ramer je suis parvenu à quelque chose qui fonctionne (Cf. plus bas); probablement pas très propre, mais ça marche. Le seul défaut que je n’arrive pas à corriger, c’est l’ouverture de la boite de dialogue de pdfCreator autant de fois que j’ai de page (il doit y avoir une option mais je ne trouve pas laquelle).
    Merci aux bonnes âmes …

    Private Sub Commande98_Click()
    Dim Enr As DAO.Recordset
    Dim i As String
    Dim j As String
    Set Enr = CurrentDb.OpenRecordset(“SELECT COLL_Communes_SIBVV.NOM_DOSSIER_Commune, Parcelle_riveraine.Code_parcelle FROM Parcelle_riveraine LEFT JOIN COLL_Communes_SIBVV ON Parcelle_riveraine.Code_INSEE = COLL_Communes_SIBVV.INSEE;”, dbOpenDynaset)
    Enr.MoveFirst
    Do Until Enr.EOF
    i = Enr!Code_parcelle
    j = Enr!NOM_DOSSIER_Commune
    SaveAsPDF “EDIT_FICHE_PARCELLE”, (“Parcelle_riveraine.Code_parcelle =’” & i & “‘”), i, (“\Rivieredoc_riviereCARTO_RIVIEREATLASFICHES_PARCELLES” + j)
    Enr.MoveNext
    Loop
    End Sub

  31. tijan dit :

    Bonjour,
    Merci pour votre réponse. J’utilise déjà la fonction “where” du SaveAsPDF (j’ai un bouton dans le formulaire, qui déclenche l’impression de l’Etat pour l’enregistrement en cours d’affichage, en utilisant la fonction Me![NomDeChamp_ID]).
    Mais ce que je n’arrive pas à faire, c’est de boucler la procédure, en m’inspirant de votre code (trouvé dans “developpez.com”) :

    Dim i As Long
    DoCmd.OpenReport “Commandes”, acViewPreview
    For i = 1 To Reports(“Commandes”).Pages
    DoCmd.PrintOut acPages, i, i
    Next

    J’ai tenté ceci :
    Dim i As Long
    DoCmd.OpenReport “EDIT_FICHE_PARCELLE”, acViewNormal
    For i = 1 To Reports(EDIT_FICHE_PARCELLE).Pages
    SaveAsPDF “EDIT_FICHE_PARCELLE”, “[Code_parcelle]=” i, Me![Code_parcelle], (“\Rivieredoc_riviereCARTO_RIVIEREATLASFICHES_PARCELLES” + Me![NOM_DOSSIER_Commune])
    Next

    Mais ça ne marche pas …
    Merci par avance si vous avez une idée.

  32. Hervé Inisan dit :

    tijan > Sur le principe, il faut sans doute imprimer 500 fois l’état, en le filtrant à chaque fois sur un critère qui permet d’extraire la bonne page (la clef primaire, j’imagine).

    L’exemple 2 de l’article montre comment filtrer. Maintenant, quel serait le champ à utiliser pour le filtre (et son type de données) ?

  33. tijan dit :

    Bonjour,
    J’utilise ce code, très pratique, pour générer des pdf à partir d’Etat Access.
    Je voudrais aujourd’hui générer des pdf ‘page par page’ à partir d’un état qui comporte 500 pages, et que chaque pdf prenne le nom de l’élément contenu dans chaque page de l’état. Je n’y arrive pas : auriez vous une idée à me proposer ?
    Par avance merci.

  34. audren dit :

    J’ai le même problème que tito2009: je n’arrive pas à imprimer en couleur.
    Quelquu’un a-t-il trouvé une solution ?

  35. Hervé Inisan dit :

    tito2009 > Est-ce que ça marche en changeant directement le réglage de couleur dans les propriétés de PDFCreator (via l’icône Imprimantes du Panneau de configuration) ?

  36. tito2009 dit :

    Bonjour Hervé,

    Tout d’abord, un grand merci pour les différentes explications données sur ce site.
    J’utilise le code fourni pour l’impression d’états au format Pdf. Je constate que le fichier pdf obtenu est en noir et blanc.
    J’ai recherché dans l’explorateur d’objets la propriété permettant de paramétrer les couleurs mais je ne l’ai pas trouvée.

    D’avance merci pour votre réponse

  37. chachamars dit :

    J’ai essayé les aménagements donnés par Olive, mais rien n’a changé….
    j’ai essayé des délais plus longs aussi…..sans résultat….

    ce bug est très aléatoire, parce que ça fait plusieurs jours maintenant que tout se passe sans souci !!!!sans aucune intervention de ma part et sans changement de config sur mon poste ;) bizarre !!!!
    Merci encore !

  38. Hervé Inisan dit :

    chachamars > Ça viendrait donc d’un problème de PDFCreator, sur l’enchaînement d’états. Est-ce que tu as essayé avec un délai plus long, ou avec les aménagements donnés plus haut par Olive ?

  39. chachamars dit :

    la portion de code qui pose pbm est “docmd.openreport…..”
    le message d’erreur est “action ou commande non disponible pour le moment”…
    des fois ça ne pose aucun souci, des fois ça bug….
    même en redémarrant le pc avant de lancer le traitement ça ne change rien…

    De plus, j’ai un souci à la première impression : le logo de PDF creator s’affiche bien près de l’horloge mais avec un point rouge. IL faut donc que j’ouvre le moniteur PDF creator pour cliquer sur le logo de l’imprimante, afin qu’il devienne vert, et mon pdf est alors lancé….les suivants n’ont pas de pbm ensuite..
    si je ne fais pas cette manip’, le message “temps écoulé” s’affiche…

    Merci d’avance pour vos réponses.

    Merci pour vos réponses

  40. Hervé Inisan dit :

    chachamars > Quelle est la portion de code exacte qui pose problème ?

  41. chachamars dit :

    Bonjour,

    je viens de récupérer ce code pour automatiser l’impression de plusieurs états en pdf.
    je parcours une table avec un recordset, chaque ligne repésentant un destinataire. Pour chaque destinataire, je souhaite donc éditer un état en pdf (j’applique donc le filtre destinataire =”rst.fields(0)”…)
    il arrive (pas tout le temps mais assez souvent) que le message d’erreur suivant apparaisse “action ouvrir Etat pas disponible”
    Savez comment y remédier ? merci d’avance pour vos réponses.

  42. Olive dit :

    Merci pour votre réponse. J’ai un peu bidouillé et ajouté à la fin de la procédure SaveAsPDF les lignes suivantes (à partir d’infos d’un forum):

    pdfc.cClearCache
    DoEvents
    pdfc.cClose
    Set pdfc = Nothing

    Ca a l’air de fonctionner normalement.
    Merci encore!

  43. Hervé Inisan dit :

    Olive > Ça peut être dû à plusieurs paramètres (configuration, bugs éventuels de PDFCreator). Je n’ai pas de solution directe, mais j’essaierais de mettre à jour la version de PDFCreator, dans un premier temps. Je vais pointer le code de mon côté pour voir s’il n’y a pas une variable qui ne serait pas correctement libérée…

  44. Olive dit :

    Bonjour,
    Merci beaucoup pour ce code et les explications!
    Je l’utilise pour imprimer un état depuis Access 2002 (sur win xp), mais j’ai un petit souci : aprés chaque impression pdfcreator reste actif et je ne peux imprimer un 2nd état dans la foulée. Par contre quand je supprime pdfcreator de la liste des processus, cela fonctionne à nouveau. Avez-vous une idée de où peut venir le problème?
    Merci!

  45. Bill dit :

    Merci Hervé, ça marche! Je vais maintenant m’attaquer à la suite de mon problème : envoyer automatiquement par mail comme pièce attachée le fichier créé
    La route est longue!
    Encore merci, l’aide a été précieuse.
    Bill

  46. Hervé Inisan dit :

    @Bill C’est possible, avec quelques aménagements dans le code. Je viens de poster sur cette page du blog un article qui donne une façon de faire dans Excel.

    Bons tests !

  47. Bill dit :

    Bonjour,
    C’est exactement ce que je voudrais faire(paramétrer le nom, le chemin du fichier pdf et ne plus avoir les messages de PDF)…mais sur excel .Pensez-vous que ce soit possible?
    Merci
    Bill

  48. Hervé Inisan dit :

    Tito > Comme l’état n’est pas ouvert à ce stade, on ne peut pas faire référence à un de ses champs. Mais il y a des chances pour que le formulaire sur lequel tu te trouves contienne ce champ. Du coup, si le code VBA se trouve dans le formulaire lui-même, ça donnerait quelque chose comme :

  49. Tito dit :

    Merci, c’est très utile.
    Et si je veux faire comme l’exemple 3 mais que le nom du fichier généré soit le contenu d’un champ de mon état, ça marche comment ?
    Merci d’avance

  50. Hervé Inisan dit :

    Guillaume > Je ne sais pas si on parle de la même chose mais le nom du PDF peut être modifié par le paramètre strPDFName (voir l’exemple 3 notamment).

  51. Guillaume dit :

    Bonjour,

    ces lignes de codes fonctionnent correctement, toutefois, comment peut-on lors de l’impression du pdf, entrer un nom d’enregistrement(avoir le choix)?

    merci

  52. Vorjb dit :

    Bonjour
    J’ai le même problème que SuperBaba. Sur 3 serveurs différents, j’ai utilisé ce code. Seul 1 serveur a bien voulu fonctionner en modifiant les durées de temporisations. Les deux autres m’affichent le message d’erreur. N’y aurait-il pas un paramétrage de PDFCreator pour qu’il soit opérationnel, ou bien peut-on se passer de la temporisation?

  53. Hervé Inisan dit :

    > SuperBaba : L’exemple de l’article a été testé sur la même config. De mon côté, j’ai noté quelques instabilités, parfois, dans PDFCreator. Que se passe-t-il si la machine est “fraîchement redémarrée” ? (sous-entendu : PDFCreator n’a pas encore été lancé). Autre piste : augmenter les durées de temporisations, en début de listing.

  54. SuperBaba dit :

    Bonjour,
    Je viens d’installer votre procédure, mais impossible de créer un fichier PDF, j’ai systématiquement le message d’averissement :
    ” Une erreur s’est produite : temps écoulé !” et aucun fichier PDF n’apparait dans le répertoire par defaut…
    Meci de votre aide
    Config: MSacces2003 sur XP-sp2

  55. Papthor dit :

    Bonjour,
    merci pour ce bout de code. Cependant pour éviter une page d’erreur (ERROR: syntaxerror OFFENDING COMMAND nostringval) générée systématiquement dans mon fichier PDF, j’ai ajouté cette ligne :
    .cOption(“StandardTitle”)=.cOption(“AutosaveFilename”)
    et maintenant ça marche.

    config: MSACESS97 sur W2K

  56. Hervé Inisan dit :

    Pour l’instant, je n’ai pas plus d’éléments. Une info quand même : PDFCreator n’est pas certifié 100% compatible avec Vista, même en version 0.9.5 (la toute dernière actuellement). Les problèmes viennent de la sécurité de Vista qui empêche certaines opérations de PDFCreator (voir ici).

  57. Bernard dit :

    Identique, puisque PDFcreator prend dans tous les cas le dossier par défaut, et le nom de fichier configuré par défaut pour l’enregistrement automatique. J’ai testé plusieurs dossiers et nom de fichier.

    Merci de t’interresser à ce problème.

  58. Hervé Inisan dit :

    Ca donnerait quoi en changeant le dossier utilisateur de l’exemple (“Mes documents”) par sa version Vista : “Documents” ?

  59. Bernard dit :

    Bonjour,

    J’ ai une application access97 sur Vista.
    La procédure ‘SaveAsPDF’ modifie bien l’imprimante par défaut, puis la remet, mais, si le fichier .pdf est bien créé, c’est exclusivement en paramétrant PDFCreator en enregistrement automatique, et les paramètres du chemin et du nom de fichier ne sont pas modifiés par les variables strPDFname et strdirectory.
    Nota, j’ai bien référencé la bibliotèque PDFcreator.

    Pouvez vous m’aider? Merci

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">