将两个ODT文档合并在一起时如何保持样式格式

星期三

我正在使用C#的AODL库。到目前为止,我已经能够将第二个文档的文本批量导入到第一个文档中。问题是我无法弄清楚我需要掌握什么以确保样式也移到合并文档中。下面是我用来测试的简单代码。我能找到的最接近答案是合并代码中的两个.odt文件,这在某种程度上回答了我的问题,但仍然没有告诉我我需要在哪里放置样式/从何处获取样式。这至少让我知道,我需要仔细阅读第二个文档中的样式,并确保第一个文档中没有匹配的名称,否则会发生冲突。我不确定该怎么做,文档也很薄。在您提出任何建议之前,我想让您知道,是的,odt是我需要使用的文件类型,而我所追求的并不是像Microsoft对Word进行的任何类型的互操作。如果那里还有另一个库的工作方式与AODL类似,那么我会耳熟能详。

TextDocument mergeTemplateDoc = ReadContentsOfFile(mergeTemplateFileName);
TextDocument vehicleTemplateDoc = ReadContentsOfFile(vehicleTemplateFileName);

foreach (IContent piece in vehicleTemplateDoc.Content)
{
    XmlNode newNode = mergeTemplateDoc.XmlDoc.ImportNode(piece.Node,true);

    Paragraph p = ParagraphBuilder.CreateParagraphWithExistingNode(mergeTemplateDoc, newNode);

    mergeTemplateDoc.Content.Add(p);
}

mergeTemplateDoc.SaveTo("MergComplete.odt");
星期三

这是我最终解决我的问题所要做的。请记住,自从问了这个问题以来,我便开始使用Java,因为该库在该语言下似乎工作得更好。

本质上,下面的方法正在做的是抓住每个文档中生成的自动样式。它遍历第二个文档并找到每个样式节点,并检查name属性。然后,该名称将使用该文档唯一的额外标识符进行标记,因此将它们合并在一起时,就不会在名称上产生冲突。

mergeFontTypesToPrimaryDoc只捕获主要文档中不存在的字体,因为所有字体在文档中都以相同的方式引用,因此无需进行任何编辑。

updateNodeChildrenStyleNames只是一种递归方法,用于确保更新所有线型节点以删除两个文档之间的任何冲突名称。

这个类似的想法也应该在C#中起作用。

private static void mergeStylesToPrimaryDoc(OdfTextDocument primaryDoc, OdfTextDocument secondaryDoc) throws Exception {
    OdfFileDom primaryContentDom = primaryDoc.getContentDom();
    OdfOfficeAutomaticStyles primaryDocAutomaticStyles = primaryDoc.getContentDom().getAutomaticStyles();
    OdfOfficeAutomaticStyles secondaryDocAutomaticStyles = secondaryDoc.getContentDom().getAutomaticStyles();
    //Adopt style nodes from secondary doc
    for(int i =0; i<secondaryDocAutomaticStyles.getLength();i++){
        Node style = secondaryDocAutomaticStyles.item(i).cloneNode(true);
        if(style.hasAttributes()){
            NamedNodeMap attributes = style.getAttributes();
            for(int j=0; j< attributes.getLength();j++){
                Node a = attributes.item(j);
                if(a.getLocalName().equals("name")){
                    a.setNodeValue(a.getNodeValue()+_stringToAddToStyle);
                }
            }
        }
        if(style.hasChildNodes()){
            updateNodeChildrenStyleNames(style, _stringToAddToStyle, "name");
        }


        primaryDocAutomaticStyles.appendChild(primaryContentDom.adoptNode(style));

    }
}

private static void mergeFontTypesToPrimaryDoc(OdfTextDocument primaryDoc, OdfTextDocument secondaryDoc) throws Exception {
    //Insert referenced font types that are not in the primary document you are merging into
    NodeList sdDomNodes = secondaryDoc.getContentDom().getChildNodes().item(0).getChildNodes();
    NodeList pdDomNodes = primaryDoc.getContentDom().getChildNodes().item(0).getChildNodes();
    OdfFileDom primaryContentDom = primaryDoc.getContentDom();
    Node sdFontNode=null;
    Node pdFontNode=null;
    for(int i =0; i<sdDomNodes.getLength();i++){
        if(sdDomNodes.item(i).getNodeName().equals("office:font-face-decls")){
            sdFontNode = sdDomNodes.item(i);
            break;
        }
    }
    for(int i =0; i<pdDomNodes.getLength();i++){
        Node n =pdDomNodes.item(i); 
        if(n.getNodeName().equals("office:font-face-decls")){
            pdFontNode = pdDomNodes.item(i);
            break;
        }
    }
    if(sdFontNode !=null && pdFontNode != null){
        NodeList sdFontNodeChildList = sdFontNode.getChildNodes();
        NodeList pdFontNodeChildList = pdFontNode.getChildNodes();
        List<String> fontNames = new ArrayList<String>();
        //Get list of existing fonts in primary doc
        for(int i=0; i<pdFontNodeChildList.getLength();i++){
            NamedNodeMap attributes = pdFontNodeChildList.item(i).getAttributes(); 
            for(int j=0; j<attributes.getLength();j++){
                if(attributes.item(j).getLocalName().equals("name")){
                    fontNames.add(attributes.item(j).getNodeValue());
                }
            }
        }
        //Check each font in the secondary doc to make sure it gets added if the primary doesn't have it
        for(int i=0; i<sdFontNodeChildList.getLength();i++){
            Node fontNode = sdFontNodeChildList.item(i).cloneNode(true); 
            NamedNodeMap attributes = fontNode.getAttributes();
            String fontName="";
            for(int j=0; j< attributes.getLength();j++){
                if(attributes.item(j).getLocalName().equals("name")){
                    fontName = attributes.item(j).getNodeValue();
                    break;
                }
            }
            if(!fontName.equals("") && !fontNames.contains(fontName)){
                pdFontNode.appendChild(primaryContentDom.adoptNode(fontNode));
            }

        }
    }
}

private static void updateNodeChildrenStyleNames(Node n, String stringToAddToStyle, String nodeLocalName){
    NodeList childNodes = n.getChildNodes();
    for (int i=0; i< childNodes.getLength(); i++){

        Node currentChild = childNodes.item(i);

        if(currentChild.hasAttributes()){
            NamedNodeMap attributes = currentChild.getAttributes();
            for(int j =0; j < attributes.getLength(); j++){
                Node a = attributes.item(j);
                if(a.getLocalName().equals(nodeLocalName)){
                    a.setNodeValue(a.getNodeValue() + stringToAddToStyle);
                }
            }
        }
        if(currentChild.hasChildNodes()){
            updateNodeChildrenStyleNames(currentChild, stringToAddToStyle, nodeLocalName);
        }
    }
} 

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将两个嵌套词典合并在一起?

来自分类Dev

如何将两个盖茨比站点合并在一起

来自分类Dev

如何将两个列表合并在一起?

来自分类Dev

如何基于主键将两个序列合并在一起?

来自分类Dev

在if语句下将两个for循环合并在一起

来自分类Dev

将两个ggplot()boxplots合并在一起

来自分类Dev

使用php将两个csv文件合并在一起

来自分类Dev

VBA代码将两个单元合并在一起

来自分类Dev

将两个查询合并在一起 sortByDesc 和 paginate

来自分类Dev

将两个对象合并在一起

来自分类Dev

将两个 docker run 命令合并在一起

来自分类Dev

如何将没有选择字段的两个选择合并在一起?

来自分类Dev

如何将两个单独的聚合合并在一起以得到相同的结果

来自分类Dev

如何将两个文本文件合并在一起

来自分类Dev

如何使用BASH或Python脚本将两个文件合并在一起?

来自分类Dev

如何将共享一个公共密钥的两个对象的两个值合并在一起并返回它?

来自分类Dev

如何将共享一个公共密钥的两个对象的两个值合并在一起并返回它?

来自分类Dev

如何将Python中两个数据框的两列合并在一起

来自分类Dev

在索引上将两个熊猫数据帧合并在一起时出错

来自分类Dev

将两个数据框合并在一起时对齐数据(Pandas,Python 3)

来自分类Dev

根据R中的列值将两个以上的数据帧合并在一起

来自分类Dev

将两个git-svn存储库与常规git commit合并在一起

来自分类Dev

将两个表合并在一起,其中所有列都不匹配

来自分类Dev

分离两个合并在一起的Git存储库

来自分类Dev

将两个数组合并在一起

来自分类Dev

您如何在Java中读取两个文件并将它们合并在一起?

来自分类Dev

在Django中,| 当我将两个查询集合并在一起时,运算符正在创建重复项

来自分类Dev

如何将词汇重叠但不完全相同的两个同现矩阵合并在一起?

来自分类Dev

MS Access-将两个SELECT语句与一个包含Aggregate函数的语句合并在一起

Related 相关文章

  1. 1

    如何将两个嵌套词典合并在一起?

  2. 2

    如何将两个盖茨比站点合并在一起

  3. 3

    如何将两个列表合并在一起?

  4. 4

    如何基于主键将两个序列合并在一起?

  5. 5

    在if语句下将两个for循环合并在一起

  6. 6

    将两个ggplot()boxplots合并在一起

  7. 7

    使用php将两个csv文件合并在一起

  8. 8

    VBA代码将两个单元合并在一起

  9. 9

    将两个查询合并在一起 sortByDesc 和 paginate

  10. 10

    将两个对象合并在一起

  11. 11

    将两个 docker run 命令合并在一起

  12. 12

    如何将没有选择字段的两个选择合并在一起?

  13. 13

    如何将两个单独的聚合合并在一起以得到相同的结果

  14. 14

    如何将两个文本文件合并在一起

  15. 15

    如何使用BASH或Python脚本将两个文件合并在一起?

  16. 16

    如何将共享一个公共密钥的两个对象的两个值合并在一起并返回它?

  17. 17

    如何将共享一个公共密钥的两个对象的两个值合并在一起并返回它?

  18. 18

    如何将Python中两个数据框的两列合并在一起

  19. 19

    在索引上将两个熊猫数据帧合并在一起时出错

  20. 20

    将两个数据框合并在一起时对齐数据(Pandas,Python 3)

  21. 21

    根据R中的列值将两个以上的数据帧合并在一起

  22. 22

    将两个git-svn存储库与常规git commit合并在一起

  23. 23

    将两个表合并在一起,其中所有列都不匹配

  24. 24

    分离两个合并在一起的Git存储库

  25. 25

    将两个数组合并在一起

  26. 26

    您如何在Java中读取两个文件并将它们合并在一起?

  27. 27

    在Django中,| 当我将两个查询集合并在一起时,运算符正在创建重复项

  28. 28

    如何将词汇重叠但不完全相同的两个同现矩阵合并在一起?

  29. 29

    MS Access-将两个SELECT语句与一个包含Aggregate函数的语句合并在一起

热门标签

归档