La classe Print

cs.bspkComponent.Print imprime des formulaires 4D de votre application, sur une imprimante ou en PDF, avec des en-têtes répétés à chaque page, un pied de page poussé en bas de page, la pagination, et des objets qui s'agrandissent selon leur contenu.

Un exemple

$vo_Param:={vt_Mode: "pdf"; vt_TypeFile: "pdf"; vb_Erase: True; vb_Preview: False}
$vo_Param.vt_PathFolder:=Folder(Data folder; *).folder("temporary files").platformPath  // se termine par un séparateur
$vo_Param.vt_Filename:="Commande_"+$vt_Numero
$Print:=cs.bspkComponent.Print.new($vo_Param)   // ouvre le travail d'impression
If ($vo_Param.vb_OK_Print)
	vo_Form:=New object                         // variable process de VOTRE application, lue par le formulaire
	vo_Form.vt_Numero:=$vt_Numero
	$Print.printForm("CommandePrint"; Form header)
	$Print.printForm("CommandePrint"; Form header1; "H2_ovt_Fournisseur")  // l'objet s'agrandit selon son texte
	// à partir d'ici, ces taquets sont réimprimés en haut de chaque nouvelle page
	$Print.vc_ConstantMarkerHeader:=New collection(Form header4; Form header5)
	$Print.vb_HeaderPage:=True
	$vc_Bloc:=[{vt_FormName: "CommandePrint"; vl_ConstantMarker: Form detail; vl_NumberMarker: 1}; \
		{vt_FormName: "CommandePrint"; vl_ConstantMarker: Form break0; vl_NumberMarker: 1}]
	For each ($Ligne; $Commande.Lignes)
		vo_Form.vt_Designation:=$Ligne.designation
		If (Not($Print.canPrintBloc($vc_Bloc; True; 0)))   // la ligne et la fermeture ne tiennent plus
			$Print.printForm("CommandePrint"; Form break0)
			$Print.nextPage(False; "CommandePrint")         // imprime le pied, nouvelle page
		End if
		$Print.printForm("CommandePrint"; Form detail; "Body_ovt_Designation")
	End for each
	$Print.printForm("CommandePrint"; Form break0)
	$Print.printForm("CommandePrint"; Form footer)
	$Print.endPrint()
End if
return $Print.vt_PathFile

Trois règles :

  • toujours new() d'abord (il ouvre le travail d'impression) et endPrint() à la fin ;
  • la méthode formulaire d'un formulaire imprimé est BSPK_EXEC_FC ;
  • chaque formulaire imprimé garde ses deux derniers taquets à 1 pixel d'écart.

Les paramètres du constructeur

PropriétéPar défautRôle
vt_Mode"print""print" (imprimante), "pdf" (fichier), "file" (PDF envoyé au navigateur, dans une requête web)
vt_PathFolder—Le dossier du fichier, terminé par un séparateur. Vide : un dialogue de choix s'ouvre. Créé s'il n'existe pas.
vt_Filename, vt_TypeFile"Print", "pdf"Le nom du fichier, sans extension, et l'extension.
vb_EraseFauxFaux : un fichier existant est gardé, le nouveau reçoit un suffixe (n).
vb_PreviewVraiEn mode "pdf", ouvre le PDF à la fin.
vl_Orientation1L'orientation de la page.
vb_NeedPrintSettingvrai en mode "print"Affiche les dialogues de réglage d'impression.
vc_ConstantMarkerHeader[]Les taquets réimprimés en haut de chaque page (ou un seul : vl_ConstantMarkerHeader).
vb_FooterEndPageVraiPousse le pied de page en bas de page.
vt_Lang—La langue des traductions pendant l'impression.
vt_Printer, vl_NumberCopy, vl_Scale, vl_PaperWidth / vl_PaperHeight, vl_DoubleSided, vl_RangeStart / vl_RangeEnd—Transmis aux options d'impression de 4D.

Il n'y a pas de réglage de marges : elles sont mises à zéro.

Les fonctions

FonctionRôle
printForm($formulaire; $taquet; $objetAgrandi; $finDePage)Imprime une zone du formulaire. Si elle ne tient plus, imprime le pied et passe à la page suivante ; imprime l'en-tête de page si besoin. $objetAgrandi : le ou les objets (séparés par ;) à agrandir selon leur contenu, dont le bas est sur le taquet.
canPrintBloc($zones; $avecPied; $marge) → BooléenCe groupe de zones tient-il encore dans la page ?
nextPage($sansPied; $formulaire)Termine la page (avec ou sans pied).
endPrint()Ferme l'impression, ouvre le PDF ou l'envoie au navigateur. Ne renvoie rien.

Le fichier produit est dans $Print.vt_PathFile. Pour l'envoyer par mail : $Mail.addAttachements($Print.vt_PathFile; "Commande.pdf") (voir La classe Mail).

Le composant imprime vos formulaires par la méthode BSPH_Print_Form de votre projet : ne la supprimez pas.

Selon la plateforme

  • Sous Windows, le PDF passe par le pilote Generic PDF driver s'il est installé, sinon par Microsoft Print to PDF. L'imprimante courante n'est pas restaurée après l'impression.
  • Sous macOS, par la sortie PDF de 4D.
  • Sur 4D Server, évitez les modes qui ouvrent des dialogues (choix du dossier, réglages d'impression).

Bon à savoir

  • Avec vb_Preview, le composant ouvre déjà le PDF : ne l'ouvrez pas une seconde fois.
  • Si le choix du dossier est annulé, aucun chemin de fichier n'est défini.
  • vo_Form est une variable process de votre application : initialisez-la après new().

Voir aussi