• Accueil / Salesforce / Génération de PDF…
, Génération de PDF avec un plug-in Salesforce CLI<span class="wtr-time-wrap after-title"><span class="wtr-time-number">3</span> minutes de lecture</span>

Génération de PDF avec un plug-in Salesforce CLI3 minutes de lecture


, Génération de PDF avec un plug-in Salesforce CLI<span class="wtr-time-wrap after-title"><span class="wtr-time-number">3</span> minutes de lecture</span>

introduction

Ouais, je sais, une autre semaine, un autre plug-in. Malheureusement, il est probable que
continuer pendant un certain temps, car mes plug-ins ne sont vraiment limités que par mon
imagination. Je pense que celui-ci est plutôt cool et j’espère, cher lecteur,
tu es d’accord.

Lors de Dreamforce 2019, Salesforce a lancé Evergreen – une technologie pour permettre
Les microservices Heroku doivent être appelés de manière transparente depuis Apex (et d’autres endroits).
L’un des cas d’utilisation d’Evergreen est la création d’un PDF à partir de données Salesforce, et un
des lignes de sangle autour de ceci est qu’avec Evergreen vous avez accès au
tout l’écosystème de packages Node. Chaque fois que j’entends ça, je pense que c’est vrai
mais les plug-ins CLI ont le même accès, car ils sont construits sur le nœud, et comme
Evergreen, aucune authentification supplémentaire n’est requise.

C’est essentiellement le contraire d’Evergreen – plutôt que d’invoquer quelque chose
qui vit sur un autre serveur qui renvoie un fichier PDF, j’appelle une commande locale
qui écrit un fichier dans le système de fichiers local. J’ai joué avec l’idée d’appeler
ce plug-in Deciduous, mais a décidé que ce n’était qu’un long nom à taper,
et je devrais l’expliquer beaucoup! (et oui je sais qu’Evergreen est beaucoup plus
que de créer un PDF, mais j’ai aimé l’image alors j’ai décidé de l’accompagner).

Le plug-in est disponible sur NPM – vous pouvez l’installer en exécutant: plugins sfdx: installez bbpdf

Modèles EJS

Je ne vais pas entrer trop dans les détails dans cet article sur la création de
le HTML via EJS, mais si vous voulez plus d’informations, consultez mon article de blog sur
comment je l’ai utilisé dans mon
plug-in bbdoc
pour créer des documents HTML à partir des métadonnées Salesforce.

Mon plug-in nécessite deux indicateurs pour spécifier le modèle. Le nom du
template lui-même, spécifié via l’indicateur –template / -t, et les templates
répertoire, spécifié via l’indicateur –template-dir / -d. La raison pour laquelle j’ai besoin du
répertoire est que tout css ou image requis par le modèle sera spécifié
par rapport à l’emplacement du modèle. Vous pouvez voir que cela fonctionne en clonant le
repo d’échantillons et l’essayer.

Données Salesforce

Mon plug-in fournit deux mécanismes pour récupérer des données depuis Salesforce.

Paramètre de requête

C’est pour le cas d’utilisation simple où le modèle nécessite un seul enregistrement.
La requête de récupération de l’enregistrement est fournie via le
–requete/-q drapeau.

L’interrogation des données Salesforce à partir d’un plug-in est assez simple, je précise
que j’ai besoin d’un nom d’utilisateur qui me garantit l’accès à une organisation:

protected static requiresUsername = true;

puis je crée une connexion:

const conn = this.org.getConnection();

et enfin j’exécute la requête, basée sur le paramètre fourni, et vérifie
Les resultats:

const result = await conn.query(this.flags.query);

if (!result.records || result.records.length 

Une fois que j'ai l'enregistrement, je dois transmettre les données Salesforce dans un objet à
le modèle, avec le nom de propriété attendu par le modèle, et c'est
fourni par l'utilisateur via le --sobjet/-s
drapeau.

C'est un peu maladroit cependant, alors voici l'itinéraire préféré.

Fichier de requête

Un fichier de requête est spécifié via le
--query-file/-F
drapeau. Il s'agit d'un fichier au format JSON contenant un objet avec une propriété
par requête:

{
    "contact": {
        "single": true,
        "query": "select Title, FirstName, LastName from Contact where id='00380000023TUDeAAO'"
    },
    "account": {
        "single": true,
        "query": "select id, Name from Account where id='0018000000eqTV7AAM'"
    }
}

Le nom de la propriété est le nom qui sera fourni au modèle EJS - dans
cet exemple, deux propriétés seront transmises au modèle - contact et
Compte. La propriété single spécifie si la requête aboutira à
un seul enregistrement ou un tableau, et la propriété de requête spécifie le SOQL réel
requête qui sera exécutée. En utilisant ce mécanisme, n'importe quel nombre d'enregistrements ou
des tableaux d'enregistrements peuvent être transmis au modèle.

Générer le PDF

Dans un thème récurrent de cet article, il existe plusieurs façons de générer le
PDF à partir du HTML. Le plus simple en termes de configuration et de code est d'utiliser le
html-pdf
package, qui est une enveloppe autour
PhantomJS. Bien que simple,
c'est sous-optimal - le paquet n'a pas été mis à jour depuis un certain temps, développement
sur Phantom est suspendu et lorsque j'ai ajouté ceci à mon plug-in, npm a signalé un
vulnérabilité critique, donc clairement un autre moyen serait nécessaire.

Le mécanisme privilégié sur les interwebs était d'utiliser
Marionnettiste
(api de nœud de chrome sans tête), alors je me suis mis à ce sujet. Après quelques sauts de cerceau
autour de la création de répertoires temporaires et de la copie des modèles et associés
fichiers autour, ce n'était pas trop mal. J'ai chargé le HTML à partir du fichier qui
J'avais créé puis demandé une version PDF de celui-ci:

const page = await browser.newPage();

await page.goto('file:///' + htmlFile, {waitUntil: 'networkidle0'});
const pdf = await page.pdf({ format: 'A4' });

Un domaine dans lequel j'ai légèrement fait du hors-piste n'utilisait pas de chrome associé à
marionnettiste, je compte plutôt sur l'utilisateur définissant une variable d'environnement pour
leur installation locale de chrome et je l'utilise. Principalement parce que je n'ai pas
je veux que mon plug-in télécharge 2 à 300 Mo avant de pouvoir être utilisé. Ceci peut
causer des problèmes sur toute la ligne, alors mettez en garde le vide.

La variable d'environnement en question est PUPPETEER_EXECUTABLE_PATH. Ici
sont les définitions de mon Macbook Pro exécutant MacOS Catalina:

export PUPPETEER_EXECUTABLE_PATH = "/ Applications / Google
Chrome.app/Contents/MacOS/Google Chrome "

et ma Surface Pro exécutant Windows 10:

setx PUPPETEER_EXECUTABLE_PATH "C: Program Files
(x86) Google Chrome Application chrome.exe "

Le PDF est ensuite écrit à l'emplacement spécifié par le
--production/-o drapeau.

Le prochain cercle à franchir est apparu lorsque j'ai installé le plug-in - Puppeteer
est actuellement à la version 3.3.0, ce qui nécessite le nœud 10.18.1 mais la version du nœud CLI Salesforce est 10.15.3. Heureusement, j'ai pu passer à la version 2.1.1 de Puppeteer sans introduire de
d'autres problèmes.

Repo d'échantillons

, Génération de PDF avec un plug-in Salesforce CLI<span class="wtr-time-wrap after-title"><span class="wtr-time-number">3</span> minutes de lecture</span>

Il y a beaucoup d'informations dans cet article et un certain nombre de drapeaux pour envelopper votre
faites le tour - si vous souhaitez vous lancer directement avec des exemples pratiques, vérifiez
en dehors de
repo d'échantillons. Cela a quelques exemples de commandes à essayer - assurez-vous simplement que vous
définissez correctement votre emplacement Chrome - et les fichiers PDF générés lorsque je
a exécuté le plug-in contre mes organisations de développement.

Articles Similaires





Source de l'article traduit automatiquement en Français

Besoin d'aide ?
Voulez-vous utiliser Pardot à sa capacité maximale et avoir
+ DE LEADS QUALIFIÉS

Notre analyse de votre Pardot offerte dès aujourd'hui
Merci, vous pouvez compléter notre questionnaire
Nous allons revenir vers vous rapidement !

Fermer