2015-08-24 7 views
9

Ich habe eine ReportPdf geerbt von Prawn::Document.
Wenn ich es von Rails-Konsole testen, wird das eingebettete PNG-Bild in PDF korrekt gerendert.Bild nicht gerendert in Garnelen pdf mit AngularJs

ReportPdf.new(param1,param2).render_file('/Users/ZZ/Desktop/test.pdf') 

Wenn es jedoch von der Steuerung angefordert wird:

def generate_pdf 
    pdf = ReportPdf.new(param1, param2) 
    send_data pdf.render, filename: 'report.pdf', type: 'application/pdf' 
end 

das Bild wurde nicht gemacht, andere ohne Probleme gemacht Inhalte.

Ich habe versucht, lokale Bild und Bild von Amazon S3 zu verwenden. Beide funktionieren gut in der Konsole, aber nicht vom Controller.

Die generate_pdf Methode in Controller gibt auch eine richtige PDF. Das PDF wurde korrekt gerendert, wenn ich es direkt anfordere. Ich habe es mit Postman getestet.

Das Bild in PDF wurde jedoch nicht nur gerendert, wenn es über eine Exportschaltfläche in Angular angefordert wird. Die folgenden Ausführungen:

Backend:

class ReportPdf < Prawn::Document 
    def initialize(param1, param2) 
    super() 
    @param1 = param1 
    @date = Time.zone.parse(param2) || Time.zone.now 
    header 
    end 

    def header 
    img = open('https://s3-ap-southeast2.amazonaws.com/bucket/folder/logo.png') 
    # use local image 
    # img = "#{Rails.root}/app/assets/images/logo.png" 
    data = [[{ image: img, image_width: 150, vposition: :center }, 
      "#{@param1.name} - #{@param2.suburb}"]] 
    table(data, cell_style: { borders: {}, 
          valign: :center, align: :right, size: 25, width: 
          270 }) 
    end 
end 

Frontend:

$scope.exportToPdf = function() { 
    var tmpDate = moment(new Date($scope.date)).format('DD-MM-YYYY'); 
    $http({ 
     method: 'GET', 
     url: '/resourceA/' + $stateParams.resourceAId + '/resourceB/daily_pdf?day=' + tmpDate 
    }). 
    success(function(data, status, headers, config) { 
     var anchor = angular.element('<a/>'); 
     anchor.attr({ 
     href: 'data:application/pdf;charset=utf-8,' + encodeURI(data), 
     target: '_blank', 
     download: 'daily_report.pdf' 
     })[0].click(); 
    }). 
    error(function(data, status, headers, config) { 
     // something here. 
    }); 
    }; 

Ich denke, das Problem ist, Codierung, Bild binäre Daten beschädigt wurde während der Codierung. Wo ist der Fehler?

+0

Wo liegt Ihrer Ansicht nach Vorlage? d. h. 'report.pdf.erb' –

+0

Ich verwende eine ähnliche Methode, die hier vorgestellt wurde (http://www.idyllic-software.com/blog/creating-pdf-using-prawn-in-ruby-on-rails/). Ich konvertiere HTML nicht in PDF, es gibt keine Ansichtsvorlage. –

+0

1. Sie übergeben entweder die Rohdaten des Bildes oder den Pfad, je nachdem ob es sich um einen lokalen oder einen Remote-Pfad handelt. auch ... 2. versuche, die Daten oder Klasse des 'img'-Objekts auszudrucken, um den zurückgegebenen Wert von' open (img_url) 'zu überprüfen ... Ich frage mich, ob diese Zeile nicht dort ist, wo etwas seitwärts geht ... – Myst

Antwort

0

Schwer zu sagen, wo der Fehler liegt, wenn wir den Code nicht sehen können, der versucht, das Bild zur PDF hinzuzufügen. Wie greift ReportPdf auf das Bild zu?

Vielleicht gibt es hier einen Hinweis für Ihre Situation. In meinem Code, wenn ein pdf für eine Galerie zu erzeugen, schafft die Galerie mit der PDF und hat jedem seiner Fotos selbst mit einem Aufruf der pdf hinzufügen:

photo = Photo.find(photo_id) 
photo.add_to_pdf(pdf, h_pos, v_pos, h_size, v_size) 

Das Foto Klassenmethode verwendet (Layout calcs entfernt):

def add_to_pdf(pdf, h_pos, v_pos, h_size, v_size) 
    pdf.image self.image.path(:full), 
      :position => pos_sym, 
      :vposition => vpos_sym, 
      :fit => [size,vsize] 
end 

Garnelen für die pDF-Erzeugung, Büroklammer klammer~~POS=HEADCOMP für Bildanlagen (Foto has_attached_file: Bild)

+0

Ich habe den Code für den Zugriff auf das Bild hinzugefügt –