java - docx4java 的SectionWrapper.getHeaderFooterPolicy——我可以用它来删除页眉和页脚吗

标签 java pdf pdf-generation docx docx4j

重写为看起来更像一个编程问题

好的,所以我做了更多研究,看起来我需要使用的 java 包是 docx4j。不幸的是,我对该包以及 PDF 格式的基础缺乏熟悉,这使得我很难准确地弄清楚如何使用 SectionWrapper.getHeaderFooterPolicy() 返回的页眉和页脚。目前尚不完全清楚返回的 HeaderPartFooterPart 对象是否可写或如何修改它们。

this code它提供了如何创建 header 部分的示例,但它创建了一个新的HeaderPart并将其添加到文档中。

我想找到现有的页眉/页 footer 分,并在可能的情况下删除它们或将其清空。理想情况下,它们会从文档中完全消失。

This code类似,允许您使用 setJaxbElement 设置 header 部分的文本,但这个术语中有很多是不熟悉的,我担心最终结果将是我创建 header (尽管是空的)在每个文档中而不是删除它们。

下面的原始问题

我正在处理一组差异很大的 MS Word 文档。我正在将它们编译成一个 PDF,并希望在这样做之前确保它们都没有页眉或页脚。

理想情况下,如果不是 Times New Roman,我还想覆盖其默认字体。

有什么方法可以通过编程或使用某种批处理来执行此操作吗?

我将在当前未安装 Office 或 Word 的 Windows 服务器上运行此程序(尽管我认为它可能安装了 OpenOffice,当然添加安装也很容易)。

现在我正在使用某些版本的 iText (java) 将文件转换为 PDF。我知道显然 iText 不能做诸如删除页眉/页脚之类的事情,但由于现代 .doc 文件的底层结构是 XML,我想知道是否有一个 API(甚至是一个 XML 解析/编辑 API,或者如果所有其他方法都失败了,一个正则表达式[恐怖])用于删除页眉和页脚并设置一些默认样式。

最佳答案

这里是一些现成的代码,可以完成您想要的操作:

public class HeaderFooterRemove  {

public static void main(String[] args) throws Exception {

    // A docx or a dir containing docx files
    String inputpath = System.getProperty("user.dir") + "/testHF.docx";

    StringBuilder sb = new StringBuilder(); 

    File dir = new File(inputpath);

    if (dir.isDirectory()) {

        String[] files = dir.list();

        for (int i = 0; i<files.length; i++  ) {

            if (files[i].endsWith("docx")) {
                sb.append("\n\n" + files[i] + "\n");
                removeHFFromFile(new java.io.File(inputpath + "/" + files[i]));     
            }
        }

    } else if (inputpath.endsWith("docx")) {
        sb.append("\n\n" + inputpath + "\n");
        removeHFFromFile(new java.io.File(inputpath ));     
    }

    System.out.println(sb.toString());

}

public static void removeHFFromFile(File f) throws Exception {


    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
            .load(f);

    MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();

    // Remove from sectPr
    SectPrFinder finder = new SectPrFinder(mdp);
    new TraversalUtil(mdp.getContent(), finder);
    for (SectPr sectPr : finder.getSectPrList()) {
        sectPr.getEGHdrFtrReferences().clear();
    }

    // Remove rels
    List<Relationship> hfRels = new ArrayList<Relationship>(); 
    for (Relationship rel : mdp.getRelationshipsPart().getRelationships().getRelationship() ) {

        if (rel.getType().equals(Namespaces.HEADER)
                || rel.getType().equals(Namespaces.FOOTER)) {
            hfRels.add(rel);
        }
    }
    for (Relationship rel : hfRels ) {
        mdp.getRelationshipsPart().removeRelationship(rel);
    }

        wordMLPackage.save(f);              
    }
}

以上代码依赖SectPrFinder ,所以将其复制到某处。

为了简洁起见,我省略了导入。但您可以从 GitHub 复制这些内容

当涉及到将一组 docx 制作为单个 PDF 时,显然您可以将它们合并为单个 docx,然后将其转换为 PDF,或者将它们全部转换为 PDF,然后合并这些 PDF。如果您更喜欢前一种方法(例如,因为最终用户希望能够编辑文档包),那么您可能希望考虑我们的 docx4j 商业扩展 MergeDocx。

关于java - docx4java 的SectionWrapper.getHeaderFooterPolicy——我可以用它来删除页眉和页脚吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18024279/

相关文章:

java - 如何在android中解码带有特殊字符(如 "&lt;span style=\&quot;color:#ff0000;\&quot;gt;")的utf-8编码字符串?

java - 使用for语句从数组java中删除元素

java - Apache Groa 找不到主类错误

java - 如何使用CURL POST多格式文件和JSON到Springboot Restful Webservice

java - 无法使用 Selenium 在 Chrome 浏览器的“权限”弹出窗口中单击 “Allow” 或 “Block”?

android - 如何从指向 PDF 文档的 URI 获取文件路径?

java - 如何在Java中提供本地PDF文件的下载?

java - PDF 中的可滚动图像

java - 使用 java、xml 等设计 PDF 模板并在运行时填充数据

visual-studio-code - 如何导出为带有语法高亮的pdf?