使用nokogiri和rubyzip编辑docx



这里,我使用一个rubyzip和nokogiri来修改一个.docx文件。

RubyZip -> Unzip .docx file
Nokogiri -> Parse and change in content of the body of word/document.xml

正如我在下面写的示例代码,但代码修改了文件,但其他文件受到了干扰。换言之,更新后的文件没有打开,显示文字处理器崩溃的错误。如何解决此问题?

require 'zip/zipfilesystem'
require 'nokogiri'
zip = Zip::ZipFile.open("SecurityForms.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 = "FinalStatement"
zip.get_output_stream("word/document.xml") {|f| f << xml.to_s}
zip.close

根据Github的官方文档,您应该使用Use write_buffer instead open。链接中还有一个代码示例。

以下是编辑.docx模板文件内容的代码。它首先创建一个新的模板副本。docx记住,你会创建这个模板文件,并将这个文件保存在你创建ruby类的同一文件夹中,就像你创建My_class.rb一样,并在其中复制以下代码。它非常适合我的情况。请记住,您需要在gemset中安装rubyzip和nokogiri gem。(谷歌安装)。谢谢

require 'rubygems'
require 'zip/zipfilesystem'
require 'nokogiri'
class Edit_docx
def initialize
coupling =  [('a'..'z'),('A'..'Z')].map{|i| i.to_a}.flatten
secure_string  =  (0...50).map{ coupling[rand(coupling.length)] }.join
FileUtils.cp 'template.docx', "#{secure_string}.docx"
zip = Zip::ZipFile.open("#{secure_string}.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"})
#puts wt
wt.each_with_index do |tag,i|
tag.content = i.to_s + ""
end
zip.get_output_stream("word/document.xml") {|f| f << xml.to_s}
zip.close
puts secure_string
#FileUtils.rm("#{secure_string}.docx")
end
N.new
end

相关内容

  • 没有找到相关文章

最新更新