Frage

Ich verwende VB.Net WinForms. Ich möchte den Adobe Reader 9 ActiveX-Steuerelement rufen einige PDFs zu drucken. Ich habe das ActiveX-Steuerelement der VS-Toolbox hinzugefügt (die DLL ist AcroPDF.dll, der COM-Namen "Adobe PDF Reader". Nach einiger Experiment der folgende Code funktioniert.

Dim files As String() = Directory.GetFiles(TextBoxPath.Text, "*.pdf", SearchOption.TopDirectoryOnly)

Using ActiveXPDF As New AxAcroPDFLib.AxAcroPDF

    Me.Controls.Add(ActiveXPDF)
    ActiveXPDF.Hide()

    For Each filename As String In files

        ActiveXPDF.LoadFile(filename)
        ActiveXPDF.printAll()

        'Begin Yukky Hack    '


        Dim endTime As Date = DateAdd(DateInterval.Second, 20, Now)
        Do While Now < endTime
            My.Application.DoEvents()
        Loop

        'End Yuk   '

    Next

End Using

Ohne die Yuk dies nur Bit werden einige der PDF-Dateien drucken, scheint es, dass die End Using-Anweisung Aufruf wird über die Kontrolle verfügen bevor er den Druck beendet ist.

Daher scheint es der Aufruf an printAll ist nicht blockierend, aber ich kann nicht einen Rückruf oder Statuseigenschaft findet ich abfragen kann, um zu sehen, ob der Spooling abgeschlossen ist. Ich vermisse eine Eigenschaft / Methode oder ist es eine elegantere (und reaktions) Umgehen?

War es hilfreich?

Lösung

Mit dieser Methode können mehrere Dokumente drucken, wird nicht gut gehen zu arbeiten, wie Sie gefunden.

es funktioniert zu haben, ist ziemlich schwierig, aber hier ist eine allgemeine Beschreibung der Lösung.

Ich verwende System.Diagnostics.Process mit myProcess.StartInfo.Verb = „Drucken“ drucken Dann prüfe ich den Status und Zustand der Druckerwarteschlange in zwei Schritten, um sicherzustellen, dass der Druck bereit genug ist in der Lage zu sein, das nächste Dokument zu drucken. Verwenden Sie WMI und Managementobject den Drucker Informationen aufzuzählen mit „SELECT * FROM Win32_Printer“. Die Logik ist, dass ich versuche, zu sehen, ob das Spooling, bevor Sie fortfahren gestartet wird das nächste zu drucken.

Siehe http://msdn.microsoft.com/en-us/ Bibliothek / aa394363.aspx für die Win32_Printer WMI-Klasse.

Andere Tipps

Ich hatte das gleiche Problem AcroPDF in Delphi mit .. dann habe ich herausgefunden, dass, wenn ich „Stopp“, um die processo eine Nachricht mit, AcroPDF zu drucken beginnt.

So schaffe ich nur eine modale TForm, die sich nach einigen Sekunden schließt.

var
  formModal : TFormModal;
begin
  formModal := TFormModal.Create(self);
  //PrintMethodHere  
  frmPecas.CarregarDocumentoParaImpressao();
  formModal.ShowModal;
end;

Die TFormModal das ist und ich nur ein Ladesymbol auf dem Formular einfügen, um bedeutet so etwas wie „Druck“.

unit FModal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Animate, GIFCtrl;

type
  TFormModal = class(TForm)
    Timer: TTimer;
    imgGif: TRxGIFAnimator;
    procedure TimerTimer(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormModal: TFormModal;

implementation

{$R *.dfm}
//    Author: Anderson Mello  Date: 09-fev-2012
//  DEscription: Using TTimer after 5 seconds I close this form
procedure TFormModal.TimerTimer(Sender: TObject);
begin
 close;
end;

//    Author: Anderson Mello  Date: 09-fev-2012
//  Description: Enable the timer only when the form is shown
procedure TFormModal.FormShow(Sender: TObject);
begin
 Timer.Enabled := true;
end;

//  Description: disable when close
procedure TFormModal.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Timer.Enabled := false;
end;

//    Author: Anderson Mello  Date: 09-fev-2012
//  Description: disable close button "X", so the user can't close 
procedure TFormModal.FormCreate(Sender: TObject);
var
  hSysMenu:HMENU;
begin
  hSysMenu:=GetSystemMenu(Self.Handle,False);
  if hSysMenu <> 0 then begin
    EnableMenuItem(hSysMenu,SC_CLOSE,MF_BYCOMMAND or MF_GRAYED);
    DrawMenuBar(Self.Handle);
  end;
  KeyPreview:=True;
end;

//    Author: Anderson Mello  Date: 09-fev-2012
//  Description: disable shortcuts to close
procedure TFormModal.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_F4) and (ssAlt in Shift) then
    Key:=0;
end;
mit Adobe PDF-Verifier für eigene Testzwecke

Wir landeten. Um dies zu tun, mussten wir tatsächlich Akrobat starten und manipulieren, es ist Schnittstelle programmatisch mit Send .

Ich wäre sehr daran interessiert sein zu sehen, ob es möglich sei, stattdessen eine interne API zu verwenden.

Sie können diesen Code verwenden, eine beliebige Datei mit der entsprechenden Software angezeigt werden.

Sub Show_Document(ByVal FILENAME As String)
    Dim p As Process = Nothing
    Try
        If My.Computer.FileSystem.FileExists(FILENAME) Then
            p = Process.Start(FILENAME)
            p.Dispose()
        End If

    Catch ex As Exception

    Finally

    End Try

End Sub
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top