Я использую ruby на рельсах, чтобы изменить презентации PowerPoint для существующих XML-файлов шаблона (открыть xml) на основе данных из моей базы данных postgres.
Проблема, с которой я сталкиваюсь, заключается в том, что после того, как файл сгенерирован и загружен с heroku с помощью компьютера с Windows, Microsoft PowerPoint обнаруживает файл как поврежденный и пытается восстановить.После восстановления файла, созданного в PowerPoint, файл открывается правильно.
Если я загружаю файл с компьютера с Linux и отправляю файл на компьютер с Windows, файл открывается правильно без предупреждения или попытки восстановления.Сгенерированное powerpoint также корректно открывается в Open office.
Технически, это шаги, которые я использую для создания файла.
- Откройте шаблон из папки активов моего приложения
- Извлеките файлы из папки tmp с помощью Rubyzip gem
- Откройте и измените отдельные файлы с помощью Nokogiri
- Сжать файл в файл .pptx
- Загрузить / сохранить файл, используя активное хранилище
Перенаправить пользователя в файл для загрузки
Метод извлечения файлов
def self.extract_files (dir_prefix)
Zip::File.open(Rails.root.join('app', "assets", "ppt", 'test_8.pptx')) do |z|
z.each do |f|
##Extract files in a directory
f_path=File.join("tmp/#{dir_prefix}_destination", f.name)
FileUtils.mkdir_p(File.dirname(f_path))
z.extract(f, f_path) unless File.exist?(f_path)
end
end
end
Открытие файлов для манипуляций с использованием:
chartxml = File.open(Rails.root.join('tmp', tmp_extract_folder, 'ppt', 'charts', 'chart5.xml'))
##Manipulation logic here
File.write(Rails.root.join('tmp', tmp_extract_folder, 'ppt', 'charts', 'chart5.xml'), doc.to_xml)
Повторная архивация файлов с использованием:
zf =ZipFileGenerator.new("tmp/#{dir_prefix}_destination", "tmp/#{dir_prefix}_zipped.pptx")
Реализация генератора zip-файлов такая же, как и в Rubyzip github repo
Затем я сохраняю данные, используя активное хранилище, используя:
ppt = Powerpoint.new(name: "#{dir_prefix}")
ppt.file.attach(
io: File.open("tmp/#{dir_prefix}_zipped.pptx"), filename: 'Synthese.pptx', content_type: 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
)
ppt.save
render :js => "window.location = '#{download_ppt_path(dir_prefix: dir_prefix)}'"
Затем пользователь загружает файл:
ppt = Powerpoint.where(name: dir_prefix)
redirect_to rails_blob_path(ppt.first.file, disposition: "attachment")
Я попытался раскомментировать код, который выполняет манипуляции с файлами XML.и просто разархивировать и разархивировать;Я все еще сталкиваюсь с той же проблемой.