Multihilos en Aspose.Slides para Java
Introducción
Aunque el trabajo paralelo con presentaciones es posible (además de analizar/cargar/clonar) y todo funciona bien (la mayoría de las veces), existe una pequeña probabilidad de obtener resultados incorrectos al usar la biblioteca en varios hilos.
Recomendamos encarecidamente que no use una única instancia de Presentation en un entorno de multihilo porque podría resultar en errores o fallas impredecibles que no son fáciles de detectar.
No es seguro cargar, guardar y/o clonar una instancia de la clase Presentation en varios hilos. Tales operaciones no están soportadas. Si necesita realizar esas tareas, debe paralelizar las operaciones utilizando varios procesos monohilo, y cada uno de estos procesos debe usar su propia instancia de presentación.
Convertir diapositivas de presentación a imágenes en paralelo
Supongamos que queremos convertir todas las diapositivas de una presentación de PowerPoint a imágenes PNG en paralelo. Dado que no es seguro usar una única instancia de Presentation en varios hilos, dividimos las diapositivas de la presentación en presentaciones separadas y convertimos las diapositivas a imágenes en paralelo, usando cada presentación en un hilo distinto. El siguiente ejemplo de código muestra cómo hacerlo.
String inputFilePath = "sample.pptx";
String outputFilePathTemplate = "slide_%d.png";
final float imageScale = 2;
Presentation presentation = new Presentation(inputFilePath);
int slideCount = presentation.getSlides().size();
Dimension2D slideSize = presentation.getSlideSize().getSize();
float slideWidth = (float) slideSize.getWidth();
float slideHeight = (float) slideSize.getHeight();
List<CompletableFuture<Void>> conversionTasks = new ArrayList<>(slideCount);
for (int slideIndex = 0; slideIndex < slideCount; slideIndex++) {
// Extraer la diapositiva i en una presentación separada.
Presentation slidePresentation = new Presentation();
slidePresentation.getSlideSize().setSize(slideWidth, slideHeight, SlideSizeScaleType.DoNotScale);
slidePresentation.getSlides().removeAt(0);
slidePresentation.getSlides().addClone(presentation.getSlides().get_Item(slideIndex));
// Convertir la diapositiva a una imagen en una tarea separada.
final int slideNumber = slideIndex + 1;
conversionTasks.add(CompletableFuture.runAsync(() -> {
IImage image = null;
try {
ISlide slide = slidePresentation.getSlides().get_Item(0);
image = slide.getImage(imageScale, imageScale);
String imageFilePath = String.format(outputFilePathTemplate, slideNumber);
image.save(imageFilePath, ImageFormat.Png);
} finally {
if (image != null) image.dispose();
slidePresentation.dispose();
}
}));
}
// Esperar a que todas las tareas se completen.
CompletableFuture.allOf(conversionTasks.toArray(new CompletableFuture[0])).join();
presentation.dispose();
Preguntas frecuentes
¿Necesito llamar a la configuración de licencia en cada hilo?
No. Basta hacerlo una vez por proceso o dominio de aplicación antes de que los hilos comiencen. Si la configuración de licencia puede invocarse concurrentemente (por ejemplo, durante la inicialización perezosa), sincronice esa llamada porque el método de configuración de licencia en sí no es seguro para hilos.
¿Puedo pasar objetos Presentation o Slide entre hilos?
Pasar objetos de presentación “en vivo” entre hilos no se recomienda: use instancias independientes por hilo o precree presentaciones/contendores de diapositivas separados para cada hilo. Este enfoque sigue la recomendación general de no compartir una única instancia de presentación entre hilos.
¿Es seguro paralelizar la exportación a diferentes formatos (PDF, HTML, imágenes) siempre que cada hilo tenga su propia instancia de Presentation?
Sí. Con instancias independientes y rutas de salida separadas, esas tareas normalmente se paralelizan correctamente; evite cualquier objeto de presentación compartido y flujos de E/S compartidos.
¿Qué debo hacer con la configuración global de fuentes (carpetas, sustituciones) en multihilo?
Inicialice todas las configuraciones de fuentes globales antes de iniciar los hilos y no las modifique durante el trabajo paralelo. Esto elimina conflictos al acceder a recursos de fuentes compartidos.