Есть ли какая-нибудь библиотека java (может быть, poi?) которая позволяет объединять файлы docx?[закрыто]

StackOverflow https://stackoverflow.com/questions/2494549

  •  21-09-2019
  •  | 
  •  

Вопрос

Мне нужно написать java-приложение, которое может объединять файлы docx.Есть какие-нибудь предложения?

Это было полезно?

Решение

Для обработки документов OpenXML MS Word с помощью Java доступны следующие Java API:

Был еще один, но я больше не помню его названия.

Что касается ваших функциональных требований:объединение двух документов технически сложно для достижения результата, которого ожидал бы конечный пользователь.Большинство API этого не допускают.Вам нужно будет извлечь нужную информацию из двух документов, а затем самостоятельно создать один новый документ на основе этой информации.

Другие советы

С POI мое решение таково:

public static void merge(InputStream src1, InputStream src2, OutputStream dest) throws Exception {
    OPCPackage src1Package = OPCPackage.open(src1);
    OPCPackage src2Package = OPCPackage.open(src2);
    XWPFDocument src1Document = new XWPFDocument(src1Package);        
    CTBody src1Body = src1Document.getDocument().getBody();
    XWPFDocument src2Document = new XWPFDocument(src2Package);
    CTBody src2Body = src2Document.getDocument().getBody();        
    appendBody(src1Body, src2Body);
    src1Document.write(dest);
}

private static void appendBody(CTBody src, CTBody append) throws Exception {
    XmlOptions optionsOuter = new XmlOptions();
    optionsOuter.setSaveOuter();
    String appendString = append.xmlText(optionsOuter);
    String srcString = src.xmlText();
    String prefix = srcString.substring(0,srcString.indexOf(">")+1);
    String mainPart = srcString.substring(srcString.indexOf(">")+1,srcString.lastIndexOf("<"));
    String sufix = srcString.substring( srcString.lastIndexOf("<") );
    String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<"));
    CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+sufix);
    src.set(makeBody);
}

С Docx4j мое решение таково:

public class MergeDocx {
    private static long chunk = 0;
    private static final String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";

    public void mergeDocx(InputStream s1, InputStream s2, OutputStream os) throws Exception {
        WordprocessingMLPackage target = WordprocessingMLPackage.load(s1);
        insertDocx(target.getMainDocumentPart(), IOUtils.toByteArray(s2));
        SaveToZipFile saver = new SaveToZipFile(target);
        saver.save(os);
    }

    private static void insertDocx(MainDocumentPart main, byte[] bytes) throws Exception {
            AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart(new PartName("/part" + (chunk++) + ".docx"));
            afiPart.setContentType(new ContentType(CONTENT_TYPE));
            afiPart.setBinaryData(bytes);
            Relationship altChunkRel = main.addTargetPart(afiPart);

            CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk();
            chunk.setId(altChunkRel.getId());

            main.addObject(chunk);
    }
}

Это действительно выглядит так, как будто POI может работать с docx Файлы.Вы пытаетесь выяснить, как их объединить?

Как извлечь обычный текст из файла DOCX, используя новую поддержку OOXML в Apache POI 3.5?

Aspose API на данный момент является лучшим для объединения файлов word doc или docx, но это не бесплатно или с открытым исходным кодом, если вам нужны бесплатные инструменты с открытым исходным кодом, есть пара API, из которых вы можете выбрать, вы можете найти обзор по ним здесь,

http://www.esupu.com/open-source-office-document-java-api-review/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top