Ruby on Rails и rubyzip: модификация PowerPoint повреждена в Windows - PullRequest
0 голосов
/ 30 ноября 2018

Я использую ruby ​​на рельсах, чтобы изменить презентации PowerPoint для существующих XML-файлов шаблона (открыть xml) на основе данных из моей базы данных postgres.

Проблема, с которой я сталкиваюсь, заключается в том, что после того, как файл сгенерирован и загружен с heroku с помощью компьютера с Windows, Microsoft PowerPoint обнаруживает файл как поврежденный и пытается восстановить.После восстановления файла, созданного в PowerPoint, файл открывается правильно.

Если я загружаю файл с компьютера с Linux и отправляю файл на компьютер с Windows, файл открывается правильно без предупреждения или попытки восстановления.Сгенерированное powerpoint также корректно открывается в Open office.

Технически, это шаги, которые я использую для создания файла.

  1. Откройте шаблон из папки активов моего приложения
  2. Извлеките файлы из папки tmp с помощью Rubyzip gem
  3. Откройте и измените отдельные файлы с помощью Nokogiri
  4. Сжать файл в файл .pptx
  5. Загрузить / сохранить файл, используя активное хранилище
  6. Перенаправить пользователя в файл для загрузки

  7. Метод извлечения файлов

    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.и просто разархивировать и разархивировать;Я все еще сталкиваюсь с той же проблемой.

...