java - Docx4J (Android):如何读取 Word 文档中页眉和页脚的内容
问题描述
我正在尝试使用 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()
}
}
}
解决方案
要访问页眉和页脚,您需要检索部分(通过文档模型)。每个部分可以有 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)");
}
}
}
推荐阅读
- sql - 评估顺序 - 合并查询
- python - 如何为 Python 应用程序创建 TS 文件
- reporting-services - SSRS参数错误,本地报表处理时出错
- r - 将数字列从计数转换为比例的整洁方法
- javascript - 音频元素在 js 中为 WebAudio API 播放两次
- dialogflow-es - DialogFlow:所有语言的训练短语数量限制为 10 个
- api - Magento 2.4.2:如何在我的自定义模块中获取实时当前汇率?
- python - 如何在python的列表中显示以下程序的输出?
- android - 如何使用 StreamProvider 返回子集合?[颤振,火力基地]
- azure-pipelines - 如何依赖特定的天蓝色管道矩阵作业而不是全部?