TPrinter : Multipage sur sortie fichier ps
Bonjour à tous,
Je découvre la classe TPrinter qui convient tout à fait mes besoins sauf que lors l'impression d'un document multipages, la version papier s'imprime comme il faut, alors que l'impression fichier n'imprime que la première page et laisse les pages suivantes vides.
Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
procedure TMainForm.acPrintExecute(Sender: TObject);
const
LeftMargin = 100;
TopMargin = 200;
BottomMargin = 200;
HEADLINE = 'APTEC sarl / Le ';
var
I, Y, LineHeight, NbPages: Integer;
HeadMargin, FootMargin, TitleMargin : Integer;
PrintString: String;
begin
// Fermer si la liste est vide
if MainGrid.RowCount =1 then Exit;
if PrintDialog.Execute then
begin
// Si Impression fichier alors init nom du fichier
with Printer do
try
if PrintDialog.PrintToFile = true then
begin
FileName := ExtractFileNameWithoutExt(OpenedFileName)+'.ps';
end;
Orientation := poReverseLandscape; // Orientation de la page
//Orientation := poPortrait;
LineHeight := Round(1.2 * Abs(Canvas.TextHeight('I'))); // Calcule hauteur ligne
// Démarre le document
BeginDoc;
Canvas.Font.Name := 'Courier New'; // Init le nom de la police
Canvas.Font.Color := clBlack; // Init couleur de la police
Canvas.Font.Size := 10; // Init taille de la police
Canvas.Font.Bold := true;
// Calcule le nombre de pages
NbPages := ((LineHeight*MainGrid.RowCount)+(TopMargin*2))div PageHeight;
// Imprimer entete document
Y := TopMargin; // Position début écriture
PrintString := HEADLINE + DateTimeToStr(Now)
+' - Page' +inttostr(PageNumber)
+'/'+inttostr(NbPages)+' - Document : '
+ExtractFileNameOnly(OpenedFileName);
Canvas.TextOut(LeftMargin, Y, PrintString);
Canvas.Line(LeftMargin, Y+LineHeight, PageWidth-LEFTMARGIN, Y+LineHeight);
// Imprimer entete du tableau
Canvas.Font.Size := 12; // Init taille de la police
Y := Y+(LineHeight); // Position début écriture
PrintString := Format('%-5s', ['Ordre'])+' '+
Format('%-10s', [MainGrid.Columns[6].Title.Caption])+' '+
Format('%-100s', [MainGrid.Columns[7].Title.Caption]);
Canvas.TextOut(LeftMargin, Y, PrintString);
//Imprimer listing
Canvas.Font.Bold := False;
for i:=1 to MainGrid.RowCount-1 do
begin
if (Y >= (PageHeight-BottomMargin)) then
begin
Y := TopMargin;
NewPage;
end;
Y := Y+(LineHeight);
PrintString := Format('%-5s', [MainGrid.Cells[0, i]])+' '+
Format('%-10s', [MainGrid.Cells[7, i]])+' '+
Format('%-100s', [MainGrid.Cells[8, i]]);
Canvas.TextOut(LeftMargin, Y, PrintString);
//ShowMessage(inttostr(Y));
end;
finally
EndDoc;
end;
end;
end; |
Je suis sous linux, j'ai solutionné temporairement par l'installation d'un driver pdf, mais je ne peux plus maîtriser ni le nom ni le repertoire du fichier sorti.
Merci de votre aide.
Salim.
Le problème n'est pas là où on le pensait !
Ce matin, je ne sais pas pourquoi, il m'est venu une intuition subite, en regardant le titre utilisé pour poster dans le forum Lazarus :
Citation:
TPrinter : Multipage problem with output PS File
output PS File...
Me suis souvenu que les fichiers TIFF géraient le multipage, ni une ni deux, je remplace l'extension dans le code, je lance, ça me génère donc un .TIFF, ouverture avec GIMP et là, bingo !
J'ai bien deux pages remplies de lignes !
Le souci (car il y a toujours un souci :weird:), c'est que le .TIFF généré n'est pas un vrai fichier image (même si GIMP sait l'importer) : impossible à transformer en PDF, impossible de lire ses infos :
Citation:
# tiffinfo testprintfile.tiff
testprintfile.tiff: Not a TIFF or MDI file, bad magic number 8485 (0x2125).
Normal : le début du fichier (vu avec un éditeur hexa) = %!PS-Adobe-3.0.%, et plus loin : %%Creator: Lazarus PostCriptCanvas.
Je recopie le .TIFF en .PS, je double-clique et je retrouve le problème d'origine ! Seconde page vide, alors que ses infos sont bien dans le fichier (très visibles avec l'éditeur hexa) :calim2:
Pas simple cette histoire...
[ EDIT ] La solution est ensuite toute bête, puisque le fichier .PS a un contenu correct : l'outil PS2PDF fait parfaitement son boulot, comme son nom l'indique, et le PDF généré affiche correctement les 2 pages.
Et c'est peut-être juste l'outil d'affichage des .PS qui a un souci, sous Linux comme sous Windows... :aie:
[ /EDIT ]