Создание PDF из Word (DOC) с использованием Apache POI и iText в JAVA - PullRequest
6 голосов
/ 19 мая 2011

Я пытаюсь создать документ PDF из документа * .doc.До сих пор и благодаря stackoverflow я успешно генерировал его, но с некоторыми проблемами.

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

Вот код:

        in = new FileInputStream(sourceFile.getAbsolutePath());
        out = new FileOutputStream(outputFile);

        WordExtractor wd = new WordExtractor(in);

        String text = wd.getText();

        Document pdf= new Document(PageSize.A4);

        PdfWriter.getInstance(pdf, out);

        pdf.open();
        pdf.add(new Paragraph(text));

Ответы [ 5 ]

11 голосов
/ 20 мая 2011

docx4j включает код для создания PDF-файла из документа docx с использованием iText. Он также может использовать POI для преобразования документа в документ.

Было время, когда мы поддерживали оба метода одинаково (а также PDF через XHTML), но мы решили сосредоточиться на XSL-FO.

Если это вариант, вам будет гораздо лучше использовать docx4j для преобразования docx в PDF через XSL-FO и FOP.

Используйте это так:

        wordMLPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath));

        // Set up font mapper
        Mapper fontMapper = new IdentityPlusMapper();
        wordMLPackage.setFontMapper(fontMapper);

        // Example of mapping missing font Algerian to installed font Comic Sans MS
        PhysicalFont font 
                = PhysicalFonts.getPhysicalFonts().get("Comic Sans MS");
        fontMapper.getFontMappings().put("Algerian", font);             

        org.docx4j.convert.out.pdf.PdfConversion c 
            = new org.docx4j.convert.out.pdf.viaXSLFO.Conversion(wordMLPackage);
        //  = new org.docx4j.convert.out.pdf.viaIText.Conversion(wordMLPackage);

        OutputStream os = new java.io.FileOutputStream(inputfilepath + ".pdf");         
        c.output(os);

Обновление июль 2016

Начиная с docx4j 3.3.0, коммерческий рендерер PDF от Plutext является опцией docx4j по умолчанию для преобразования docx в PDF. Вы можете попробовать онлайн демо на converter-eval.plutext.com

Если вы хотите использовать существующий подход docx к XSL-FO к PDF (или другую цель, поддерживаемую Apache FOP), просто добавьте jar docx4j-export-FO в ваш путь к классам.

В любом случае, для преобразования docx в PDF вы можете использовать метод toPDF фасада Docx4J.

Старый docx в PDF через код iText можно найти на https://github.com/plutext/docx4j-export-FO/.../docx4j-extras/PdfViaIText/

2 голосов
/ 19 мая 2011

WordExtractor просто захватывает простой текст, больше ничего. Вот почему все, что вы видите, это простой текст.

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

Одним из вариантов может быть поиск кода, который превращает XHTML в PDF. Затем используйте Apache Tika, чтобы превратить ваш текстовый документ в XHTML (он использует POI под капотом и обрабатывает все необходимое для форматирования), а также из XHTML в PDF.

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

1 голос
/ 16 августа 2012

Используйте OpenOffice / LbreOffice и JODConnector Это также в основном работает для .doc к .docx. Проблемы с графикой, с которыми я еще не справился.

    private static void transformDocXToPDFUsingJOD(File in, File out)
{
    OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
    DocumentFormat pdf = converter.getFormatRegistry().getFormatByExtension("pdf");
    converter.convert(in, out, pdf);
}



private static OfficeManager officeManager;

@BeforeClass
public static void setupStatic() throws IOException {

    /*officeManager = new DefaultOfficeManagerConfiguration()
      .setOfficeHome("C:/Program Files/LibreOffice 3.6")
      .buildOfficeManager();
      */
    officeManager = new ExternalOfficeManagerConfiguration().setConnectOnStart(true).setPortNumber(8100).buildOfficeManager();


    officeManager.start();
}

@AfterClass
public static void shutdownStatic() throws IOException {

    officeManager.stop();
}

Вам нужно запустить LibreOffice в качестве сервера, чтобы сделать эту работу. Из командной строки вы можете сделать это с помощью;

"C:\Program Files\LibreOffice 3.6\program\soffice.exe" -accept="socket,host=0.0.0.0,port=8100;urp;LibreOffice.ServiceManager" -headless -nodefault -nofirststartwizard -nolockcheck -nologo -norestore
1 голос
/ 25 мая 2011

Я успешно использовал Apache FOP для преобразования документа WordML в PDF. WordML - это способ сохранения документа Word в формате XML в Office 2003. Таблицы стилей XSLT можно найти в Интернете, чтобы преобразовать этот xml в xml-fo, который, в свою очередь, может быть преобразован FOP в PDF (среди других выходных данных).

Он не сильно отличается от предложенного программного текста, за исключением того, что он не читает документ .doc, тогда как docx4j, по-видимому, читает. Если ваши требования достаточно гибки, чтобы в качестве входных данных можно было использовать документы в стиле WordML, возможно, стоит обратить на это внимание.

Удачи в вашем проекте! Wim

0 голосов
/ 25 мая 2011

Другой вариант, с которым я недавно столкнулся, - это использование API OpenOffice (или LibreOffice) ( см. Здесь ).Я не смог войти в это, но он должен иметь возможность открывать документы в различных форматах и ​​выводить их в формате PDF.Если вы посмотрите на это, дайте мне знать, как это работает!

...