Sortie headless portable
Disponible depuis la version 2.384.100 comme un pipeline de sortie borné avec des API explicites de capture et de rendu
Capturez un rectangle pris en charge depuis un classeur Classic XLS ou XLSX sous Windows, transférez son instantané immuable, puis rendez en PDF, SVG ou PNG sous Linux ou macOS avec Free Pascal et Cairo natif
L'adaptateur de capture emploie le moteur du classeur ; la capture Windows utilise son service de géométrie par défaut, tandis que la capture native Linux et macOS peut fournir un service de géométrie FreeType/HarfBuzz explicite adossé aux fichiers de polices choisis par l'application
Le consommateur natif séparé accepte des scènes lxPortableRender via lxPortableCairo, sans Excel ni session de bureau ; son API de géométrie utilise aussi les unités existantes portables de vue de classeur et de géométrie de rendu
Le consommateur accepte une scène immuable ou un stream de transfert ; les exigences de plateforme pour charger et calculer des classeurs sont décrites séparément dans le support de Free Pascal
Capturer un rectangle d'un classeur existant
CaptureXLSPortableRenderSnapshot dans lxPortableWorkbookCapture accepte un IXLSWorkbook ou un IXLSXWorkbookOwner, avec des TXLSPortableRenderLimits explicites ou par défaut ; deux overloads supplémentaires acceptent des limites explicites suivies d'un fournisseur IXLSRenderGeometry limité à la vue de capture
SheetIndex ainsi que Row1, Col1, Row2, Col2 inclusifs sont en base un ; l'instantané résultant stocke des positions en base zéro relatives au rectangle capturé
program CaptureRectangle;
{$APPTYPE CONSOLE}
uses SysUtils, Classes, lxHandleX, lxPortableRender,
lxPortableWorkbookCapture;
var
Workbook: TXLSXWorkbook;
Owner: IXLSXWorkbookOwner;
Snapshot: IXLSPortableRenderSnapshot;
Stream: TFileStream;
begin
Workbook := TXLSXWorkbook.Create;
Owner := Workbook;
if Workbook.Open('report.xlsx') <> 1 then
raise Exception.Create('Cannot open report.xlsx');
Snapshot := CaptureXLSPortableRenderSnapshot(Owner, 1, 1, 1, 30, 6);
Stream := TFileStream.Create('report.hxrs', fmCreate);
try
SaveXLSPortableRenderSnapshot(Snapshot, Stream,
XLSDefaultPortableRenderLimits);
finally
Stream.Free;
end;
Owner := nil;
end.
Gardez l'interface propriétaire en vie tant que vous utilisez l'objet classeur ; libérez l'interface au lieu de libérer manuellement un classeur possédé par une interface
Pour le Classic XLS, utilisez TXLSWorkbook et IXLSWorkbook de lxHandle avec le même appel de capture
La capture lit les caches de formules existants et refuse toute formule du rectangle dépourvue de cache ; elle ne recalcule jamais implicitement, ne récupère jamais de données externes et n'enregistre jamais de nouveaux styles dans le classeur source
Recalculez explicitement avant la capture quand votre application a besoin de résultats de formules à jour ; un cache existant est rendu tel que stocké, donc la capture ne certifie pas sa fraîcheur
L'opération détient une vue de lecture et vérifie la génération du classeur avant de renvoyer le résultat ; l'instantané renvoyé est détaché de la possession du classeur et reste utilisable après la libération du classeur
Apparence et frontières de capture
L'instantané contient le texte d'affichage formaté, les dimensions physiques en points, les couleurs RGB résolues, les polices et alignements de cellules pris en charge, les remplissages, bordures et rectangles fusionnés complets ; les lignes et colonnes masquées ont une taille nulle
L'apparence de polices prise en charge comprend gras, italique, soulignement simple et barré ; l'apparence de cellules prise en charge comprend les remplissages unis, les alignements horizontaux gauche/centre/droite, les alignements verticaux haut/centre/bas, le renvoi à la ligne, la réduction et l'ordre de lecture de droite à gauche
Les bordures de classeur thin, medium, thick, hair, double, dotted, dashed et medium-dashed se mappent vers les styles de bordures portables et leurs largeurs en points ; les autres styles de bordures sont rejetés
Le texte enrichi pris en charge transporte les polices effectives des runs, les tailles en points, les couleurs RGB, le gras, l'italique, le soulignement simple, le barré ainsi que l'exposant ou l'indice au niveau du run ; les effets de police outline/shadow/vertical sur cellules simples, les styles de soulignement non pris en charge, les remplissages dégradés ou à motifs, les bordures diagonales, le retrait, la rotation de texte et les alignements non pris en charge sont rejetés
Un rectangle de capture doit contenir chaque cellule fusionnée en entier ; des fusions tronquées, chevauchantes ou incohérentes et des styles incompatibles le long d'un bord extérieur fusionné sont rejetés
Les arrière-plans de feuilles et les types de feuilles non pris en charge rejettent la capture ; les images PNG/JPEG prises en charge et les formes de texte rectangle/ellipse ordinaires des deux facades de classeurs sont capturées comme objets de scène ordonnés, avec les images de cellules XLSX, les cases à cocher Boolean et le sous-ensemble de graphiques XLSX en cache pris en charge décrit ci-dessous ; graphiques non pris en charge, presets de formes, WordArt, transformations groupées, contrôles flottants, slicers, Timelines et sparklines sont rejetés quand leurs empreintes résolues intersectent le rectangle
Un contenu non pris en charge dont l'empreinte est résoluble de façon fiable hors du rectangle peut coexister avec la capture ; une empreinte de dessin irrésoluble est rejetée au lieu d'omettre silencieusement un contenu potentiellement chevauchant
Le stylage de tables Classic intersectant le rectangle est rejeté ; les sections Table XLSX intégrées et personnalisées prises en charge sont résolues dans un contexte de styles détaché, avec des rayures à la taille de la section et des surcharges directes de format de cellule
Pour les remplissages unis ou différentiels implicites de Table importées prises en charge, le bgColor RGB fournit l'arrière-plan visible ; un fgColor RGB seul laisse l'arrière-plan hérité inchangé, et une section portant les deux couleurs utilise sa couleur d'arrière-plan
Les sections Table importées contenant une apparence que le résumé typé ne peut pas représenter sont rejetées quand la section s'applique, y compris soulignement, formats de nombre, gras/italique explicitement désactivés, jeux de polices, motif no-fill explicite et formes de couleurs non prises en charge ; une section sans rapport hors du rectangle capturé ne bloque pas la capture
La mise en forme conditionnelle prise en charge est appliquée sans évaluation de formules : comparaisons numériques ou de dates en cache contre des bornes numériques littérales, expressions littérales Boolean ou numériques, règles de contenance/préfixe/suffixe de texte, vides et erreurs ; l'apparence de priorité plus haute l'emporte par propriété prise en charge, et StopIfTrue XLSX arrête les règles de priorité plus basse
Les règles de texte Classic exigent une aiguille de chaîne littérale et ciblent les cellules à chaînes en cache ; les règles de texte XLSX emploient leurs critères de texte stockés
L'apparence différentielle prise en charge comprend les couleurs de thème résolues avec tint et les couleurs indexées simples ; les couleurs automatiques importées, un tint hors thème, un remplissage différentiel portant à la fois couleurs de premier et d'arrière-plan, et une bordure, un alignement, un barré ou toute autre apparence différentielle non représentée sont rejetés quand la règle correspondante s'applique
Les formules conditionnelles exigeant une évaluation, les règles d'agrégats ou dépendantes des dates, les échelles de couleurs, barres de données et jeux d'icônes sont rejetés là où ils apparaissent ; le nombre de règles de mise en forme conditionnelle qui se chevauchent est borné
La conversion Date1904 choisit la section de format numérique brute applicable avant d'appliquer le décalage calendaire ; les sections calendaires inactives ne changent pas l'affichage numérique ordinaire, et les valeurs Boolean restent Boolean
Une section calendaire Date1904 sélectionnée combinée à des conditions de format ou à des constructions de temps écoulé est rejetée ; les séparateurs de sections entre guillemets ou échappés sont aussi rejetés, et cette frontière ne bloque pas une section numérique ordinaire sélectionnée sous prétexte qu'une autre section est un format calendaire
Texte enrichi et scènes de dessins ordonnées
TXLSPortableCell.RichText est un tableau d'enregistrements TXLSPortableTextRun contenant Text, FontFamily, FontSizePoints, FontStyles, ColorRGB et BaselineShiftPoints ; le texte concaténé des runs doit être exactement égal au texte d'affichage de la cellule
Les runs XLSX héritent des propriétés omises de la police effective de la cellule capturée, formatage de tables et conditionnel pris en charge compris ; les indicateurs false explicitement affectés et les valeurs explicites none/baseline/couleur automatique passent outre l'héritage
Les shared strings et inline strings natives préservent les frontières de runs et les espaces ; les enfants de polices natives non pris en charge, attributs, espaces de noms, couleurs enrichies theme/indexed et annotations phonétiques sont rejetés au lieu de perdre silencieusement l'apparence visible
Les runs Classic résolvent leurs indices de polices BIFF stockés vers des polices effectives complètes de run ; les métadonnées phonétiques et les polices de runs non prises en charge sont rejetées, et la capture conserve la génération du classeur et les pools de styles
Les formes de texte Classic lisent les propriétés OfficeArt existantes et les runs de polices TXO sans créer de wrappers de dessin ni modifier le classeur ; les ancres emploient les dimensions réelles de lignes/colonnes et des offsets, les remplissages unis et contours pris en charge conservent leurs couleurs et largeurs, et les octets PNG/JPEG intégrés sont détachés avant transfert
Le texte des rectangles emploie les marges natives horizontales de 7,2 pt et verticales de 3,6 pt ; le texte des ellipses utilise en plus son rectangle de texte inscrit, gardant le texte ordinaire à l'intérieur du contour de la forme dans les deux facades de classeurs
Les conteneurs rectangle et ellipse Classic importés conservent leur texte et formatage typés ; des métadonnées natives de forme ou de groupe ignorées sans empreinte résolue rejettent explicitement la capture, tandis que des enregistrements de queue d'objet inconnus, extensions de dessin, rotations, remplissages non unis et styles de lignes non pris en charge rejettent un objet qui intersecte
Les ancres rectangle et ellipse XLSX à deux cellules importées acceptent des remplissages unis RGB explicites avec alpha, des contours unis ou dashed/dotted, des offsets d'ancres physiques et un seul paragraphe de texte enrichi ordinaire ; chaque run conserve sa police effective, sa taille en points, sa couleur, son gras, son italique, son soulignement simple et son barré, réinitialisations explicites de gras ou d'italique comprises
Le lecteur de formes importées réserve un stockage de travail XML brut avant l'analyse et vérifie de façon coopérative les budgets d'éléments, d'octets et de texte ; il conserve l'ordre de dessin du classeur et les baux de lecture sans créer de modèles de formes ni de cellules absentes
Propriétés de formes natives inconnues, effets, thèmes, rotations, transformations groupées, paragraphes multiples et types d'ancres non pris en charge sont rejetés explicitement ; une empreinte non prise en charge résolue hors du rectangle de capture ne bloque pas la région demandée
L'exposant et l'indice au niveau du run emploient les deux tiers de la taille de police du run et un décalage de baseline d'un tiers de sa taille d'origine en points ; une frontière de style coupant un cluster de mise en forme Unicode, ou une séquence CRLF traversant des frontières de runs incompatibles, est rejetée pendant la disposition native
TXLSPortableSceneObject transporte un Kind, des X, Y, Width, Height en points, un rectangle de clipping, des couleurs de remplissage/contour et une opacité, des points de chemin facultatifs, une cellule de texte ou des octets raster encodés et leurs dimensions
TXLSPortableSceneKind contient xpskRectangle, xpskEllipse, xpskPolyline, xpskPolygon, xpskText, xpskPNG et xpskJPEG ; l'ordre du tableau est l'ordre de dessin, les objets tardifs recouvrant les objets antérieurs
L'overload supplémentaire CreateXLSPortableRenderSnapshot accepte un tableau TXLSPortableSceneObjects ; interrogez IXLSPortableRenderSceneSnapshot pour des Objects et ObjectCount en base zéro, dont les getters renvoient des copies détachées, tableaux de runs, de points et raster compris
Les images de cellules et les chemins de cases à cocher précèdent les dessins flottants ; les dessins flottants conservent l'ordre du classeur, les ancres physiques et le clipping du viewport, et les formes de texte emploient la police minor du thème à 11 points avec des marges de texte horizontales de 7,2 points et verticales de 3,6 points
Les images PNG et JPEG sont décodées nativement après un preflight d'en-tête, de taille en pixels et d'octets ; les images flottantes prises en charge conservent la transparence et la géométrie d'étirement, tandis que les images de cellules tiennent à l'intérieur de la cellule ou du rectangle fusionné complet avec leur ratio d'aspect préservé
Recadrage, rotation, ombres, ajustement de luminance/gamma, tiling, compagnons SVG et liaisons live camera restent non pris en charge ; le XML d'images préservé est validé contre l'apparence prise en charge, donc images masquées, métadonnées imbriquées inconnues, propriétés en espaces de noms étrangers, géométrie d'images non rectangulaire et transformations non modélisées ne sont rejetées que si leur empreinte chevauche la capture
Les cases à cocher Boolean des cellules emploient une boîte vectorielle neutre au thème et une coche facultative, contrôles effectifs hérités des formats de lignes et de colonnes compris ; la marche des cellules demandée est bornée avant parcours, les autres types de contrôles et des valeurs de cases à cocher vides ou non Boolean sont rejetés, et les scènes de cellules prises en charge suppriment le texte de repli Boolean scalaire ou d'erreur d'image
Une case à cocher par défaut est une métadonnée d'insertion et ne fabrique pas de Boolean pour une cellule absente ; un effacement explicite de contrôle de cellule direct masque un contrôle hérité, tandis que les lectures de capture préservent l'absence clairsemée et la génération du classeur
XLSReadPortableImageDimensions valide un IHDR PNG borné ou une frame JPEG huit bits séquentielle/progressive prise en charge et renvoie sa largeur et sa hauteur déclarées ; le décodage reste la responsabilité du renderer
IXLSPortableSceneCaptureSource.ReadPortableSceneObjects emploie des coordonnées de classeur en base un et des coordonnées de scène en points relatives à la plage, valide la plage et les limites coopératives, et renvoie les compteurs consommés d'octets, de texte et d'éléments ; HasPortableCellScene identifie les cellules dont l'affichage scalaire est remplacé par leur scène capturée
En disposition native, CellCount compte les cellules de la grille et LineCount inclut aussi les objets de scène texte ; le CellIndex de ligne d'un objet texte vaut CellCount plus sa séquence en base zéro parmi les objets de scène texte, tandis que GetCellGeometry reste restreint aux cellules de la grille
Les instantanés scalaires continuent de se sérialiser en HXRSNP01 ; les instantanés contenant des runs ou des objets de scène se sérialisent en HXRSNP02, et le loader accepte les deux versions avec le même contrat immuable de possession et de retour en arrière de position d'entrée
Le budget combiné d'éléments compte les cellules stockées, les runs enrichis, les objets de scène et les points de chemins ; les limites d'octets couvrent les tableaux en staging et détachés, le texte, les payloads raster encodés et l'inspection bornée des métadonnées natives avant allocation
API d'instantanés portables
| Symbole | Contrat |
|---|---|
EXLSPortableRender | Exception levée pour des données d'instantané invalides, une apparence de capture non prise en charge, un backend natif indisponible, des limites de ressources ou des échecs de rendu |
TXLSPortableFontStyle, TXLSPortableFontStyles | xpfsBold, xpfsItalic, xpfsUnderline et xpfsStrikeout, combinés en un ensemble |
TXLSPortableHorizontal, TXLSPortableVertical | xphLeft, xphCenter, xphRight et xpvTop, xpvCenter, xpvBottom |
TXLSPortableBorderStyle, TXLSPortableBorder | xpbsNone, xpbsSolid, xpbsDashed, xpbsDotted et xpbsDouble ; chaque bordure transporte Style, WidthPoints et ColorRGB |
TXLSPortableCell | Row/Column en base zéro, RowSpan/ColumnSpan positifs, Text d'affichage, FontFamily, FontSizePoints, FontStyles, TextColorRGB, FillColorRGB, HasFill, WrapText, ShrinkToFit, RightToLeft, Horizontal, Vertical et quatre enregistrements LeftBorder/TopBorder/RightBorder/BottomBorder |
TXLSPortableCells, TXLSPortableSizes | Tableaux dynamiques des cellules stockées et des tailles physiques de lignes/colonnes en points |
TXLSPortableRenderLimits | MaxGridCells, MaxStoredCells, MaxBytes et MaxTextCharacters bornent construction, capture et sérialisation |
XLSDefaultPortableRenderLimits | Renvoie 2000000 cellules de grille, 2000000 cellules stockées, 67108864 octets et 16777216 caractères de texte UTF-16 |
XLSDefaultPortableCell | Initialise une étendue d'une cellule avec Calibri à 11 points et une apparence par défaut à zéro ; réglez sa position et l'apparence voulue avant construction |
CreateXLSPortableRenderSnapshot | Valide et copie génération, hauteurs de lignes, largeurs de colonnes et cellules stockées vers une interface immuable détachée ; les cellules doivent être uniques, dans l'ordre ligne par ligne, dans les bornes et à étendues sans chevauchement |
IXLSPortableRenderSnapshot | Generation, RowCount, ColumnCount, CellCount en lecture seule, RowHeightPoints, ColumnWidthPoints en base zéro et enregistrements Cells copiés |
| Méthodes getter de l'instantané | GetGeneration, GetRowCount, GetColumnCount, GetCellCount, GetRowHeight, GetColumnWidth et GetCell exposent les mêmes valeurs ; un accès indexé invalide lève une exception |
SaveXLSPortableRenderSnapshot | Valide et sérialise un instantané vers un tampon privé borné, puis copie le payload complet HXRSNP01 ou HXRSNP02 dans le stream fourni à sa position courante |
LoadXLSPortableRenderSnapshot | Lit l'instantané versionné little-endian avec du texte UTF-8 strict, valide compteurs, géométrie, styles et étendues, et rejette les données résiduelles ; un échec restaure la position du stream d'entrée |
Toutes les limites doivent être positives ; le maximum validé est de 2000000 cellules de grille/stockées, 1073741824 octets et 268435456 caractères de texte, avec des dimensions d'au plus 1048576 lignes par 16384 colonnes
MaxGridCells compte le rectangle entier, cellules vides non stockées comprises ; CellCount compte les cellules visibles stockées et les ancres fusionnées, et peut être plus petit
Generation enregistre la génération source ou une valeur fournie par l'application ; c'est une métadonnée, pas un lien actif vers un classeur ni une vérification automatique de fraîcheur
Rendu natif et polices explicites
XLSPortableCairoBackendAvailable signale la disponibilité du backend natif compilé ; la sortie native exige Free Pascal sous Linux ou macOS, avec les bibliothèques Cairo, FreeType, HarfBuzz et FriBidi disponibles pour le processus
Les builds macOS lient explicitement les quatre bibliothèques natives ; un préfixe de dépendances privé et un chemin de loader explicite de processus enfant peuvent les fournir sans modifier les réglages partagés du compilateur ni les profils shell
Sous Windows, Delphi XE5 en Win32 et Win64 peut compiler les interfaces portables et utiliser la sérialisation d'instantanés, mais la préparation de disposition Cairo native y signale l'indisponibilité du backend
Passez une chaîne de polices explicite à PrepareXLSPortableCairoLayout ; le renderer essaie d'abord la famille et le style gras/italique correspondants, puis les replis de même style dans l'ordre fourni, en exigeant une couverture de glyphes pour chaque cluster de texte pris en charge
Fournissez les fichiers regular, bold, italic et bold-italic réellement requis par votre contenu capturé ; aucune découverte de polices système ni substitution synthétique de gras/italique n'a lieu, et des fichiers, mappages de styles ou couvertures de glyphes manquants sont rejetés
Les octets de polices sont capturés avant le shaping, donc modifier un fichier affecte les dispositions ultérieures tandis qu'une disposition existante conserve ses octets capturés ; FaceIndex choisit la face non négative dans un fichier ou une collection de polices
Les opérations natives sont sérialisées pour la sécurité des faces FreeType ; les instantanés immuables et l'inspection des dispositions préparées n'exigent pas de classeur actif
Fonts[0].FamilyName := 'Calibri'; Fonts[0].FileName := '/srv/fonts/Regular.ttf'; Fonts[0].FaceIndex := 0; Fonts[0].Bold := False; Fonts[0].Italic := False;
Ici Calibri est un alias de famille explicite pour le fichier choisi, ce qui autorise un mappage de polices contrôlé par l'application ; inspectez les métriques de sortie quand vous mappez vers une police différente
Le renderer accepte les sauts de ligne durs, l'expansion des tabulations en quatre espaces, l'ordre bidirectionnel des paragraphes, les ligatures et signes diacritiques façonnés, le renvoi glouton et la réduction pour tenir ; le renvoi prime sur la réduction
Le renvoi préserve les frontières de clusters implémentées de signes diacritiques, de sélecteurs de variation, de ZWJ et de virama, et privilégie les espaces et espaces idéographiques ; ce n'est ni une implémentation complète des graphèmes UAX #29 ni l'algorithme Unicode de coupure de lignes, et les frontières de renvoi des regional-indicator et Hangul-Jamo ne sont pas garanties
Les tailles de polices se résolvent au 1/64 de point et le texte est rogné aux bornes des cellules ; le PDF intègre les polices explicites avec des mappages logiques de texte, le SVG emploie des chemins de glyphes vectoriels, et le PNG dessine les mêmes glyphes positionnés au DPI demandé
Préparer et inspecter une disposition
| Symbole | Contrat |
|---|---|
TXLSPortableFontFile, TXLSPortableFontFiles | Un mappage explicite contient FamilyName, FileName, FaceIndex, Bold et Italic ; le tableau dynamique est ordonné et contient entre 1 et 64 mappages |
TXLSPortableCairoFormat, TXLSPortableOutputFiles | xpcfPDF, xpcfSVG ou xpcfPNG, et un tableau de noms de fichiers de sortie renvoyé par la sauvegarde fichier |
TXLSPortableCairoOptions | Largeur/hauteur de page, quatre marges, padding de cellules et DPI raster, plus des limites de page, de glyphes, de lignes, de disposition, de sortie, de police, de shaping et de dessin |
XLSDefaultPortableCairoOptions | Initialise chaque option avec des défauts bornés ; utilisez-le avant de surcharger des champs individuels |
PrepareXLSPortableCairoLayout | Valide et copie un instantané, capture les octets de polices explicites et renvoie un TXLSPortableCairoLayout préparé et détenu ; libérez-le avec Free |
TXLSPortableCairoLayout | Expose PageCount, LineCount, CellCount, GetTextLine, GetCellGeometry, SaveToStream, Save et Destroy |
TXLSPortableTextLineInfo | Un enregistrement de ligne copié a CellIndex, GlyphCount, XPoints, BaselinePoints, WidthPoints, FontSizePoints et le Text logique |
TXLSPortableCellGeometry | Un rectangle copié a XPoints, YPoints, WidthPoints et HeightPoints dans la disposition complète |
GetTextLine(Index), GetCellGeometry(Index) | Inspection indexée en base zéro des lignes préparées et des cellules stockées ; des index invalides sont rejetés |
La pagination rogne des tuiles fixes de zone imprimable dans l'ordre puis-vers-la-droite ; une cellule ou un fragment de texte qui traverse des frontières de pages apparaît sur chaque page intersectée, sans ajustement automatique de cellules entières, sans répétition des titres d'impression de feuille ni interprétation de la mise en page du classeur
Options et bornes du renderer
| Champs | Défauts et signification |
|---|---|
PageWidthPoints, PageHeightPoints | 595 par 842 points |
MarginLeftPoints, MarginTopPoints, MarginRightPoints, MarginBottomPoints | 36 points chacun ; les marges doivent laisser un rectangle imprimable positif |
CellPaddingPoints, RasterDPI | 2 points et 96 DPI ; le DPI affecte les dimensions PNG |
MaxPages, MaxGlyphs, MaxLines | 256 pages, 2000000 glyphes façonnés et 200000 lignes de texte |
MaxLayoutBytes | 268435456 octets pour le travail de disposition borné et les vérifications de surface raster |
MaxOutputBytes | 268435456 octets par tampon de sortie rendu, couvrant le PDF complet ou une page SVG/PNG plutôt que la somme des fichiers de pages séparés |
MaxFontBytes | 134217728 octets de fichiers de polices d'entrée explicites pour une disposition |
MaxShapedCharacters, MaxDrawOperations | 16000000 chacun, bornant le travail de shaping et le dessin page par cellule |
Une géométrie invalide ou non finie et des budgets de travail non positifs sont rejetés ; les dimensions de pages sont plafonnées à 100000 points et le DPI raster à 1200, avec des vérifications supplémentaires d'octets, de compteurs et de surface raster avant le rendu
Le pool natif d'octets de polices à l'échelle du processus autorise en plus au plus 256 tampons distincts et 256 MiB ; des octets strictement identiques peuvent partager le stockage, et la capacité n'est libérée que lorsque la face de police effectivement détenue par Cairo libère son tampon
Libérez chaque disposition une fois terminé ; la bibliothèque ne réinitialise pas les caches Cairo partagés, et une disposition logiquement achevée peut laisser des octets de polices résidents tant que Cairo natif détient une face
Écrire la sortie et gérer les échecs
SaveToStream(Stream, Format, PageIndex = 0) écrit toutes les pages pour le PDF, en exigeant PageIndex = 0 ; SVG et PNG écrivent la page sélectionnée en base zéro
La sérialisation d'instantanés et le rendu natif s'achèvent dans des tampons privés bornés avant la copie vers le stream de destination ; un échec de validation ou de rendu le préserve, mais un échec d'écriture du stream appelant peut laisser des octets partiels et suit le comportement d'échec propre à ce stream
Save(FileName, Format) écrit un fichier PDF unique ou un fichier SVG/PNG par page et renvoie leurs chemins ; les noms de fichiers multipages insèrent -0001, -0002 et les suffixes suivants avant l'extension
Des destinations fichier ou répertoire existantes sont rejetées ; chaque sauvegarde met toutes les pages en staging, publie des destinations nouvelles en exclusivité et retire ses propres sorties staged/publiées en cas d'échec
Le système de fichiers doit accepter les opérations natives de staging exclusif et de publication par lien ; les sauvegardes PDF, SVG et PNG séparées sont des opérations séparées et ne forment pas une transaction combinée
Consommateur Linux autonome
Tests/Portable/RenderPortableSnapshot.pas est un consommateur complet qui charge un instantané, prépare une disposition et enregistre les trois formats ; compilez-le sous Linux avec les unités portables et les bibliothèques natives installées
fpc -Mdelphiunicode -Fu/path/to/HotXLS/Lib RenderPortableSnapshot.pas ./RenderPortableSnapshot report.hxrs /srv/output/report fonts.tsv 595 842 96
fonts.tsv est un texte UTF-8 à quatre champs séparés par tabulations par mappage : alias de famille, chemin absolu de police Linux, index de face et l'une des valeurs regular, bold, italic ou bolditalic
Calibri /srv/fonts/Regular.ttf 0 regular Calibri /srv/fonts/Bold.ttf 0 bold Calibri /srv/fonts/Italic.ttf 0 italic Calibri /srv/fonts/BoldItalic.ttf 0 bolditalic
Employez de vrais fichiers de polices installés ou fournis par l'application, et choisissez une nouvelle base de sortie car les fichiers de destination existants sont refusés ; ajoutez des replis de même style supplémentaires pour les écritures non couvertes par le premier mappage
Stream := TFileStream.Create('report.hxrs', fmOpenRead or fmShareDenyWrite);
try
Snapshot := LoadXLSPortableRenderSnapshot(Stream,
XLSDefaultPortableRenderLimits);
finally
Stream.Free;
end;
Options := XLSDefaultPortableCairoOptions;
Layout := PrepareXLSPortableCairoLayout(Snapshot, Fonts, Options);
try
Files := Layout.Save('/srv/output/report.pdf', xpcfPDF);
Files := Layout.Save('/srv/output/report.svg', xpcfSVG);
Files := Layout.Save('/srv/output/report.png', xpcfPNG);
finally
Layout.Free;
end;
Enregistrement des graphiques en cache
XLSRecordCachedChartScene dans lxPagination enregistre les primitives en points du renderer de dispositions de graphiques existant vers une représentation de scène portable immuable ; sa source doit être un TXLSXChart détaché, sans feuille propriétaire ni XML natif préservé, si bien que l'enregistrement ne peut résoudre aucune référence de feuille ni actualiser les caches du classeur
Le sous-ensemble courant accepte les graphiques colonnes, barres, lignes, nuages de points, secteurs, anneaux et aires ordinaires à série unique avec un seul groupe de tracé principal, des caches de valeurs numériques finies et des indices de cache strictement croissants et bornés ; les caches de catégories des nuages de points contiennent des coordonnées X numériques, tandis que les autres familles emploient les étiquettes de catégories stockées
Les caches de valeurs colonnes, barres, lignes et aires doivent avoir des indices contigus en base zéro ; des trous de valeurs de catégories clairsemés sont rejetés, et l'enregistrement n'étend jamais des indices manquants en un grand tableau
Les tracés de barres conservent la géométrie horizontale et les étiquettes catégorielles ; les tracés de secteurs et d'anneaux emploient des légendes de catégories, respectent FirstSliceAng et HoleSize et omettent les axes numériques, tandis que les tracés d'aires ordinaires à série unique conservent un polygone rempli autour de la baseline zéro
Les séries de lignes et de nuages de points acceptent une visibilité de ligne indépendante, une couleur RGB explicite et une largeur de point via LineVisible, LineColorRGB et LineWidthPoints ; LineStyleSet, LineColorSet et LineWidthSet distinguent les réglages explicites des défauts hérités, et EffectiveLineVisible résout la convention existante des séries à remplissage seul
Les marqueurs acceptent le cercle automatique, un cercle explicite ou aucun marqueur ; un MarkerSize explicite de 2 à 72 fixe son diamètre en points, et MarkerFillSet et MarkerBorderSet distinguent une valeur RGB noire explicite de zéro d'une sélection automatique de couleur ; les segments de liaison sont peints avant les marqueurs de données opaques
Les bordures de marqueurs explicites sans largeur stockée emploient la ligne ordinaire de 0,75 point, tandis que les échantillons de légendes plafonnent le diamètre des cercles à 6 points ; les polices de titres demandées sont écrites sur le run de texte enrichi réel ainsi que sur ses propriétés de texte par défaut, ce qui conserve taille, couleur et emphase visibles quand Excel exporte le graphique
Familles de graphiques non prises en charge, tracés d'aires empilés ou multi-séries, tracés circulaires multi-séries, styles de galerie, coins arrondis, groupes de tracés secondaires ou combinés, axes de dates, formats de nombre personnalisés, axes logarithmiques, comportements de croisement personnalisés, texte pivoté, courbes de tendance, barres d'erreur, catégories hiérarchiques, étiquettes de données, autres formes de marqueurs et caches de valeurs manquants lèvent EXLSPortableRender avant le rendu
Polices de ticks d'axe de valeurs personnalisées, grilles secondaires, unités majeures/mineures explicites, couleurs de séries explicites invalides et positions d'axes non prises en charge sont rejetées ; les légendes de barres exigent actuellement le placement ordinaire à droite, et les tracés circulaires exigent un total en cache fini non nul et une géométrie bornée avec une réservation conservatrice anticipée du stockage de travail des arcs
Le tableau renvoyé conserve l'ordre de dessin des primitives, les couleurs explicites, polices, alignements de texte, opacité et bornes de clipping du graphique ; la comptabilité d'éléments, d'octets et de texte inclut les réservations conservatrices de stockage de travail du renderer, et les vérifications coopératives de cache précèdent l'allocation des tableaux de travail
XLSValidateCachedChartSceneModel effectue le même preflight borné de cache et d'apparence sur un modèle sans résoudre les cellules de la feuille ; le pont de capture XLSX emploie cette vérification avant clonage et enregistre les modèles de graphiques créés pris en charge avec des références A1 locales unidimensionnelles, des offsets d'ancres natifs physiques, un clipping de plage et l'ordre de dessin
L'enregistreur neutre en plateforme vit dans lxPortableChart ; les points d'entrée lxPagination existants partagent les mêmes corps de disposition et d'enregistrement de primitives, en conservant le comportement du renderer Windows et en produisant des octets de scène immuables et une comptabilité de budgets identiques pour chaque famille prise en charge
La capture native de classeurs sous Linux et macOS emploie l'overload de géométrie explicite décrit ci-dessous ; le remplissage RGB des séries importées, l'arrière-plan de zone de tracé, l'arrière-plan du graphique et la bordure du graphique sont récupérés depuis leurs propriétés de formes résolues par espace de noms, si bien qu'une couleur de série imbriquée ne peut pas écraser l'arrière-plan du tracé
Le ChartML préservé importé n'est accepté que si son flux d'éléments, d'attributs et de texte significatif étendu par espaces de noms correspond à la reconstruction typée prise en charge ; les alias d'espaces de noms et l'ordre des attributs se normalisent, tandis que les extensions natives non modélisées, les attributs étrangers et une apparence non prise en charge sont rejetés de façon conservatrice
Les budgets de travail XML brut et de reconstruction sont vérifiés avant clonage et projection ; seule la copie détachée efface son XML préservé validé, et la source conserve les métadonnées natives, le stockage de cellules, le contenu des caches et la génération
La capture parcourt l'ordre de dessin OfficeArt sous-jacent, frames de graphiques absentes du wrapper public Shapes comprises, et rejette une frame non prise en charge qui intersecte au lieu de l'omettre silencieusement
Graphiques Classic en cache à apparence déclarée
La capture Classic BIFF8 accepte les sept familles de graphiques ordinaires ci-dessus quand leurs enregistrements de base, valeurs locales stockées, échelles linéaires explicites et apparence sont représentables ; elle lit les enregistrements conservés et les caches de formules disponibles sans évaluer de formules, sans étendre un stockage clairsemé ni cloner des arbres de formules compilées
Employez TXLSWorkbook.CreateReadOnlyViewWithChartAppearance(Source, Limits, Geometry) pour créer une vue en lecture seule séparée avec un ensemble figé de valeurs TXLSClassicChartAppearanceDeclaration fournies par IXLSClassicChartAppearanceSource ; Geometry est facultatif sous Windows et fournit des mesures de polices natives explicites sous Linux ou macOS
TXLSClassicChartAppearanceDeclarations est le tableau dynamique de déclarations primitives qu'une application peut employer pour implémenter cette source
Passez cette vue configurée à CaptureXLSPortableViewRenderSnapshot(View, SheetIndex, Row1, Col1, Row2, Col2, Limits) ; les coordonnées sont en base un et l'adaptateur restaure la feuille active de l'appelant quand la capture se termine ou est rejetée
Les points d'entrée de capture ordinaires continuent de refuser une disposition ou légende Classic effective non résolue ; le point d'entrée distinct de vue emploie les déclarations déjà figées et le fournisseur de géométrie
| Membre de déclaration | Contrat |
|---|---|
Generation, SheetIndex, ObjectId | Génération épinglée du classeur, index de feuille de calcul en base un et identité réelle de l'objet graphique stocké ; générations périmées, identités manquantes ou répétées et identités appartenant à un autre objet sont rejetées |
HasChartSize, ChartWidthPoints, ChartHeightPoints | Taille explicite finie et positive du cadre du graphique en points ; elle conserve l'origine de l'ancre stockée et l'ordre de dessin, tandis qu'un indicateur false garde les dimensions dérivées de l'ancre |
HasPlotInnerRectangle, PlotInnerRectangle | Rectangle intérieur de tracé explicite, hors étiquettes et titres d'axes ; il est requis pour ce chemin d'apparence déclarée |
HasTitleRectangle, TitleRectangle | Rectangle de titre explicite quand le graphique a un titre ; texte source, famille de police, emphase et couleur proviennent toujours des enregistrements de base validés |
HasLegendRectangle, LegendRectangle | Les bornes déclarées de la légende quand une légende est présente |
HasLegendFontSize, LegendFontSizePoints | Taille effective en points explicite de l'appelant pour une légende présente ; famille de police de base, emphase et couleur sont conservées |
TXLSPortableChartRectangle | Left, Top, Width et Height sont des points finis relatifs au cadre du graphique capturé ; les rectangles actifs exigent des dimensions positives dans ce cadre |
Count, GetCount, ReadDeclaration | La source signale un compteur borné et renvoie un enregistrement primitif pour chaque index en base zéro tant que la vue est configurée ; les déclarations sont copiées avant la capture ultérieure |
Ces valeurs sont une apparence déclarée par l'appelant, pas une disposition Excel automatique ni une mise à l'échelle de polices déduite ; obtenez-les depuis une source vérifiée indépendamment ou une disposition définie par l'application, et examinez la sortie avec le mappage de polices natives explicite employé pour le rendu
Les dimensions explicites du cadre et les bornes intérieures de tracé doivent laisser assez de place aux polices d'étiquettes d'axes validées ; un espace d'étiquettes insuffisant est rejeté au lieu de rogner le texte ou d'appliquer un facteur d'échelle ajusté
Les applications gardent le propriétaire du classeur en vie jusqu'à la libération de la vue ; la vue empruntée détient un bail de lecture et conserve la source de déclarations, tandis que l'instantané immuable résultant ne retient ni le classeur ni le fournisseur
La projection de base prise en charge comprend les remplissages unis littéraux, les lignes unies visibles, les marqueurs circulaires, les textes de titre et de légende, le placement des catégories et les ticks numériques explicites bornés ; échelles automatiques, apparence automatique de marqueurs non résolue, lissage, extensions enrichies inconnues, références de séries étrangères ou non linéaires et styles de points non représentés sont rejetés avant la sortie
Déclarer une géométrie ou une taille de légende n'autorise pas à ignorer les extensions de graphiques inconnues ni les styles non validés ; les limites d'octets, de texte, de cellules stockées et de scène restent effectives pour les données sources conservées, les déclarations, les caches détachés et l'espace de travail d'enregistrement
Les overloads supplémentaires XLSValidateCachedChartSceneModel et XLSRecordCachedChartScene acceptent un TXLSCachedChartSceneAppearance pour un modèle détaché ; initialisez-le avec XLSDefaultCachedChartSceneAppearance avant de régler les contrôles explicites
Le XLSReadClassicChartScene de plus bas niveau dans lxClassicChartScene renvoie, depuis un TXLSCustomChart conservé, son calculator source exact et un TXLSClassicChartSceneSource sous bail, un TXLSXChart détaché détenu par l'appelant avec des compteurs primitifs d'apparence et de budget ; libérez le modèle renvoyé après l'enregistrement
TXLSClassicChartSceneSource.ReadAppearance fournit une déclaration primitive, ReadCell lit des valeurs locales épinglées bornées, ReadFont remplit le style de texte fourni avec des données effectives bornées de police de base, et PaletteColor résout les entrées explicites de palette stockées ; les implémentations d'application doivent préserver la source épinglée et respecter chaque quota d'octets et de caractères fourni
| Membre d'apparence de scène | Signification |
|---|---|
SeriesMarkerSizePoints | Diamètres en points bornés par série, valeurs fractionnaires comprises ; zéro garde la taille de marqueur du modèle et une surcharge non nulle doit être de 2 à 72 points |
OverrideBorder, BorderColorRGB, BorderWidthPoints | Apparence explicite du contour du cadre du graphique |
AxisColorRGB, TickColorRGB, GridlineColorRGB, AxisWidthPoints, TickWidthPoints, GridlineWidthPoints | Couleurs et largeurs en points explicites des axes, ticks et grilles majeures |
AreaFillOpacity, SeriesFillAlpha | Opacité des aires et alpha de remplissage des séries |
UseAxisTickControls, CategoryBetween | Contrôles d'axes explicites validés et placement catégoriel |
TitleOffsetXPoints, TitleOffsetYPoints | Offsets finis appliqués à la position ordinaire du titre par l'enregistreur |
OverridePlotInnerRectangle, OverrideTitleRectangle, OverrideLegendRectangle, PlotInnerRectangle, TitleRectangle, LegendRectangle | Rectangles littéraux en points relatifs au cadre du graphique |
PieRadiusRatio | Rayon du tracé circulaire comme fraction bornée de la plus petite dimension du tracé |
Les primitives de graphiques suivent la politique de disposition existante de HotXLS ; une apparence de galerie de graphiques exigeant les défauts non modélisés d'Excel reste une frontière explicitement non prise en charge
Capture native directe de classeurs
CreateXLSPortableCairoRenderGeometry(Fonts, Calibration, Generation, Backend, Options, CacheCapacity) renvoie un IXLSRenderGeometry adossé aux mêmes fichiers de polices explicites, FreeType, HarfBuzz et shaping de texte que la sortie native ; les largeurs de colonnes emploient la largeur maximale réellement mesurée des chiffres avec le calibrage du classeur
Le fournisseur détient des octets de polices détachés et un cache de métriques borné, vérifie les budgets de polices et de disposition avant allocation, et valide les demandes de mesure avant de changer l'état en cache ; un cache plein peut renvoyer des mesures non mises en cache sans dépasser sa capacité
La capture vérifie que la génération du fournisseur et tous les champs de calibrage correspondent à la vue de lecture seule courante du classeur, retient le fournisseur pour cette vue, et laisse inchangée la factory de géométrie par défaut du classeur ; la géométrie native par défaut ordinaire reste une frontière GDI explicite
Capturez la génération via une vue explicitement libérée avant de créer le fournisseur ; retenir un résultat d'interface temporaire peut retenir son bail de lecture jusqu'à la fin de la portée englobante
View := Owner.CreateReadOnlyView; Generation := View.Generation; View := nil; Geometry := CreateXLSPortableCairoRenderGeometry(Fonts, Workbook.CaptureRenderCalibration, Generation, xlsrgbBitmap, XLSDefaultPortableCairoOptions, 4096); Snapshot := CaptureXLSPortableRenderSnapshot(Owner, 1, 1, 1, 30, 6, XLSDefaultPortableRenderLimits, Geometry);
Les consommateurs natifs compilent avec LX_PORTABLE_CORE et les dépendances natives correspondantes ; les appels Windows vers la factory de géométrie Cairo native sont explicitement rejetés, tandis que la capture Windows peut employer sa factory de géométrie existante via les mêmes overloads à portée
La capture native réelle accepte les scalaires modélisés, texte enrichi, raster pris en charge, formes ordinaires et les sept familles de graphiques en cache décrites ci-dessus ; la capture de graphiques préserve le ChartML importé d'origine, les points en cache, le stockage clairsemé de cellules, le stockage compacté et la génération du classeur
Pour les zones d'impression immuables, marges, ajustement ou mise à l'échelle en pourcentage, titres répétés, sauts manuels et pagination cellule entière ou cellules fusionnées, voir les plans d'impression portables
Pont de capture avancé
IXLSRenderCaptureSource dans lxSemanticSnapshot est l'interface de coordination interne implémentée par les vues de classeurs en lecture seule prises en charge ; les applications ordinaires devraient appeler les overloads de capture basés sur le propriétaire
TXLSClassicReadOnlyWorkbookView et TXLSXReadOnlyWorkbookView implémentent IXLSRenderCaptureSource, avec les huit méthodes de rendu ci-dessous ; ces classes coordonnent la capture via des vues en lecture seule, et l'adaptateur gère leur durée de vie pendant que les applications conservent l'interface propriétaire de leur classeur et appellent CaptureXLSPortableRenderSnapshot
Leur méthode TryReadCell existante fournit un instantané de cellule stockée via la vue en lecture seule ; les méthodes de rendu ajoutent apparence et géométrie détachées pour la capture portable
| Membre ou helper | Rôle |
|---|---|
ValidateRenderRange | Vérifie les bornes du rectangle en base un et les empreintes d'apparence non prises en charge avant la capture |
ReadRenderStyle | Renvoie les métadonnées détachées TXLSSemanticCellStyle et un indicateur de présence de texte enrichi pour une cellule en base un |
IXLSRenderRichTextCaptureSource, ReadRenderRichText | Extension de vue facultative renvoyant des TXLSRenderTextRuns détachés et bornés ; chaque TXLSRenderTextRun contient Text et un Style sémantique effectif, en employant le style de base fourni et des quotas positifs de runs/octets sans matérialiser de cellules ni modifier les pools de styles |
RenderRowHeightPoints, RenderColumnWidthPoints | Renvoient la géométrie physique, en réduisant les dimensions masquées à zéro |
IXLSRenderGeometryCaptureSource, SetRenderCaptureGeometry | Extension de vue facultative qui ne retient un fournisseur explicite qu'après validation de génération et de calibrage ; des fournisseurs invalides laissent inchangé le fournisseur retenu de la vue |
ReadRenderMerge | Signale le rectangle de fusion complet inclusif en base un contenant une cellule |
ResolveRenderColor | Résout une apparence sémantique theme/indexed/RGB vers une couleur RGB portable, en employant le défaut fourni quand c'est pris en charge |
RenderDate1904, RenderRightToLeft | Exposent le système de date du classeur et le contexte d'ordre de lecture de la feuille |
XLSRenderCaptureLiteral | Reconnaît le sous-ensemble littéral pris en charge de Boolean, nombre fini ou texte simple entre guillemets pour une capture sans évaluation |
XLSRenderCaptureIntersects | Teste des plages A1 locales séparées par des espaces contre un rectangle en base un, en rejetant une syntaxe de plage non résolue |
XLSRenderCaptureCondition | Évalue le sous-ensemble de conditions pris en charge contre un scalaire existant ; les codes d'opérateurs de comparaison 1 à 8 signifient entre, hors-intervalle, égal, différent, supérieur, inférieur, supérieur-ou-égal et inférieur-ou-égal |
XLSRenderCaptureApplyDxf | Applique une apparence différentielle détachée prise en charge avec un masque AppliedSlots pour conserver le formatage de priorité plus haute |
TXLSDxfStyle._MarkRenderUnsupportedAppearance, TXLSDxfStyle._HasRenderUnsupportedAppearance | Les méthodes de coordination d'import à préfixe interne enregistrent et inspectent l'apparence que le modèle différentiel typé ne peut pas rendre sans risque ; Assign conserve le marqueur, et la capture rejette un style correspondant marqué |
Ces helpers du pont peuvent lever EXLSSemanticSnapshot ; l'adaptateur de capture public traduit cette exception en EXLSPortableRender