Печать презентации

В Aspose.Slides для Java 24.4 мы представили Современный API, который ограничивает поддержку печати. Однако мы приняли новый подход, чтобы помочь вам преодолеть это ограничение. В этой статье мы покажем вам, как напечатать презентацию, используя текущий API.

Печать презентации

Этот фрагмент кода на Java демонстрирует, как напечатать презентацию PowerPoint, используя API Aspose.Slides для Java.

Чтобы распечатать презентацию, выполните следующие шаги:

  1. Создайте экземпляр PrintRequestAttributeSet и укажите атрибуты печати, такие как ориентация и диапазон страниц.
  2. Создайте экземпляр RenderingOptions и укажите параметры для макета заметок слайдов.
  3. Создайте экземпляр класса Presentation, указав файл презентации.
  4. Создайте экземпляр PrinterJob, чтобы указать нужный принтер.
  5. Сгенерируйте массив изображений слайдов с помощью метода getImages.
  6. Установите массив IImage как печатаемый для PrinterJob.
  7. Вызовите метод print класса PrinterJob.

Не забудьте заменить “printerName” на имя вашего конкретного принтера и настроить PrintRequestAttributeSet и RenderingOptions в соответствии с вашими требованиями к печати.

Если у вас возникнут какие-либо проблемы или вам нужна дополнительная помощь, не стесняйтесь обращаться к нашей службе поддержки.

public void print() 
{
    // Определите имя принтера
    String printerName = "Adobe PDF";
    // Определите слайды для печати
    int[] slidesToPrint = { 2, 3, 4 };
    // Определите ориентацию страницы
    OrientationRequested pageOrientation = OrientationRequested.LANDSCAPE;

    // Определите коэффициент масштабирования для рендеринга изображений
    final int scaleFactor = 4;

    // Установите атрибуты печати
    final PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
    attributes.add(pageOrientation);

    // Настройте параметры рендеринга для слайдов
    final RenderingOptions renderingOptions = new RenderingOptions();
    final INotesCommentsLayoutingOptions slidesLayoutOptions = new NotesCommentsLayoutingOptions();
    // Чтобы напечатать заметки, используйте OrientationRequested.PORTRAIT
    //slidesLayoutOptions.setNotesPosition(NotesPositions.BottomFull);
    renderingOptions.setSlidesLayoutOptions(slidesLayoutOptions);

    // Загрузите файл презентации
    final Presentation pres = new Presentation("presentation.pptx");
    try {
        // Получите задание на печать
        final PrinterJob printerJob = PrinterJob.getPrinterJob();
        // Установите нужный сервис печати
        printerJob.setPrintService(findPrintService(printerName));

        // Получите формат страницы по умолчанию
        final PageFormat pageFormat = printerJob.defaultPage();

        // Определите размеры изображений в зависимости от ориентации
        IImage[] slideImages;
        Dimension imageSize;
        if (pres.getSlideSize().getOrientation() == SlideOrientation.Landscape &&
            slidesLayoutOptions.getNotesPosition() != NotesPositions.BottomFull) {
            // Альбомная ориентация
            imageSize = new Dimension(
                    (int) pageFormat.getImageableHeight() * scaleFactor,
                    (int) pageFormat.getImageableWidth() * scaleFactor);

        } else {
            // Портретная ориентация
            imageSize = new Dimension(
                    (int) pageFormat.getImageableWidth() * scaleFactor,
                    (int) pageFormat.getImageableHeight() * scaleFactor);
        }
        // Рендеринг изображений слайдов
        slideImages = pres.getImages(renderingOptions, slidesToPrint, imageSize);
        // Освободите объект презентации
        pres.dispose();

        // Установите печатное изображение для задания печати
        printerJob.setPrintable(new MultiImagePrintable(convertToBufferedImage(slideImages)), pageFormat);
        // Печать слайдов с указанными атрибутами
        printerJob.print(attributes);
    } catch (PrinterException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

// Метод для поиска PrintService по его имени
static PrintService findPrintService(String printerName)
{
    PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
    for (PrintService service : printServices) {
        if (service.getName().equals(printerName)) {
            return service;
        }
    }
    return null;
}

// Метод для преобразования массива объектов IImage в список объектов BufferedImage
static List<BufferedImage> convertToBufferedImage(IImage[] images) throws IOException {
    List<BufferedImage> result = new ArrayList<>();
    for (IImage img : images)
    {
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        img.save(baos, ImageFormat.Png);
        img.dispose();

        result.add(ImageIO.read(new ByteArrayInputStream(baos.toByteArray())));
    }
    return result;
}

// Статический класс MultiImagePrintable, реализующий интерфейс Printable
static class MultiImagePrintable implements Printable
{
    private java.util.List<BufferedImage> images;

    public MultiImagePrintable(java.util.List<BufferedImage> images)
    {
        this.images = images;
    }

    @Override
    public int print(Graphics g, PageFormat pf, int pageIndex)
    {
        if (pageIndex >= images.size())
            return Printable.NO_SUCH_PAGE;

        Graphics2D g2d = (Graphics2D) g;
        g2d.translate(pf.getImageableX(), pf.getImageableY());

        Image image = images.get(pageIndex);

        double scaleX = pf.getImageableWidth() / image.getWidth(null);
        double scaleY = pf.getImageableHeight() / image.getHeight(null);
        double scale = Math.min(scaleX, scaleY);

        int width = (int) (image.getWidth(null) * scale);
        int height = (int) (image.getHeight(null) * scale);

        g.drawImage(image, 0, 0, width, height, null);

        return Printable.PAGE_EXISTS;
    }
}