gpt4 book ai didi

ruby-on-rails - 如何使用 nokogiri 和 ruby​​zip 编辑 docx

转载 作者:行者123 更新时间:2023-12-04 05:20:25 25 4
gpt4 key购买 nike

我正在使用 ruby​​zip 和 nokogiri 的组合来编辑 .docx 文件。我正在使用 ruby​​zip 解压缩 .docx 文件,然后使用 nokogiri 解析和更改 word/document.xml 文件的正文,但是每次我最后关闭 ruby​​zip 时它都会损坏文件并且我无法打开它或修复它。我在桌面上解压缩 .docx 文件并检查 word/document.xml 文件,内容已更新为我更改的内容,但所有其他文件都搞砸了。有人可以帮我解决这个问题吗?这是我的代码:

require 'rubygems'  
require 'zip/zip'
require 'nokogiri'
zip = Zip::ZipFile.open("test.docx")
doc = zip.find_entry("word/document.xml")
xml = Nokogiri::XML.parse(doc.get_input_stream)
wt = xml.root.xpath("//w:t", {"w" => "http://schemas.openxmlformats.org/wordprocessingml/2006/main"}).first
wt.content = "New Text"
zip.get_output_stream("word/document.xml") {|f| f << xml.to_s}
zip.close

最佳答案

昨晚我遇到了与 ruby​​zip 相同的损坏问题。我通过将所有内容复制到新的 zip 文件并根据需要替换文件来解决它。

这是我的工作概念证明:

#!/usr/bin/env ruby

require 'rubygems'
require 'zip/zip' # rubyzip gem
require 'nokogiri'

class WordXmlFile
def self.open(path, &block)
self.new(path, &block)
end

def initialize(path, &block)
@replace = {}
if block_given?
@zip = Zip::ZipFile.open(path)
yield(self)
@zip.close
else
@zip = Zip::ZipFile.open(path)
end
end

def merge(rec)
xml = @zip.read("word/document.xml")
doc = Nokogiri::XML(xml) {|x| x.noent}
(doc/"//w:fldSimple").each do |field|
if field.attributes['instr'].value =~ /MERGEFIELD (\S+)/
text_node = (field/".//w:t").first
if text_node
text_node.inner_html = rec[$1].to_s
else
puts "No text node for #{$1}"
end
end
end
@replace["word/document.xml"] = doc.serialize :save_with => 0
end

def save(path)
Zip::ZipFile.open(path, Zip::ZipFile::CREATE) do |out|
@zip.each do |entry|
out.get_output_stream(entry.name) do |o|
if @replace[entry.name]
o.write(@replace[entry.name])
else
o.write(@zip.read(entry.name))
end
end
end
end
@zip.close
end
end

if __FILE__ == $0
file = ARGV[0]
out_file = ARGV[1] || file.sub(/\.docx/, ' Merged.docx')
w = WordXmlFile.open(file)
w.force_settings
w.merge('First_Name' => 'Eric', 'Last_Name' => 'Mason')
w.save(out_file)
end

关于ruby-on-rails - 如何使用 nokogiri 和 ruby​​zip 编辑 docx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3885425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com