Docx4J (Android): как прочитать содержимое верхнего и нижнего колонтитула в документе Word - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь использовать Docx4J (https://github.com/plutext/Docx4j4Android4) для чтения содержимого файла Word. Однако, используя следующий код, моя программа читает только содержимое тела файла Word (хранится в documentLines) (не читает в верхнем или нижнем колонтитуле). Как я могу заставить мою программу читать содержимое верхнего и нижнего колонтитула файла?

Ниже мой код:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == READ_IN_FILE) { // When a result has been received, check if it is the result for READ_IN_FILE
        if (resultCode == Activity.RESULT_OK) { // heck if the operation to retrieve the Activity's result is successful
            // Attempt to retrieve the file
            try {
                var uri = data?.data // Retrieve the file's resource locator
                var document = WordprocessingMLPackage.load(uri?.let { contentResolver.openInputStream(it) })
                var documentLines = document.mainDocumentPart.content
            } catch (e: Exception) { // If the app failed to attempt to retrieve the error file, throw an error alert
                Toast.makeText(this, "Sorry, but there was an error reading in the file", Toast.LENGTH_SHORT).show()
            }
        }
    }

1 Ответ

4 голосов
/ 22 марта 2020

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

Вот пример Java, который отображает количество объектов, найденных в теле, и заголовки / нижние колонтитулы:

import java.io.File;
import java.util.List;
import org.docx4j.model.structure.HeaderFooterPolicy;
import org.docx4j.model.structure.SectionWrapper;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.FooterPart;
import org.docx4j.openpackaging.parts.WordprocessingML.HeaderPart;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;

public class Test
{
    public static void main(String[] args) throws Docx4JException
    {
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File("File.docx"));

        System.out.println("Body");
        processMain(wordMLPackage.getMainDocumentPart());

        List<SectionWrapper> sectionWrappers = wordMLPackage.getDocumentModel().getSections();
        for(SectionWrapper sw : sectionWrappers)
        {
            System.out.println("\nSection");
            HeaderFooterPolicy hfp = sw.getHeaderFooterPolicy();
            processHeader(hfp.getFirstHeader());
            processHeader(hfp.getDefaultHeader());
            processHeader(hfp.getEvenHeader());
            processFooter(hfp.getFirstFooter());
            processFooter(hfp.getDefaultFooter());
            processFooter(hfp.getEvenFooter());
        }
    }

    static void processMain(MainDocumentPart part)
    {
        List<Object> content = part.getContent();
        System.out.println(content.size()+" objects");
    }

    static void processHeader(HeaderPart part)
    {
        if(part!=null)
        {
            List<Object> content = part.getContent();
            System.out.println(content.size()+" header object(s)");
        }
    }

    static void processFooter(FooterPart part)
    {
        if(part!=null)
        {
            List<Object> content = part.getContent();
            System.out.println(content.size()+" footer object(s)");
        }
    }
}
...