- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,所以我做了更多研究,看起来我需要使用的 java 包是 docx4j。不幸的是,我对该包以及 PDF 格式的基础缺乏熟悉,这使得我很难准确地弄清楚如何使用 SectionWrapper.getHeaderFooterPolicy()
返回的页眉和页脚。目前尚不完全清楚返回的 HeaderPart
和 FooterPart
对象是否可写或如何修改它们。
有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 包是 docx4j。不幸的是,我对该包以及 PDF 格式的基础缺乏熟悉,这使得我很难准确地弄清楚如何使用 Sect
我是一名优秀的程序员,十分优秀!