.net - puedo - descargar pdf gratis y seguro
Imprimir mediante programaciĆ³n en Adobe Reader 9 usando.NET Interop (4)
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)?
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.
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.
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;