vb.net español - Imprimir mediante programación en Adobe Reader 9 usando.NET Interop





descargar xi (5)


Usar este método para imprimir múltiples documentos no va a funcionar bien como lo encontró.

Tenerlo funciona es bastante complicado, pero aquí hay una descripción general de la solución.

Uso System.Diagnostics.Process para imprimir usando myProcess.StartInfo.Verb = "Imprimir" Luego verifico el estado y el estado de la cola de la impresora en dos pasos para asegurarme de que la impresión esté lista lo suficiente como para poder imprimir el próximo 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 el spooling se inicia antes de seguir imprimiendo el siguiente.

Consulte http://msdn.microsoft.com/en-us/library/aa394363.aspx para la clase Win32_Printer WMI.

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 (el dll es AcroPDF.dll, el nombre COM "Adobe PDF Reader". Después de algunos experimentos, funciona el siguiente código).

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 PDF, parece que la sentencia End Using llama a disponer sobre el control antes de que haya terminado de imprimir.

Por lo tanto, parece que la llamada a printAll no es de bloqueo, pero no puedo encontrar una propiedad de devolución de llamada o estado que pueda consultar para ver si se completó la cola de impresión. Me falta una propiedad / método o hay un trabajo más elegante (y más receptivo)?




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



Tuve el mismo problema al usar AcroPDF en Delphi ... luego descubrí que cuando "detengo" el proceso usando un mensaje, AcroPDF comienza a imprimir.

Así que solo creo un TForm modal que se cierra después de algunos segundos.

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

El TFormModal es esto y simplemente inserto un ícono de carga en el formulario para representar algo así como "imprimir".

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 propósitos de prueba. Para hacer esto, tuvimos que lanzar acrobat y manipular su interfaz mediante programación utilizando SendInput .

Me interesaría mucho ver si sería posible utilizar una API interna.




usa DateTime.Now

prueba esto:

DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")




.net vb.net interop activex adobe-reader