README.md in alego_pdf-1.0.0 vs README.md in alego_pdf-2.0.0

- old
+ new

@@ -24,51 +24,81 @@ $ gem install alego_pdf ## Uso A gem 'alego_pdf' depende da gem 'hexapdf' para fazer a juntada de arquivos. Veja mais sobre a gem 'hexapdf' no Github: https://github.com/gettalong/hexapdf -A gem 'alego_pdf' faz a leitura dos arquivos via URI e Tempfile e a gem 'hexapdf' junta-os. Veja o exemplo na gem alego_pdf: - +A gem 'alego_pdf' busca os objeto faz a leitura dos arquivos via URI e Tempfile e a gem 'hexapdf' junta-os. Veja o exemplo na gem alego_pdf: ``` - def call - target = HexaPDF::Document.new +require 'hexapdf' +require 'open-uri' - # filepaths é um array com as url's dos arquivos - filepaths.each do |filepath| - uri = URI.parse(filepath).open(&:read) # leitura do arquivo - tempfile = Tempfile.new - tempfile.write(uri.force_encoding('UTF-8')) # escrita no arquivo Tempfile - tempfile.close # fecha o arquivo +module AlegoPdf + class Merging + attr_reader :ids, :model, :attribute, :filename - pdf = HexaPDF::Document.open(tempfile) - pdf.pages.each { |page| target.pages << target.import(page) } # junta os arquivos em um novo HexaPDF + def initialize(ids, model, attribute, filename = 'tmp/merge_files.pdf') + @ids = ids + @model = model + @attribute = attribute + @filename = filename end - target.write(filename, optimize: true) - end -``` + def call + array = model.is_a?(String) ? model.camelize.constantize.where(id: ids) : model.where(id: ids) + target = HexaPDF::Document.new -Após instalar a gem 'alego_pdf', deve buscar a URL dos arquivos e passar estas URL's como parâmetro. Veja o exemplo a seguir: + array.each do |objeto| + file = objeto[attribute] + filepath = file.try(:url) || objeto.try(:arquivo_url) + next if filepath.blank? + + uri = URI.parse(filepath).open(&:read) + tempfile = Tempfile.new + tempfile.write(uri.force_encoding('UTF-8')) + tempfile.close + + pdf = HexaPDF::Document.open(tempfile) + pdf.pages.each { |page| target.pages << target.import(page) } + end + + target.write(filename, optimize: true) + end + end +end ``` +Obs.: Os parâmetros 'ids', 'model' e 'attribute' são obrigatórios. O parâmetro 'filename' é por default 'tmp/merge_files.pdf', porém pode-se atribuir um caminho pré-definido. +Após instalar a gem 'alego_pdf', deve criar uma rota '/rota_merge_arquivos' e deve buscar os ids dos arquivos e passá-los como parâmetro junto com o model e o atributo que onde é guardado os metadados dos arquivos. A gem procura também por um atributo chamado 'arquivo_url', caso não encontre a 'url' (ex.: attribute.try(:url)) Veja o exemplo a seguir: +``` + # organogramas_controller.rb def merge_arquivos - # O atributo "arquivo_url" deve ser a url onde o arquivo está armazenado. - # Exemplo: https://spiderminio-dev.al.go.leg.br:9000/portal-rails/uploads/transparencia/organograma/arquivo/1/Manual_do_stimuus_-_6_Instalando_o_esti%CC%81mulo_no_seu_aplicativo.pdf?X-Amz-Expires=600&X-Amz-Date=20220909T165125Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=BUjuSkJYyf0wzRmG%2F20220909%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=791bbc7db8aac7bd0c61dc7a60d04ec3d39f6d63d60f9d971383c97b55e9815a + organograma_ids = ::Transparencia::Organograma.order('data desc').map(&:id) - filepaths = Model.order('id desc').map(&:arquivo_url) - respond_to do |format| format.html format.pdf do - filename = 'tmp/arquivos.pdf' - AlegoPdf::Merging.new(filepaths, filename).call + filename = 'tmp/organogramas.pdf' # nome e local onde será salvo o arquivo temporário + AlegoPdf::Merging.new(organograma_ids, ::Transparencia::Organograma, :arquivo, filename).call pdf_filename = File.join(Rails.root, filename) - send_file(pdf_filename, filename: 'merge-arquivos.pdf', type: 'application/pdf') + send_file(pdf_filename, filename: 'organogramas.pdf', type: 'application/pdf') end end end ``` +PS: caso não exista nenhum arquivo, é feito download de uma página em branco, portanto certifique-se que contenha ao menos 1 objeto com upload PDF antes fazer a chamada AlegoPdf::Merging ou apresentar o botão na view que chama a rota e faz o download dos arquivos. Veja o exemplo: +``` + // index.html.erb + <% @organograma_pdf_any = ::Transparencia::Organograma.any?(&:arquivo_url) # verifica se existe ao menos 1 url do arquivo %> + <% if @organograma_pdf_any %> + <a href="/organogramas/merge_arquivos.pdf" target="_blank" title="Juntar arquivos" class="bt bt--secundario"> + Todos organogramas + <svg class="ico"> + <use xlink:href="<%= asset_path('ico.svg#download') %>" /> + </svg> + </a> + <% end %> +``` ## Contribuição Relatórios de bugs e pull requests são bem-vindos no GitLab em https://gitlab.al.go.leg.br/sistemas/gem/alego_pdf.