Results 1 to 15 of 15

Thread: print zonder printdialog

  1. #1
    Mieke Janson
    Join Date
    Apr 2005
    Location
    noordwijk
    Posts
    306

    print zonder printdialog

    Goedenmorgen,

    Ik wil graag direkt PDF's printen vanuit mijn delphiapplicatie zonder tussenkomst van een printdialog. De gewenste printer stel ik via het TPrinter-object. Het lijkt me zo logisch dat ik via dat TPrinter-object ook een print-commando kan geven. Maar ik krijg het niet voor mekaar en kan er ook verder niets over vinden...

    Alvast bedankt voor het meedenken,
    Mieke

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    TPrinter is "Slechts" een VCL schil rond het Windows printer management (welke printers zijn er, wat zijn de printer instellingen, etc.) en verschaft je een eenvoudige manier om met de geselecteerde printer (ingesteld met de PrinterIndex-property) een canvas te creëren om daarop af te drukken (BeginDoc, EndDoc, ...).
    TPrinter kan niet uit zichzelf PDF's afdrukken, dat doet bijvoorbeeld Acrobat reader (wanneer deze geïnstalleerd is, of anders een andere PDF parser/reader) en die zal dan ook een printer dialog tonen.
    Het hangt van de geïnstalleerde PDF parser/reader af hoe je zonder tussenkomst van een dialoogvenster kunt afdrukken.

    Je kunt proberen of je iets kunt doen met de "Print" optie van ShellExecute, maar eerlijk gezegd heb ik daar geen ervaringen mee, "Normaal" gebruik je voor gespecialiseerde PDF taken (bewerken, afdrukken, etc.) een component zoals Gnostice.
    Last edited by VideoRipper; 02-Nov-20 at 13:31.
    TMemoryLeak.Create(Nil);

  3. #3
    Hoe print je ze dan nu met print dialog?
    1+1=b

  4. #4
    Mieke Janson
    Join Date
    Apr 2005
    Location
    noordwijk
    Posts
    306
    Heel eenvoudig:

    procedure TfMain.btnPrintPDFClick(Sender: TObject);
    var sFile : string;
    PD : TPrintDialog;
    begin
    sFile := ExtractFilePath(Application.ExeName)+'TEST.PDF';

    Printer.PrinterIndex := nPrinterIndex;
    PD := TPrintDialog.Create(fMain);
    try
    PD.Execute();
    finally
    PD.Free;
    end;
    end;

  5. #5
    Mieke Janson
    Join Date
    Apr 2005
    Location
    noordwijk
    Posts
    306
    excuus, ik had het als code moeten posten...

  6. #6
    Quote Originally Posted by mieke View Post
    Heel eenvoudig:

    procedure TfMain.btnPrintPDFClick(Sender: TObject);
    var sFile : string;
    PD : TPrintDialog;
    begin
    sFile := ExtractFilePath(Application.ExeName)+'TEST.PDF';

    Printer.PrinterIndex := nPrinterIndex;
    PD := TPrintDialog.Create(fMain);
    try
    PD.Execute();
    finally
    PD.Free;
    end;
    end;
    En hiermee wordt die TEST.PDF uitgeprint ?????
    Heel raar want ik zie in de code niets over die sFile dat ie ergens geprint wordt.

    Waar print je daadwerkelijk die sFile naar de printer?

  7. #7
    Mieke Janson
    Join Date
    Apr 2005
    Location
    noordwijk
    Posts
    306
    Nee, dat is het punt juist. Op deze manier start ik de Printdialog en moet ik op de 'ok' knop klikken om de PDF geprint te krijgen. Dat wil ik graag omzeilen, dat is mijn vraag....

  8. #8
    Quote Originally Posted by mieke View Post
    Nee, dat is het punt juist. Op deze manier start ik de Printdialog en moet ik op de 'ok' knop klikken om de PDF geprint te krijgen. Dat wil ik graag omzeilen, dat is mijn vraag....
    Gewoon geen PD.Execute(); uitvoeren. That's it. (En dan kun je dus heel het blok met TPrintDialog.Create tot en met PD.Free ook weghalen)

    Je maakt een TPrintDialog aan waar je een .Execute op uitvoert. Dat is dus het PrintDialog. Duidelijker kan niet.
    Als je die dus weghaalt, krijg je ook geen dialoog en hoef je ook niet op Ok te drukken.

    (de Printer.PrinterIndex := nPrinterIndex; kun je laten staan want die kiest de juiste printer met nprinterindex uit)

  9. #9
    Mieke Janson
    Join Date
    Apr 2005
    Location
    noordwijk
    Posts
    306
    Blijkbaar ben ik heel slecht in mijn probleem uitleggen....

    Het PDF-document moet naar de printer gestuurd worden om uitgeprint te worden. Dat lukt me alleen MET dialoog. Graag wil ik een oplossing ZONDER dialoog.... Dus een stuke code in de trant van:
    PDFdocument.Print; Dat het meteen naar de printer gaat, ZONDER dialoog ertussen...

  10. #10
    Quote Originally Posted by mieke View Post
    Blijkbaar ben ik heel slecht in mijn probleem uitleggen....

    Het PDF-document moet naar de printer gestuurd worden om uitgeprint te worden. Dat lukt me alleen MET dialoog. Graag wil ik een oplossing ZONDER dialoog.... Dus een stuke code in de trant van:
    PDFdocument.Print; Dat het meteen naar de printer gaat, ZONDER dialoog ertussen...
    Ik begrijp het nog steeds niet.
    Je zegt dat je code hebt om de PDF MET dialoog te printen.
    Wij vragen om die code (inclusief het printen van de PDF).
    En dan laat jij alleen het stukje code zien die het dialoog laat zien. NIET de code die de PDF echt print.

    Maar goed... ik zei al... als je de regels PD := TPrintDialog.Create tot en met PD.Free; end; weg haalt dan krijg je geen dialoog meer.
    De code die dan zorgt voor het printen zal zijn werk dus gewoon blijven doen.

  11. #11
    Mieke Janson
    Join Date
    Apr 2005
    Location
    noordwijk
    Posts
    306
    De dialoog zorgt juist voor het printen..... er verschijnt dan een 'ok' knop die de gebruiker moet klikken om het printen te starten. Ik weet niet hoe ik vanuit de code het printen kan starten.... Maar goed, we draaien in rondjes....
    Bedankt voor het meedenken in ieder geval,

    fijne avond,
    Mieke

  12. #12
    Staat er niets achter PD.Execute?

    Kijk eens naar dit voorbeeld.
    http://www.delphibasics.co.uk/RTL.asp?Name=tprintdialog
    Daar zie je dat TPrintDialog zelf niet print maar dat dat erna gebeurd.

    Zoals al gezegd kan TPrintDialog zelf geen PDF printen.
    Dat moet dus door een ander component gedaan worden.

    Maar als jij zegt dat dit al jouw code is (terwijl je niets doet met sFile zelf) sta ik voor een raadsel (wat redelijk zeldzaam is ).

    After setting these options, use the Execute method to display the dialog, checking the Boolean outcome after it runs to know whether to proceed with the printing.
    Last edited by rvk; 02-Nov-20 at 21:48.

  13. #13
    Mieke Janson
    Join Date
    Apr 2005
    Location
    noordwijk
    Posts
    306
    Goedenmorgen rvk,

    Je hebt gelijk, ik was erg blond bezig.
    Zo'n tunnelvisie op die printdialoog dat ik helemaal vergeet om ook een file mee te sturen op de eoa manier.... Dank voor je kritische opmerkingen!
    Ik ga verder zoeken naar een component die een PDF af kan drukken naar een willekeurige printer (en zonder dat ik weet welke PDF-reader geinstalleerd is op het klantsysteem).

    fijne dag,
    Mieke

  14. #14
    Quote Originally Posted by mieke View Post
    Zo'n tunnelvisie op die printdialoog dat ik helemaal vergeet om ook een file mee te sturen op de eoa manier....
    Omdat je zei dat het printen van de PDF zelf al wel werkte na het drukken op OK, gingen wij ervanuit dat je die code er wel al in had zitten. Vandaar dat wij vroegen om die code (na de PD.Execute).

    Maar als je dat nog niet hebt dan wordt het inderdaad een heel ander verhaal. Want er zijn niet zoveel gratis PDF-reader componenten.

    Zelf gebruik ik:

    Delphi Code:
    1. function ExecAssociatedApp(const FileName: string; Action: string = ''): boolean;
    2. var
    3.   rs: Word;
    4.   Shw: integer;
    5. begin
    6.   Shw := SW_SHOW;
    7.   // if Action = 'print' then Shw := SW_SHOWMINIMIZED;
    8.   rs := ShellApi.ShellExecute(0, pchar(Action), pchar(FileName), nil, nil, Shw);
    9.   Result := rs > 32;
    10. end;
    11.  
    12. //...
    13. if ExecAssociatedApp(FileTemp, 'print') then ;

    Alleen dat commando print dan wel ALTIJD naar de standaard printer.
    (Je zou de standaard printer onder Windows eerst aan kunnen passen en na de printopdracht weer terug kunnen zetten)

    Bij bovenstaande methode is het overigens sinds de laatste versie van Adobe Reader het probleem dat de instantie van Reader zelf in de lucht blijft na het printen. Dat gebeurde bij oudere versies en andere PDF readers niet. Maar dat is een 'bug' in Adobe Reader.

  15. #15
    Mieke Janson
    Join Date
    Apr 2005
    Location
    noordwijk
    Posts
    306
    Ik kan verder, hartelijk dank!

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •