Impresión mediante programación en Adobe Reader 9 usando .NET Interop
-
04-07-2019 - |
Pregunta
Estoy usando VB.Net WinForms. Me gustaría llamar al control ActiveX de Adobe Reader 9 para imprimir algunos archivos PDF. He agregado el control ActiveX a la caja de herramientas de VS (la dll es AcroPDF.dll, el nombre de COM " Adobe PDF Reader " ;. Después de algunos experimentos, el siguiente código funciona.
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
Sin el bit Yuk, esto solo imprimirá algunos de los archivos PDF, parece que la instrucción de uso final está llamando. Deshágase del control antes de que termine de imprimir.
Por lo tanto, parece que la llamada a printAll no está bloqueada pero no puedo encontrar una devolución de llamada o propiedad de estado que pueda consultar para ver si se ha completado la cola de impresión. Me estoy perdiendo una propiedad / método o ¿hay algún trabajo más elegante (y más sensible)?
Solución
Usar este método para imprimir múltiples documentos no funcionará bien como lo encontró.
Hacer que funcione es bastante complicado, pero aquí hay una descripción general de la solución.
Utilizo System.Diagnostics.Process para imprimir utilizando myProcess.StartInfo.Verb = " Imprimir " Luego reviso el estado y el estado de la cola de la impresora en dos pasos para asegurarme de que la impresión esté lo suficientemente lista para poder imprimir el siguiente documento. Use WMI y ManagementObjectSearcher para enumerar la información de la impresora usando " SELECT * FROM Win32_Printer " La lógica es que trato de ver si la cola de impresión se inicia antes de continuar imprimiendo la siguiente.
Ver http://msdn.microsoft.com/en-us/ library / aa394363.aspx para la clase WMI Win32_Printer.
Otros consejos
Tuve el mismo problema al usar AcroPDF en Delphi ... luego me di cuenta de que cuando dejaba de " " el proceso utiliza un mensaje, AcroPDF comienza a imprimir.
Así que acabo de crear un TForm modal que se cierra después de unos segundos.
var
formModal : TFormModal;
begin
formModal := TFormModal.Create(self);
//PrintMethodHere
frmPecas.CarregarDocumentoParaImpressao();
formModal.ShowModal;
end;
El TFormModal es esto y solo inserto un icono de carga en el formulario para representar algo como "impresión".
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;
Terminamos usando el Verificador PDF de Adobe para nuestros propios fines de prueba. Para hacer esto, tuvimos que iniciar Acrobat y manipular su interfaz mediante programación utilizando SendInput .
Estaría muy interesado en ver si sería posible utilizar una API interna en su lugar.
Puede usar este código para mostrar cualquier archivo con su software apropiado.
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