Преобразование офисных документов в PDF на сервере Ubuntu

Вопрос или проблема

Мне нужно объединить несколько документов в один PDF в веб-приложении, работающем на Ubuntu Server. Я уже объединял PDF ранее, так что с этим не должно быть проблем, но документы также могут содержать файлы форматов doc, docx, xls и xlsx. Я предполагаю, что лучший вариант – сначала преобразовать их в PDF.

После немного поисков кажется, что самым популярным способом сделать это является запуск LibreOffice из командной строки для конвертации. Я протестировал его, и он работает, однако установка требует установки X11 на сервере, что не оптимально.

Даже помимо этой проблемы, когда я тестировал его с документами Excel, он, похоже, просто разбивает таблицу по колонкам, что делает ее невозможной для восприятия.

Поэтому мои вопросы следующие:

  1. Является ли этот подход лучшим выбором для этого?
  2. Если да, есть ли способ установить LibreOffice без x11?
  3. Есть ли способ более корректно обрабатывать преобразование таблиц?

Если вы не можете найти подходящее программное обеспечение, которое соответствует вашим требованиям, вам может понадобиться написать его самим. Класс DocumentConverter из LEADTOOLS SDK специально разработан для конвертации из любого формата документа в любой другой формат документа, включая форматы Office и PDF, и он даже может автоматически выполнять распознавание текста для растровых файлов. Он поддерживается как для Java, так и для .NET Core и содержит полностью функциональные демонстрации командной строки для обоих. Только как дисклеймер, я работаю в компании, которая пишет эту библиотеку.

Код очень прост для базовой конвертации, но также может быть полностью настроен для более сложных задач. Следующий код .Net может быть использован (Java очень похожа):

using (DocumentConverter converter = new DocumentConverter()){
    converter.SetDocumentWriterInstance(new DocumentWriter());
    DocumentConverterJobData jobData = new DocumentConverterJobData{
        InputDocumentFileName = @”C:\temp\InputFile.docx”,
        OutputDocumentFileName = @”C:\temp\OutputFile.pdf”,
        DocumentFormat = DocumentFormat.Pdf,
        RasterImageFormat = RasterImageFormat.Unknown, // Чтобы не выводить в растровый формат
    };
    DocumentConverterJob converterJob = converter.Jobs.CreateJob(jobData);
    converter.Jobs.RunJob(converterJob);
}

ПРИМЕЧАНИЕ ОТ МОДЕРАТОРОВ: Ссылки ниже проходят через сторонние серверы перенаправления. Публика вела переговоры с автором, чтобы обновить все ссылки на прямые. Все непрямые ссылки ниже были временно отключены до завершения этого процесса.

Syncfusion предоставляет библиотеки .NET Core для конвертации Excel (XLS, XLSX) и Word (DOC, DOCX) в PDF без необходимости установки LibreOffice, Adobe SDK или Microsoft Office. Вы можете попробовать.

Документация по конвертации Word в PDF

Демо версия конвертации Word в PDF

Документация по конвертации Excel в PDF

Демо версия конвертации Excel в PDF

Библиотека конвертера Excel в PDF от Syncfusion предоставляет следующие опции для настройки поведения разбиения страницы/колонок.

• Автоматическое – Печатает листы в их фактическом размере. По умолчанию.
• Индивидуальное масштабирование – Печатает листы по заданному параметру масштабирования (т.е. значение увеличения, установленное в настройках страницы).
• Подогнать все колонки на одной странице
• Подогнать все строки на одной странице
• Заполнить весь лист на одной странице

Пожалуйста, обратитесь к этой странице документации, чтобы узнать о настройках макета и других опциях.

https://help.syncfusion.com/file-formats/xlsio/excel-to-pdf-converter-settings#layout-options

Вы можете обратить внимание на библиотеку Spire.Office для Java. Она позволяет конвертировать несколько типов файлов, таких как Word .doc/.docx, RTF, Excel .xls/.xlsx, PowerPoint .ppt/.pptx, текст и изображения и т.д. в PDF без необходимости установки MS Office, Adobe Acrobat или другого программного обеспечения.

Следующий пример показывает, как конвертировать Word .doc/.docx, Excel .xls/.xlsx, PowerPoint .ppt/.pptx и изображения в определенной директории в PDF файлы и объединить полученные файлы в один PDF.

import com.spire.doc.Document;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfDocumentBase;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.*;
import com.spire.presentation.Presentation;
import com.spire.xls.Workbook;

import java.awt.*;
import java.awt.geom.Dimension2D;
import java.io.*;

public class MergeFilesToOnePDF {
    public static void main(String []args) throws Exception {        

        //Создать объект File для директории
        File directoryPath = new File("D:\\Files");
        //Проверить, существует ли директория
        if(!directoryPath.exists()){
            throw new RuntimeException("Директория не существует.");
        }
        //Получить файлы в директории
        File[] filesList = directoryPath.listFiles();

        //Создать массив InputStream
        InputStream[] streams = new InputStream[filesList.length];
        int i = 0;
        //Перебрать файлы
        for (File file : filesList) {
            //Получить имя файла
            String fileName = file.getName();
            //Получить абсолютный путь файла
            String absolutePath = file.getAbsolutePath();
            //Получить расширение имени файла
            String extension = fileName.substring(fileName.lastIndexOf("."), fileName.length());

            //Конвертировать различные типы файлов в PDF и сохранить в потоки
            switch (extension) {

                case ".doc":
                case ".docx":
                    //Конвертировать Word в PDF и сохранить в поток
                    Document doc = new Document();
                    doc.loadFromFile(absolutePath);
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    doc.saveToStream(bos, com.spire.doc.FileFormat.PDF);
                    streams[i++] = new ByteArrayInputStream(bos.toByteArray());
                    break;

                case ".xls":
                case ".xlsx":
                    //Конвертировать Excel в PDF и сохранить в поток
                    Workbook workbook = new Workbook();
                    workbook.loadFromFile(absolutePath);
                    //workbook.getConverterSetting().setSheetFitToPage(true);
                    bos = new ByteArrayOutputStream();
                    workbook.saveToStream(bos, com.spire.xls.FileFormat.PDF);
                    streams[i++] = new ByteArrayInputStream(bos.toByteArray());
                    break;

                case ".ppt":
                case ".pptx":
                    //Конвертировать PowerPoint в PDF и сохранить в поток
                    Presentation ppt = new Presentation();
                    ppt.loadFromFile(absolutePath);
                    bos = new ByteArrayOutputStream();
                    ppt.saveToFile(bos, com.spire.presentation.FileFormat.PDF);
                    streams[i++] = new ByteArrayInputStream(bos.toByteArray());
                    break;

                case ".pdf":
                    //Сохранить PDF в поток
                    PdfDocument pdf = new PdfDocument();
                    pdf.loadFromFile(absolutePath);
                    bos = new ByteArrayOutputStream();
                    pdf.saveToStream(bos, com.spire.pdf.FileFormat.PDF);
                    streams[i++] = new ByteArrayInputStream(bos.toByteArray());
                    break;

                case ".png":
                case ".jpg":
                    //Конвертировать изображение в PDF и сохранить в поток
                    pdf = new PdfDocument();
                    //Конвертировать дюймы в точки
                    PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
                    float width = unitCvtr.convertUnits(8.5f, PdfGraphicsUnit.Inch, PdfGraphicsUnit.Point);
                    float height = unitCvtr.convertUnits(11.0f, PdfGraphicsUnit.Inch, PdfGraphicsUnit.Point);
                    Dimension2D size = new Dimension((int)width, (int)height);
                    //Установить размер страницы
                    pdf.getPageSettings().setSize(size);
                    PdfPageBase page = pdf.getPages().add();
                    PdfImage image = PdfImage.fromFile(absolutePath);
                    page.getCanvas().drawImage(image, 100, 50);
                    bos = new ByteArrayOutputStream();
                    pdf.saveToStream(bos, com.spire.pdf.FileFormat.PDF);
                    streams[i++] = new ByteArrayInputStream(bos.toByteArray());
                    break;

                default:
                    System.out.println("Неверный формат файла.");
                    break;
            }
        }

        //Объединить PDF в потоках в один PDF
        PdfDocumentBase pdf = PdfDocument.mergeFiles(streams);
        OutputStream outputStream = new FileOutputStream("D:\\Output\\Combine.pdf");
        pdf.save(outputStream);
        pdf.close();
    }
}

Помимо конвертации файлов, он также предоставляет множество других функций, вы можете посетить документацию для получения дополнительной информации:
https://www.e-iceblue.com/Tutorials.html

Ответ или решение

Конвертация офисных документов в PDF на сервере Ubuntu

Конвертация различных офисных документов, таких как DOC, DOCX, XLS и XLSX в PDF, представляет собой важную задачу для многих веб-приложений, особенно когда необходимо объединить несколько документов в один файл PDF. В этой статье мы рассмотрим реальный подход к решению данной задачи на сервере Ubuntu, проанализируем использование LibreOffice и альтернативные методы без установки X11, а также обсудим, как улучшить качество конвертации таблиц Excel.

1. Использование LibreOffice для конвертации

Конвертация документов с помощью LibreOffice является одним из самых популярных способов. LibreOffice можно запустить в безголовом режиме (headless mode), что позволяет избежать установки X11 и использования графической среды. Чтобы установить LibreOffice на Ubuntu Server и использовать его для конвертации, выполните следующие команды:

sudo apt update
sudo apt install libreoffice

Для конвертации докуменов в PDF из командной строки используйте следующую команду:

libreoffice --headless --convert-to pdf yourfile.docx

Этот способ эффективен, однако существует риск, что при конвертации таблиц Excel будут некорректно обрабатываться страницы. Для улучшения этого процесса потребуется другая стратегия.

2. Альтернативные решения без X11

Если установка LibreOffice не подходит, возможно рассмотреть специализированные библиотеки, такие как Syncfusion или Spire.Office. Эти библиотеки позволяют производить конвертацию документов без необходимости установки Office или дополнительных графических интерфейсов.

Syncfusion

Syncfusion предоставляет API для преобразования Office-документов в PDF, включая возможности настройки параметров печати и адаптации к требованиям пользователей. Подключив библиотеку Syncfusion, вы можете легко конвертировать документы в PDF. Пример кода на .NET:

using Syncfusion.DocIO;
using Syncfusion.Pdf;

class Program
{
    static void Main()
    {
        // Конвертация DOCX в PDF
        WordDocument document = new WordDocument("input.docx");
        document.Save("output.pdf", FormatType.PDF);
    }
}

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

Spire.Office

Spire.Office предоставляет аналогичные возможности для работы с документами. Пример кода для конвертации документа в формате Excel в PDF:

Workbook workbook = new Workbook();
workbook.loadFromFile("input.xlsx");
workbook.saveToFile("output.pdf", FileFormat.PDF);

Эти библиотеки позволяют избежать сложностей, связанных с графической оболочкой и обеспечить надежную обработку офисных документов.

3. Упрощение конвертации таблиц Excel

Как упоминалось ранее, конвертация таблиц Excel в PDF может приводить к проблемам с разбиением страниц. Если вы используете библиотеки, такие как Syncfusion или Spire.Office, важно изучить доступные параметры настройки печати.

Некоторые опции, которые можно рассмотреть:

  • Автоматическое масштабирование: позволяет сохранить исходные размеры листа.
  • Настройка пользовательского масштабирования: в этом случае можно указать, в каком масштабе документ будет напечатан.
  • Вписывание всех строк и столбцов на одной странице: позволяет уменьшить количество страниц.

Эти настройки помогут упростить и улучшить процесс конвертации, делая итоговый PDF-файл более читабельным и удобным для восприятия.

Заключение

Конвертация офисных документов в PDF на сервере Ubuntu возможна различными способами, но использование библиотек, таких как Syncfusion или Spire.Office, может значительно упростить процесс и добавить гибкости в настройках конвертации. Без необходимости установки графических интерфейсов и при наличии мощных API вы сможете эффективно выполнять ваши задачи. Загляните в документацию библиотек для получения подробной информации и примеров использования в ваших проектах.

Оцените материал
Добавить комментарий

Капча загружается...