Потеря ориентации страницы путем добавления WordprocessingMLPackage в основной пакет - PullRequest
0 голосов
/ 05 октября 2018

Я создаю отчеты, используя docx4j и docx stamper

(https://github.com/thombergs/docx-stamper)

У меня есть основной документ, который содержит мой TOC и логотип и набор нумерации страницзатем я начинаю заполнять другие макеты docx с помощью docx stamper, а затем добавляю их в конец основной части. Проблема заключается в том, что если я задаю ориентацию страницы в одном макете docx как альбомную после добавления в основную часть, он теряеториентация. Результат содержит обе части и правильную нумерацию страниц. Все стили сохраняются, но первая и третья части, имеющие альбомную ориентацию, отображаются в виде портрета, как в основном документе.

documentPartBase = wordMLPackageBase.getMainDocumentPart();
WordprocessingMLPackage wordMLPackageOne = fillFirstTemplate.fillTempLe();
    for (Object obj : wordMLPackageOne.getMainDocumentPart().getContent()) {
        documentPartBase.addObject(obj);
    }
    documentPartBase.addObject(pageBreak);
  WordprocessingMLPackage wordMLPackageTwo = fillSecTemplate.fillTempLe();
    for (Object obj : wordMLPackageTwo.getMainDocumentPart().getContent()) {
        documentPartBase.addObject(obj);
    }
    documentPartBase.addObject(pageBreak);
 WordprocessingMLPackage wordMLPackageThree = fillThirdTemplate.fillTempLe();
    for (Object obj : wordMLPackageThree.getMainDocumentPart().getContent()) {
        documentPartBase.addObject(obj);
    }
    documentPartBase.addObject(pageBreak);
    wordMLPackageBase.save(new File(Paths.get(".").getFileSystem().getPath("D:").toString(), resultFileName))

Я попытался добавитьпакет с альбомной ориентацией перед добавлением детали в основную, но это не помогло:

WordprocessingMLPackage aPackage;
    try {
        aPackage = createPackage(PageSizePaper.A4, true);
    } catch (InvalidFormatException e) {
        throw new RuntimeException("Unhandled exception occurred.", e);
    }
    for (Object obj :aPackage.getMainDocumentPart().getContent()){
        documentPartBase.addObject(obj);
    }
WordprocessingMLPackage wordMLPackageThree = fillThirdTemplate.fillTempLe();
    for (Object obj : wordMLPackageThree.getMainDocumentPart().getContent()) {
        documentPartBase.addObject(obj);
    }

А также попытался добавить:

try {
        sectPr = (SectPr) XmlUtils.unmarshalString("<w:sectPr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">"
            + "<w:pgSz w:w=\"16839\" w:h=\"11907\" w:orient=\"landscape\"/>"
            + "</w:sectPr>");
    } catch (JAXBException e) {
        throw new RuntimeException("Unhandled exception occurred.", e);
    }
    wordMLPackageThree.getMainDocumentPart().getContent().add(sectPr);

Добавление следующего метода в соответствии с

Измените ориентацию страницы в середине документа

, как показано на приведенном ниже коде, весь документ выглядит как ландшафт!

    makeLandscape(wordMLPackageThree.getMainDocumentPart(), STPageOrientation.LANDSCAPE);
            for (Object obj : wordMLPackageThree.getMainDocumentPart().getContent()) 
{
        //Properties properties = Docx4jProperties.getProperties();
        //properties.setProperty("docx4j.PageOrientationLandscape", "true");
        documentPartBase.addObject(obj);
}
        private void makeLandscape(MainDocumentPart mdp, STPageOrientation stPageOrientation) 
    {
          ObjectFactory objectFactory = new ObjectFactory();
          SectPr sectionLandscape = objectFactory.createSectPr();
          SectPr.PgSz landscape = new SectPr.PgSz();
          landscape.setOrient(stPageOrientation);
          landscape.setH(BigInteger.valueOf(11906));
          landscape.setW(BigInteger.valueOf(16383));
          sectionLandscape.setPgSz(landscape);
          org.docx4j.wml.P p = objectFactory.createP();
          PPr createPPr = objectFactory.createPPr();
          createPPr.setSectPr(sectionLandscape);
          p.setPPr(createPPr);
          mdp.addObject(p);
    }

Я пытался, как сказано в первом комментарии, но весь документ был альбомным, и в конце была добавлена ​​пустая страница с портретом:

makeLandscape(documentPartBase,STPageOrientation.LANDSCAPE);
    WordprocessingMLPackage wordMLPackageThree= fillFunktionenLe.fillFunktionenLe();
    for (Object obj : wordMLPackageThree.getMainDocumentPart().getContent()) {
            documentPartBase.addObject(obj);
        }
    makeLandscape(documentPartBase,STPageOrientation.PORTRAIT);

, что тоже не помогло.

Как я могу сохранить ориентацию страницы, используя docx4j после добавления содержимого вместе?

1 Ответ

0 голосов
/ 12 октября 2018

Я добавил разрыв раздела, как показано в первом файле layout.docx в оглавлении.Затем в макете, который должен отображаться в виде пейзажа, я поместил разрыв раздела перед содержимым в виде портрета, а другую страницу в альбомной ориентации, а затем добавил еще один разрыв раздела в виде портрета.наконец, я объединил заполненные макеты, как объяснено здесь , немного изменив его, чтобы получить список макетов:

//the mainDocIn is an empty docx. All other layout are merged there afther filling
    void mergeDocx(OutputStream out, InputStream mainDocIn, InputStream... chaptersIn) {
    try {
        WordprocessingMLPackage mainDoc = WordprocessingMLPackage.load(mainDocIn);

        for (int i = 0; i < chaptersIn.length; i++) {
            insertDocx(mainDoc.getMainDocumentPart(), 
            IOUtils.toByteArray(chaptersIn[i]), i);
        }
        mainDoc.save(out);
    } catch (IOException | Docx4JException e) {
        logger.error("Error in merging", e);
    }
}

private static void insertDocx(MainDocumentPart main, byte[] bytes, int chunkIndex) {
    try {
        AlternativeFormatInputPart afiPart = new 
        AlternativeFormatInputPart(new PartName("/part" + (chunkIndex) + ".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);
    } catch (InvalidFormatException e) {
        logger.error("Data format wrong!", e);
    }
}
...