【问题标题】:Merging two .odt files from code从代码中合并两个 .odt 文件
【发布时间】:2014-10-01 18:31:44
【问题描述】:

如何合并两个 .odt 文件?手动打开每个文件并复制内容是可行的,但不可行。

我已尝试使用 odttoolkit Simple API (simple-odf-0.8.1-incubating) 来完成该任务,创建一个空的 TextDocument 并将所有内容合并到其中:

private File masterFile = new File(...);

...

TextDocument t = TextDocument.newTextDocument();
t.save(masterFile);

...

for(File f : filesToMerge){
   joinOdt(f);
}

...

void joinOdt(File joinee){
   TextDocument master = (TextDocument) TextDocument.loadDocument(masterFile);
   TextDocument slave = (TextDocument) TextDocument.loadDocument(joinee);
   master.insertContentFromDocumentAfter(slave, master.getParagraphByReverseIndex(0, false), true);
   master.save(masterFile);
}

而且效果相当好,但是它会丢失有关字体的信息 - 原始文件是 Arial Narrow 和 Windings 的组合(用于复选框),输出 masterFile 都在 TimesNewRoman 中。起初我怀疑 insertContentFromDocumentAfter 的最后一个参数,但将其更改为假中断(几乎)所有格式。难道我做错了什么?有没有其他办法?

【问题讨论】:

  • 我正在尝试实现相同但无法从 maven 获取该版本的库
  • @vbazaga86 是的,该版本在 maven 上不可用。因为在那个版本出来半年之后,他们仍然没有修复他们的构建过程。我将它作为 odftoolkit-0.6.1 的一部分手动下载并从 jar 安装到我的本地 repo 中。
  • 目前我有同样的问题要解决,我发现只有两个好的 java 库可以解决这个问题:Apache ODF Toolkit 和 jOpenDocument。哪个更好?
  • @makkasi 以上是Apache Toolkit的一部分,其他的我不知道。如果您尝试并成功完成此任务,请务必告诉我。

标签: java openoffice.org


【解决方案1】:

我认为这是“按设计工作”。

我曾用一个全局文档尝试过这个,它导入文档并按原样显示它们...只要段落样式具有不同的名称!

使用相同命名的模板会被“主”文档的值覆盖。

所以我最终克隆了具有唯一(每个文档)名称的标准样式。

HTH

【讨论】:

  • 我对 .odt 的内部工作方式不够了解...但这是否意味着,如果我的文件在样式方面以相同的方式创建,则从其中一个开始的空文档将使合并按我希望的那样工作?
  • 创建不基于现有(标准、预定义)的段落样式。
  • 我的工作流程包括将多个 RTF 文件转换为一系列 .odt 文件(使用 Java UNO API),然后合并它们,所以我认为这不是一个可行的解决方案。
  • 所以,当您从 RTF 转换时 - 您必须尊重不同的样式(字体、大小...):执行此步骤时,不要更改预定义的样式,而是创建新的样式,而不是基于现有样式。使用新的“独立”样式将保留您在新创建的文档(或全局文档)中导入 (Insert>File... / insertContentFromDocument) 时设置的属性。合并文档:“新文档”的定义样式将在导入时覆盖、更改自定义(如观察到的那样)
  • 比我更喜欢一个关于如何以这种方式从 RTF 转换的教程的链接(我的方法包括简单地使用内置转换器,例如 stackoverflow.com/questions/17200115/… 与“writerglobal8”作为名称筛选)。此外,虽然有用并显示了我采用的方法存在的问题,但恐怕您的回答并不能回答如何正确地做到这一点的问题
【解决方案2】:

Ma 案例是一个相当简单的案例,我想合并的文件以相同的方式生成并使用相同的基本格式。因此,从我的一个文件而不是一个空文档开始解决了我的问题。

但是,这个问题将一直悬而未决,直到有人提出更通用的格式保留解决方案(可能基于 ngulams 答案和 cmets?)。

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多