Java版本aspose.words文档合并格式改变

try
{
    License license = new License();
    license.setLicense("C:\\Users\\zzz\\Documents\\Aspose.license.lic");
    Document dstdoc = new Document();
    dstdoc.save("C:\\Users\\lvqingsong\\Desktop\\touchNew.doc");

    List<String> fileNames = new ArrayList<>();
    fileNames.add("C:\\Users\\lvqingsong\\Desktop\\DM-SSW.doc");

    Document output = new Document();
    // Remove all content from the destination document before appending.
    output.removeAllChildren();

    for (String fileName : fileNames)
    {
        Document input = new Document(fileName);
        // Append the source document to the end of the destination document.
        output.appendDocument(input, ImportFormatMode.KEEP_SOURCE_FORMATTING);
    }

    output.save("C:\\Users\\lvqingsong\\Desktop\\DM-SSWOutput.doc");
    System.out.println("OK");
}
catch (Exception e)
{
    // 处理异常
    e.printStackTrace();
}

代码如上,源文档合并到空白文档发生细小变化
src

dst

@asd7927920 您能否在此处附上您的输入、输出和预期输出文档以进行测试? 我们将检查该问题并为您提供更多信息。

使用最新版本的 Aspose.Words,您可以使用 Merger 类来合并文档。

String[] documents = new String[] {"in1.docx","in2.docx","in3.docx"};
Merger.merge("out.docx", documents, SaveFormat.DOCX, MergeFormatMode.KEEP_SOURCE_FORMATTING);

附件1.zip (715.4 KB)

@asd7927920 出现此问题的原因是您从头开始创建目标文档,并且它具有与源文档不同的兼容性选项。 请尝试克隆源文档,而不是从头开始创建它:

Document src = new Document("C:\\Temp\\src.doc");
// Clone source document instead of creating it from scratch.
Document dst = (Document)src.deepClone(false);
dst.appendDocument(src, ImportFormatMode.KEEP_SOURCE_FORMATTING);
dst.save("C:\\Temp\\out.doc");

上述方法能做到完全还原,但是如何能将word中宏病毒过滤,我在直接使用重头创建目标文档的方法,然后追加是可以过滤word中的宏病毒

要实现保留文档的原有格式样式,对文档的内容进行复制粘贴,以确保过滤宏病毒。

@asd7927920 您可以使用以下代码从文档中删除宏:

Document doc = new Document("C:\\Temp\\src.doc");
doc.removeMacros();
doc.save("C:\\Temp\\out_without_macros.doc");

这个方法智能过滤文件本地宏病毒,无法过滤文件中远程宏病毒,使用 C# 比较两个文档 官网上在线合并两个文件,输出文件格式和预期是一致的,但是在本地使用相同代码合并后文件格式还是有所差异,是什么原因,本地使用aspose-words-20.2-java

源文件.zip (1.1 MB)
源文件

@asd7927920 正如我所提到的,出现问题的原因是目标文档和源文档具有不同的兼容性选项。 这会导致输出文档的布局差异。 如果您的目标只是从文档中删除宏,请使用上面建议的方法。

目前的疑惑是为什么官网的在线合并出输出文档符合预期,而本地代码输出的文档不符合预期,在线示例代码和本地是相同的

@asd7927920 看起来应用程序页面上提供的代码已过时,它实际上克隆源文档并将其用作合并目标。

void PrintCompatibilityOptions(CompatibilityOptions options_src, CompatibilityOptions options_dst)
{
    SortedSet<string> optionNames2 = new SortedSet<string>();
    foreach (System.ComponentModel.PropertyDescriptor descriptor in System.ComponentModel.TypeDescriptor.GetProperties(options_dst))
    {
        if (descriptor.PropertyType == Type.GetType("System.Boolean"))
        {
            optionNames2.Add(descriptor.Name);
            descriptor.SetValue(options_dst, false);
        }

    }
    Console.WriteLine($"not  modify --------------------------------------------");
    foreach (string s in optionNames2)
    {
        Console.WriteLine($"\t\t{s}");
    }

    for (int i = 1; i >= 0; i--)
    {
        Console.WriteLine(Convert.ToBoolean(i) ? "\tEnabled options:" : "\tDisabled options:");
        SortedSet<string> optionNames = new SortedSet<string>();
        SortedSet<string> optionNames1 = new SortedSet<string>();

        //SortedSet<int> optionvalues = new SortedSet<int>();
        foreach (System.ComponentModel.PropertyDescriptor descriptor in System.ComponentModel.TypeDescriptor.GetProperties(options_src))
        {
            if (descriptor.PropertyType == Type.GetType("System.Boolean") && i == Convert.ToInt32(descriptor.GetValue(options_src)))
            {
                optionNames.Add(descriptor.Name);
                if(i == 1)
                {
                    descriptor.SetValue(options_dst, true);
                }
                else
                {
                    descriptor.SetValue(options_dst, false);
                }
            }
        }
        Console.WriteLine("\n input Default optimization settings:");
        foreach (string s in optionNames)
        {
            Console.WriteLine($"\t\t{s}");
        }

        foreach (System.ComponentModel.PropertyDescriptor descriptor in System.ComponentModel.TypeDescriptor.GetProperties(options_dst))
        {
            if (descriptor.PropertyType == Type.GetType("System.Boolean") && i == Convert.ToInt32(descriptor.GetValue(options_dst)))
            {
                optionNames1.Add(descriptor.Name);
            }

        }
        Console.WriteLine("\n output Default optimization settings:");
        foreach (string s in optionNames1)
        {
            Console.WriteLine($"\t\t{s}");
        }

    }
}

上述是通过复制兼容性选项。为啥word表格还会不一致
file.zip (76.3 KB)

@asd7927920 区别在于 Document.JustificationMode,在源文档中它设置为 JustificationMode.Compress,而在目标文档中它设置为 JustificationMode.Expand。 这会导致文本换行的差异。

使用上述方法后发现小标题还是存在不一致情况,这个如何处理企业微信截图_16929264255646.png (369.5 KB)

企业微信截图_16929264545040.png (363.3 KB)

@asd7927920 您能否附上一份简化的文档,以便我们重现该问题? 我在您之前附上的文件中没有看到此类列表。

file.zip (55.8 KB)
上述是源文件与目标文件3.3.1章节转换异常

@asd7927920 出现此问题的原因是文档具有不同的默认制表位值。 您可以使用如下代码进行检查:

Document src = new Document(@"C:\Temp\src_0730.doc");
Document dst = new Document(@"C:\Temp\dst_0730.doc");

Console.WriteLine(src.DefaultTabStop);
Console.WriteLine(dst.DefaultTabStop);

如果指定相同的默认制表位值,列表看起来是正确的:

Document src = new Document(@"C:\Temp\src_0730.doc");
Document dst = new Document(@"C:\Temp\dst_0730.doc");

dst.DefaultTabStop = src.DefaultTabStop;

dst.Save(@"C:\Temp\out.doc");

java版本有什么方法能够复制源文档中所有内容并粘贴到新文档吗,使用ImportFormatMode.KEEP_SOURCE_FORMATTING并不能完全一致

或者是否能提供一个最新的文档合并示例代码,与下方链接在线输出结果一致

https://products.aspose.com/words/net/merge/