Programmgesteuertes Drucken in Adobe Reader 9 unter Verwendung von .NET-Interop
-
04-07-2019 - |
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?
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;
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