docx4java的SectionWrapper.getHeaderFooterPolicy - 我可以用它来删除标题&页脚

时间:2013-08-02 19:00:09

标签: java pdf pdf-generation docx docx4j

重写为更像编程问题

好的,所以我做了一些研究,看起来我需要使用的java包是docx4j。不幸的是,我对软件包的熟悉程度以及PDF格式的基础使我很难弄清楚如何使用返回的页眉和页脚SectionWrapper.getHeaderFooterPolicy()。返回的HeaderPartFooterPart对象是可写的还是如何修改它们并不完全清楚。

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

我想找到现有的页眉/页脚部分,如果可能的话,删除它们或将它们清空。理想情况下,它们将完全脱离文档。

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

下面的原始问题

我正在处理一组各种各样的MS Word文档。我正在将它们编译成单个PDF,并希望在执行此操作之前确保它们都没有页眉或页脚。

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

有没有办法以编程方式或使用某种批处理方式执行此操作?

我将在目前没有安装Office或Word的Windows服务器上运行它(虽然我认为它可能安装了OpenOffice,当然也很容易添加安装)。

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

2 个答案:

答案 0 :(得分:2)

以下是一些热门新闻代码,可以做你想做的事情:

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的商业扩展。

答案 1 :(得分:1)

要删除页眉/页脚,有一个非常简单的解决方案:

以zip格式打开docx,并删除名为 header * .xml / footer * .xml 的文件(位于 word 文件夹中)。

解压缩docx的结构:https://stackoverflow.com/tags/docx/info

要真正删除链接(如果你不这样做,它可能会被破坏):

您需要编辑 document.xml.rels 文件,并删除包含页脚/标题的所有RelationsShip。这是您应该删除的关系:

<Relationship Id="rId13" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" Target="footer2.xml"/>

更常见的是包含type ='footer'或type ='header'

的所有内容