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)?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top