2016-06-29 4 views
0

Ich entwickle eine Chrome-App und möchte dem Benutzer erlauben, einige HTML-Tabellen als PDF zu exportieren. Ich habe etwas Recherche gemacht und ich habe jsPdf als das Plugin gefunden, das ich brauchte. Und jetzt kommt mein Problem. jsPDF und seine Funktion "fromHTML" verwenden die Methode "document.writeln()", die in Chrome Packaged App nicht verfügbar ist.jspdf in der Chrome-Paket-App: document.writeln() nicht verfügbar

"Uncaught Fehler: document.writeln() ist nicht in gepackten Anwendungen verfügbar."

Console error as jspdf tries to use document.writeln()

Ich habe eine Tonne eine Forschung über das Internet gemacht und festgestellt, dass es einige Möglichkeiten gibt, diese Frage zu begegnen, indem Sie einige „document.create“ und fügte hinzu. Aber obwohl ich nicht weiß, wie jspdf funktioniert, weiß ich nicht wirklich, was ich erstellen soll.

der Teil jspdf Es gibt, die das Problem verursacht:

var $frame, $hiddendiv, framename, visuallyhidden; 

framename = "jsPDFhtmlText" + Date.now().toString() + (Math.random() * 1000).toFixed(0); 

visuallyhidden = "position: absolute !important;" + "clip: rect(1px 1px 1px 1px); /* IE6, IE7 */" + "clip: rect(1px, 1px, 1px, 1px);" + "padding:0 !important;" + "border:0 !important;" + "height: 1px !important;" + "width: 1px !important; " + "top:auto;" + "left:-100px;" + "overflow: hidden;"; 

$hiddendiv = document.createElement('div'); 
$hiddendiv.style.cssText = visuallyhidden; 
$hiddendiv.innerHTML = "<iframe style=\"height:1px;width:1px\" name=\"" + framename + "\" />"; 
document.body.appendChild($hiddendiv); 

$frame = window.frames[framename]; 
$frame.document.open(); 
$frame.document.writeln(element);//This causes "Uncaught Error: document.writeln() is not available in packaged apps." 
$frame.document.close(); 
return $frame.document.body; 

Und hier ist mein Aufruf der jspdf Bibliothek, vielleicht machte ich einen Fehler hier:

$('#exportMonth').click(function(){ 
    console.log(TAG + "Starting rendering as PDF"); 

    var doc = new jsPDF(); 
    specialElementHandlers = { 
     // element with id of "bypass" - jQuery style selector 
     // here i've nothing to bypass, so nothing is 'bypassme' 
     '#bypassme': function(element, renderer) { 
      // true = "handled elsewhere, bypass text extraction" 
      return true 
     } 
    }; 
    //the id 'month' refers to a div containing a html Table 
    doc.fromHTML($('#month').html(),15,15 ,{ 
     width:600, 
     elementHandler:specialElementHandlers 
    }); 
    doc.save('Tst.pdf'); 

    console.log(TAG + "Should be done"); 
}); 

Ich werde weiter meine Forschung, aber ich bin wirklich verloren jetzt, ich brauche wirklich deine Hilfe!

Ich habe vielleicht vergessen, einige Dinge zu sagen, lass es mich wissen, und ich werde versuchen, so schnell wie möglich das zu beheben.

Vielen Dank!

+0

Sie können diesen Link überprüfen: http://stackoverflow.com/questions/16954731/google-closure-and-chrome-packaged-apps-compatibility – abielita

+0

@abielita Danke für die Berücksichtigung meines Problems. Ich habe diesen Beitrag schon ein paar Mal gesehen, und mein Punkt ist, dass ich nicht weiß, was jspdf schreiben möchte, also kann ich es nicht durch document.create ('ich weiß was nicht') ersetzen. – Kwarthys

Antwort

0

Nach vielen Recherchen und ein paar RageQuits fand ich eine Lösung. Ich weiß nicht wirklich, warum es funktioniert, aber es tut es, und ich werde das hier teilen, falls einer von euch auf dieses Problem stoßen sollte. Ich denke, es ist eher ein Trick/Hack als eine echte Lösung.

Ersetzen dieser:

doc.fromHTML($('#month').html(),15,15 ,{ 
    width:600, 
    elementHandler:specialElementHandlers 
}); 
doc.save('Tst.pdf'); 

Durch diese:

doc.fromHTML($('#month')[0],15,15 ,{ //ONLY CHANGE IS HERE 
    width:600, 
    elementHandler:specialElementHandlers 
}); 
doc.save('Tst.pdf'); 

arbeiten. Kein Fehler mehr generiert und PDF wurde erfolgreich in lokale Datei heruntergeladen.

Wenn jemand weiß, warum das funktioniert, werde ich gerne lernen, denn das ist irgendwie störend.

der Hoffnung, dass wird somneone 1 Tag helfen,

Vielen Dank ‚n‘ sehen Sie später!