Results 1 to 9 of 9

Thread: printdialog + micrsoft print to PDF

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    printdialog + micrsoft print to PDF

    Zie ook http://www.delphipages.com/forum/sho...d.php?t=217641

    Hoe vang ik af dat er op de cancel-knop is geklikt in de save-as dialog die Microsoft Print to PDF naar voren brengt?

  2. #2
    Inderdaad 'lekker' dat die status niet terugkomt naar Delphi.

    Je zou natuurlijk de Exception af kunnen handelen maar dat is eigenlijk niet zo netjes.

    Overigens heb ik wel gekeken naar "Microsoft print to PDF" als alternatief voor het toevoegen van mijn eigen Ghostscript-printer om een PDF te maken maar ben vrij snel van dat idee afgestapt omdat de "Microsoft print to PDF" een zeer inefficiënte (lees grote) PDF genereert.

    (Een simpele tekst-offerte resulteerde bij de "Microsoft print to PDF" in een PDF van 215KB terwijl mijn Ghostscript variant 25KB was.)

  3. #3
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Klopt. Mijn SynPdf's zijn ook kleiner, zelfs als ik een font embed.
    Maar het kan natuurlijk dat gebruikers afdrukken naar MS PDF.
    Ik vang de Printer.Printing maar af iedere keer... Maar de oorzaak zal nooit duidelijk zijn. Behalve wanneer ik een lange exception tekst schrijf, waar niemand op zit te wachten.

  4. #4
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Geen oplossing maar probleem lijkt al langer te bestaan:

    https://wiert.me/2016/08/31/workarou...oned-delphi-8/

    Staat niet echt bij hoe je de cancel afvangt, wel een workarround voor de error.

    Code:
    Or use code to reset printer, works on Win10.
    
    Procedure PrintInit;
    // Reset printer if needed
    Var
    Device, Driver, Port: Array[0..80] Of Char;
    DevMode: THandle;
    Begin
    Printer.GetPrinter (Device, Driver, Port, DevMode);
    Printer.SetPrinter (Device, Driver, Port, 0);
    End;

  5. #5
    Nee, dat probleem op die pagina was volgens mij een ander probleem. Ik kan me dat nog herinneren van een tijdje geleden, dat de eerste 2 prints goed gingen en dat daarna bij de volgende job die foutmelding kwam. Dat was gewoon een bug in Windows. En die was ook vrij snel daarna met een fix weer opgelost. Ik hen daar toen ook verschillende klanten over aan de lijn gehad.

    Het probleem van dat de Cancel van de PDF printer niet terug in Delphi komt is een andere. Ik denk ook niet dat de hier genoemde oplossingen zullen werken.

    Ik vraag me trouwens af of dit probleem zich ook voordoet in bullzip, pdfcreator en andere pdf-printers die om een filenaam vragen en er op cancel gedrukt wordt.

  6. #6
    Het is denk BeginDoc die de saveas triggered.
    Dus eigenlijk zou je daarna moeten kijken wat het resultaat is.

    (Zal morgen eens kijken of dat via een api kan)

    Een andere oplossing is eerst zelf om de filenaam vragen en dan aan microsoft print to pdf doorgeven welke pdf het moet zijn.

    Maar dat werkt natuurlijk niet met een gewoon printdialoog waar je ook naar normale printers moet printen.

    Edit:
    Al iets gevonden... Probleem doet zich ook voor met de xps writer printer.
    StartDoc returns ERROR_CANCELLED
    https://bugzilla.mozilla.org/show_bug.cgi?id=499025

    Dus die startdoc moet netjes afgevangen worden en bij ERROR_CANCELLED moet de printer.printing op false gezet worden. Die kun je daarna gebruiken om te kijken of het printen nog doorgang moet vinden.
    Last edited by rvk; 17-Jan-19 at 23:23.

  7. #7
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Triggert de BeginDoc van MS Print to PDF do save as dialog?
    Ik zal morgen eens kijken...

  8. #8
    Ja, de BeginDoc (of eigenlijk de StartDoc die daarin aangeroepen wordt) triggert de save as.

    Ik heb het nog even getest maar volgens mij wordt de Printer.Printing wel goed gezet IN de BeginDoc.

    Dus dit zou prima moeten werken.

    Delphi Code:
    1. procedure TForm27.Button1Click(Sender: TObject);
    2. begin
    3.   if PrintDialog1.Execute then
    4.   begin
    5.     Printer.BeginDoc;
    6.     if not Printer.Aborted and Printer.Printing then
    7.       begin
    8.         Printer.Canvas.TextOut(10, 10, 'Hello World');
    9.         Printer.EndDoc;
    10.       end;
    11.   end;
    12. end;

    Het is eigenlijk sowieso correct om na de BeginDoc te controleren of Printer.Printing true is want onderin BeginDoc staat dit:
    Delphi Code:
    1. if StartDoc(DC, DocInfo) <= 0 then
    2.   FPrinting := False
    3. else
    4.   StartPage(DC);

  9. #9
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Klopt! schitterend.

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
  •