Red de conocimiento informático - Material del sitio web - Cómo imprimir pdf usando javascript en java

Cómo imprimir pdf usando javascript en java

Solución Java pura:

Lo primero que pensamos es, naturalmente, en el JPS (Java Printing Service) proporcionado por JDK1.4. Sin embargo, aunque esto es compatible con PDF Flavor, sin embargo, ya sean experimentos personales o comentarios de otras personas en Internet, parece que es inútil en absoluto. Tal vez si el controlador de su impresora admite PDF Flavor, JPS detectará esta característica de su controlador y podrá imprimir documentos PDF con éxito, pero. En la mayoría de los casos, esta situación no es cierta, ¡por lo que JPS está muerto!

Veamos si Adobe, el hogar de PDF, tiene algún arma mágica. Encontramos un componente Viewer Bean y decimos que puede infiltrar PDF en Swing en forma de componente Bean. Pero espera, el acuerdo no proporciona ningún soporte y no garantiza que no habrá problemas pase lo que pase, pruébalo y lo sabrás después de un experimento. Maldita sea, las excepciones ocurren con frecuencia y este componente es relativamente antiguo. ¡Así que tíralo a un lado!

También hay un PDFBox, que es de código abierto, pero no es compatible con el chino y parece que el progreso del desarrollo no es muy bueno. No se ha lanzado una versión oficial y básicamente no se puede publicar. utilizado en un entorno de producción;

Finalmente, pasemos a los productos de Commercial. Probé JPrint de ActiveTree y me sentí bien. Puede satisfacer completamente nuestras necesidades y es perfecto. Sin embargo, la tarifa de la licencia es muy costosa. Después de preguntar por correo electrónico, la respuesta fue que la compra mínima es de 2000 USD Jaja, aunque los japoneses son muy ricos, también sienten pena por el dinero, ¡así que al final tienen que darse por vencidos! (La licencia de ActiveTree en realidad me impresionó mucho. En realidad, era de uso gratuito en 2003, pero luego cambió de opinión. Jaja, recuerdo que mencioné algunos errores en ese momento. Olvídalo, lo hicieron. Esto tampoco es fácil. )

Otros productos comerciales también son caros, por lo que básicamente se ha rechazado aquí la solución Java-Com.

La solución de Java-Com:

Después de que el camino anterior falló, aprendí del dolor y decidí recurrir a un campo con el que no estaba familiarizado, el territorio de la Sra. I. Planeamos llamarlo desde el componente Java Com. El componente Com nos ayuda a realizar la impresión de PDF. Si no es suficiente, ¡el camino no será fácil!

Sabemos que cuando se lance Acrobat Reader, lanzará un componente COM compatible con el navegador para manipular su formato de documento PDF. Por lo tanto, queremos llamar a este componente COM lanzado localmente.

Aunque los formatos de este componente de las versiones 5, 6 y 7 son diferentes (5 y 6 se lanzan en formato ocx y 7 se lanza en formato dll), pase lo que pase, ¡comencemos con 7!

Para llamar a com, necesitamos un puente de Java a com, así que Jacob es el primero que me viene a la mente porque lo ha usado antes. Pero aquí viene el problema: ¡no sabemos qué interfaces de llamada proporciona este componente de comunicación! Por desgracia, no hay otra manera. Regresé a la escuela para pedir ayuda a mis compañeros de clase que están familiarizados con .net y finalmente se me ocurrieron algunos métodos de llamada necesarios (ah, pobre de mi fin de semana, regresé el lunes). y usé a Jacob para llamar, pero lo intenté con izquierda y derecha. Sigue arrojando excepciones, ¡estoy tan enojado! ¿Es problema de Jacob? ! Busqué productos similares como jcom y jcom2, pero jcom eran todos documentos japoneses, así que no había manera, y jcom2 probablemente era una virtud (olvidé por qué rechacé esto en primer lugar), así que decidí probar un comercial. ¡producto!

Los principales productos comerciales en esta área incluyen J-Integra, JPanel (parece llamarse así) y un producto llamado JNIWrapper (esto fue usado por una persona para demostrar el uso de Acrobat5 para imprimir PDF en Java ) llegó). Lo bueno de estos productos comerciales es que pueden generar automáticamente el código Java del objeto Proxy correspondiente en función del componente COM que desee llamar, de modo que pueda llamar directamente al código Java con el que está familiarizado. Si proyectos de código abierto como Jacob proporcionan una herramienta de generación de código similar, no serán inferiores a estos productos comerciales. En vista del precio de los productos comerciales, finalmente los rechacé (los japoneses son realmente tacaños).

De esta forma, Java-com no tiene solución a este problema.

Sin embargo, al final, todavía usé a Jacob en mi solución. Este es un tema posterior, no lo mencionemos por ahora...

Entonces pensemos en ello, si. No es posible imprimir PDF, ¿es posible imprimir en otros formatos? ! Por ejemplo, imágenes, este JPS se puede imprimir completamente, así que averigüemos si existe una herramienta para convertir el formato PDF a otros formatos.

Soluciones para la conversión de formato PDF:

En este campo, las principales son GhostScript/GView e ImageMagick. El primero puede convertir el formato PDF a PostScript, pero parece que GhostScript no puede. Imprimalo completamente usando JPS; este último es una herramienta API para convertir PDF a imagen. Su implementación de Java se llama JMagick, pero tiene el mismo problema que GhostScript, es decir, para convertir, debe instalarlo localmente y luego usarlo. El método de línea de comando para llamar, esto obviamente no es muy bueno y la integración es muy pobre, ¡así que abandonémoslo!

El restante es una llamada de línea de comando, que se encuentra en el sitio web de itext. Puede imprimir lo que desee ejecutando un comando como AcroRd32 /p /h "ruta al archivo PDF" en la línea de comando. Los archivos PDF impresos, por supuesto, puede colocarlos en un archivo por lotes para ejecutar estos comandos de impresión después de generar los archivos PDF, pero el único problema con esta solución es que cada vez que se imprime un archivo, se abrirá una ventana de Acrobat Reader. iniciado y debe apagarse manualmente, que actualmente no cumple con los requisitos actuales del sistema.

Bien, básicamente he enumerado todas las soluciones y no he encontrado una solución factible:-(

(No hay dinero, de lo contrario, JPrint de Activetree es bueno)

Estas cosas me deprimieron durante unos 3 o 4 días. Durante esos días, estaba mortalmente aburrido.

Sin embargo, al final de estos días de depresión, hubo un destello de inspiración. Se me pasó por la cabeza...

¿Puedes iniciar un servicio de impresión y enviarlo directamente cuando se va a imprimir el documento? ¿Y encontré una sección que carga un documento PDF en una página web? código, y puedes usar js para controlar la impresión de PDF, por lo que surgió la solución final...

1-Usa jacob para iniciar un proceso de IE y ocultar la ventana de IE;

si (es decir, Automation == null)

ieAutomation = new ActiveXComponent("InternetExplorer.Application");

ieAutomation.setProperty("Visible", nueva variante (falso)

2-La interfaz de PDF envía el archivo generado a JacobPDFPrinter después de generar el archivo PDF. JacobPDFPrinter utiliza el motor de plantillas Velocity para generar dinámicamente un archivo PDF basado en la ruta completa del archivo PDF entrante y saliente. de la lógica de impresión de PDF (por supuesto, extraemos la lógica de usar Velocity para generar documentos por separado en la clase VeloIEPrinterGenerator

3-Después de generar el HTML, puede usar Jacob para llamar a Navigate2 de IE en JacobPDFPrinter); , redirija IE al archivo HTML recién generado, de modo que IE llame al código JS en segundo plano para imprimir el PDF en la impresora predeterminada;

4-Después de que la impresión sea exitosa, borre el archivo temporal generado dinámicamente Archivo HTML;

5 - Salga del proceso de IE en segundo plano antes de que salga el programa principal

Lo anterior es una solución que puedo ofrecer, no es perfecta, pero funciona.

Algunos problemas que necesitan atención son:

(1) Es necesario configurar una opción avanzada de IE para ejecutar scripts locales;

(2) Debido a Java y Hilos de comunicación La inconsistencia del modelo provoca que se genere una excepción de llamada de Com cuando finalmente se cierra el proceso de IE en segundo plano. Debido a que no estoy muy familiarizado con la API de la plataforma Win y los modelos de programación relacionados, necesito pedirle a otros que me ayuden a resolver este problema. ;

(3) Cuando IE ejecuta JS para imprimir PDF, también iniciará un proceso de Acrobat en segundo plano y nuestro programa no puede controlar el ciclo de vida de este proceso, por lo tanto, después de que se cierra el programa principal. , no tenemos forma de finalizar este proceso al mismo tiempo. OK, no importa cuántas veces lo ejecutemos, solo hay un proceso en segundo plano, por lo que la carga de rendimiento no es muy pesada;

Reimprimir.