¿Cómo puedo enviar un fax para un pdf desde un servicio de Windows usando FAXCOMEXLib?

 C Programming >> Programación C >  >> Tags >> PDF
¿Cómo puedo enviar un fax para un pdf desde un servicio de Windows usando FAXCOMEXLib?

Está bastante bien documentado en el artículo de MSDN. Lo no trivial que debe suceder es que algunos el software necesita convertir el contenido del archivo en texto imprimible que se pueda enviar por fax. Citando:

Entonces, una prueba simple que puede hacer es hacer clic con el botón derecho en el archivo en el Explorador y buscar el comando "Imprimir". A continuación, arrastre el archivo a una impresora para ejercer el verbo PrintTo. Si estas pruebas fallan, entonces no funcionará y deberá instalar una aplicación que sepa cómo imprimir el archivo.

Hacer esto desde un servicio impone requisitos adicionales a la aplicación que realiza la impresión. Hay muchos de ellos que no se comportan particularmente bien en un servicio. Especialmente cuando intenta imprimir, Microsoft recomienda encarecidamente que nunca lo haga en un servicio. Las aplicaciones de Office, por ejemplo, no lo hacen últimamente, lo que hace que el consejo de MSDN ya sea una salsa débil.

En mi máquina, la extensión .tif está asociada con una aplicación UWP, que tampoco funcionará en un servicio. Dar buenos consejos es difícil dada la gran cantidad de aplicaciones que manejan estas extensiones populares, lo mejor es ir a superuser.com y nombrar la extensión específica, la versión de Windows y la aplicación que prefiere usar. Hacer esto desde una sesión de usuario es ciertamente lo menos problemático.


Quiero dar una respuesta completa a esto. Las respuestas publicadas anteriormente tenían parte de la solución, pero no brindaban una imagen completa de todo lo que teníamos que hacer para enviar con éxito un archivo pdf a través de una línea de fax, utilizando FAXCOMEXLib en nuestro servicio personalizado de Windows.

Quiero comenzar diciendo que FAXCOMEXLib está hecho para una aplicación de consola de Windows, no para un servicio de Windows. Incluso puedes leer esto en la documentación. Y creo que por eso tuvimos tantos problemas para que funcionara.

Sin embargo, pudimos hacerlo funcionar (finalmente) después de mucho ensayo y error. La mayoría de los problemas que enfrentamos estaban relacionados con la configuración y los permisos en Adobe Reader. Lo que descubrimos es que Adobe Reader intentaba hacer muchas cosas entre bastidores al procesar un archivo PDF. Y esas "cosas" que estaba tratando de hacer requerían la interacción del usuario (hacer clic en los cuadros de alerta, etc.). Cuando se ejecuta esto en un servicio de Windows, no hay interacción del usuario de ese servicio, lo que provocó que nuestro proceso se bloqueara indefinidamente y, finalmente, fallara. Pero, descubrimos que hay una manera de evitar todo eso. Así es como lo hicimos:

Aquí está el fragmento de código que estamos usando que funciona:

fileName = @"D:\temp\FaxTest.pdf";
faxDoc.Sender.Name = faxRec.From;
faxDoc.Sender.Company = faxRec.From;
faxDoc.Body = fileName;
faxDoc.Subject = faxRec.ReferenceId;
faxDoc.DocumentName = faxRec.ReferenceId;
var to = "xxxxxxxxxx";
faxDoc.Recipients.Add(to, "Some Name");
var serverName = Environment.MachineName;
var myProcesses = Process.GetProcessesByName("AcroRd32");
foreach (var myProcess in myProcesses)
{
    if (DateTime.Now.Ticks - myProcess.StartTime.Ticks > TimeSpan.FromSeconds(30).Ticks) {
        myProcess.Kill();
    }
}
string[] returnVal = faxDoc.Submit(serverName);

Hay más código que este en nuestro servicio, por supuesto. El otro código hace cosas como manejar controladores de eventos de devolución de llamada para rastrear el estado de los faxes enviados/completados/fallidos, etc. Pero este es el "corazón" del código que realmente inicia el "envío".

Y aquí hay una lista de los cambios de configuración que hicimos en el servidor para que nuestro servicio personalizado de Windows descodifique, procese y envíe correctamente archivos pdf como faxes. Algunos de estos se enumeran en algunas de las respuestas, pero otros no, y quería que esta fuera una respuesta completa.

  1. Inicie sesión como administrador en el servidor e instale la función de servidor de fax en el servidor.
  2. Asegúrese de que el dispositivo/tarjeta de módem de fax esté instalado correctamente en el servidor y que la línea de fax esté activa. Puede intentar enviar un par de faxes de prueba con archivos de texto directamente desde la utilidad Windows Fax. (En nuestro caso, tuvimos problemas porque tuvimos que marcar "9" y una contraseña secreta para obtener una línea externa de larga distancia).
  3. Instala Adobe Reader en el servidor.
  4. Cree un usuario en el servidor para que su servicio de Windows se ejecute "como". Llamamos a nuestro usuario "FaxServiceUser".
  5. Inicie sesión en el servidor como este FaxServiceUser al menos una vez. Mientras esté conectado, configure el dispositivo "Adobe PDF" como la impresora predeterminada.
  6. Además, mientras esté conectado como este usuario, abra un archivo PDF con Adobe y haga clic en los EULA.
  7. Mientras inicia sesión como este usuario y tiene Adobe Reader abierto, cambie esta configuración:
    • Si está marcada, desmarque "Mostrarme mensajes cuando inicie Reader" (en "General")
    • Desmarque la casilla de verificación "Habilitar modo protegido" al inicio (es posible que esto solo se aplique a Acrobat 10. En Acrobat 11, esta opción se movió a Seguridad (mejorada) y se titula Habilitar modo protegido al inicio. Solo asegúrese de desmarca esta opción)
    • Desmarque "Habilitar seguridad mejorada" (en "Seguridad (mejorada)"; esto podría aplicarse solo a Acrobat 11 y superior)
    • Seleccione la opción Actualizador y deshabilite Descarga automática e instalación de actualizaciones.
    • Desmarque "Crear enlaces desde URL" (en "General")
    • Desmarque "Hacer que la herramienta Mano lea artículos" (en "General")
    • Desmarque "Mostrarme mensajes cuando inicie Reader" (en "General")
    • Desmarque "Calcular automáticamente valores de campo" (en "Formularios")
    • Desmarque "Mostrar rectángulos de enfoque" (en "Formularios")
    • Desmarque "Mostrar indicador de desbordamiento del campo de texto" (en "Formularios")
    • Desmarque "Habilitar Acrobat JavaScript" (en "Javascript")
    • Desmarque "Mostrar diálogo de bienvenida" (en "Revisando")
    • Desmarque "Mostrar el cuadro de diálogo de advertencia de conexión del servidor al abrir el archivo" (en "Revisando")
  8. Si es necesario, consulte este enlace para obtener ayuda con la configuración de Adobe Reader:http://kb.faxback.com/How+To+Configure+Adobe+XI+for+Use+with+NET+SatisFAXtion
  9. Después de compilar, implementar e instalar su servicio de Windows, cambie las propiedades de su servicio para que se ejecute "como" el usuario que creó anteriormente ("FaxServiceUser" en nuestro caso).
  10. Agregue permisos para ese FaxServiceUser a cualquiera de las carpetas que necesita para leer/escribir/eliminar de/a.
  11. Dado que Adobe está diseñado para ejecutarse como una aplicación de escritorio, agregue código en su servicio para liberar la memoria utilizada por Adobe Reader (puede ver cómo hicimos esto en el myProcess.Kill() en el código de muestra).

Y eso debería hacerlo. Es un poco engorroso, pero espero que esto brinde un ejemplo completo de cómo configurar Adobe Reader junto con su servicio personalizado de Windows para enviar faxes desde archivos pdf en un servidor de Windows. Lo hemos estado haciendo durante un par de meses y sin problemas. Nuestro cliente hace un bajo volumen de faxes, por lo que no puedo hablar de cómo funciona esto con un gran volumen de faxes. Entonces, si está buscando una forma "gratuita" de enviar faxes, sin pagar algo como Interfax, esta podría ser una opción viable, al menos para un volumen bajo.


No