2017-12-12 12 views
0

私のプロジェクトでは新しい問題があります。私はpdfmake経由でpdfファイルを作成したい。私はthis tutorialをフォローしていましたが、「&」の「変換」を除いてすべて正常に動作します。私の 'var docDefinition'では、mysqlデータベースからコンテンツを取得しています。 「&」という名前のエンタープライズ名がいくつかあります。私がphp内の企業名を呼ぶと、 '&' - サインが正しく表示されます。しかし、javascript内でbase64に変換すると、生成されたpdfには「アンパサンド」だけが表示されます。 'ö'、 'ä'などのその他の記号は正しく表示されます。 アイデア&〜&base64 + Javascript

はここ

を更新し###私のコード 'generatePDF.blade.php' の抜粋です:

@section('scripts') 
<script type="text/javascript"> 
    ... 
    // Create the PDF 
    var docDefinition = { 
     pageSize: 'A4', 
     pageOrientation: 'portrait', 
     ... 
     content: [ 
      { text: 'Ausführende Firma: '}, 
      '{{ $report->user->enterprise->enterprise_name }}', 
      ... 
     ], 
     }; 

そしてチュートリアルからのもの: // base64で文字列 にPDFファイルを保存しますvar pdfstr; 試み{pdfMake.createPdf(docDefinition).getDataUrl(関数(結果){ pdfstr =結果、 はconsole.log( '結果:' + pdfstr);

var pdfAsArray = convertDataURIToBinary(pdfstr); 
    console.log('Array: ' + pdfAsArray); 

    PDFJS.getDocument(pdfAsArray).then(function getPdf(pdf) { 
     console.log('pdf var: ' + pdf.getPage(1)); 
     // 
     // Fetch the first page 
     // 
     pdf.getPage(1).then(function getPdfPage(page) { 
     var scale = 1; 
     var viewport = page.getViewport(scale); 
     // 
     // Prepare canvas using PDF page dimensions 
     // 
     var canvas = $("#pdfviewer").get(0); 
     var context = canvas.getContext('2d'); 

     // Check device pixel ratio and then if the browser is doubleing them 
        console.log('Pixelratio is', window.devicePixelRatio); 
        console.log('The browser is doubleing the pixels:', context.webkitBackingStorePixelRatio); 

        var factor = 1; 

        if (window.devicePixelRatio >= 2 && context.webkitBackingStorePixelRatio < 2 || context.webkitBackingStorePixelRatio == undefined) { 
         factor = 2; 
        } 

     //canvas.height = viewport.height*factor; 
     //canvas.width = viewport.width*factor; 

     canvas.setAttribute('width', viewport.width*factor); 
     canvas.setAttribute('height', viewport.height*factor); 
     // context.scale(factor, factor); 
     context.transform(devicePixelRatio,0,0,devicePixelRatio,0,0); 

     // 
     // Render PDF page into canvas context 
     // 
     var renderContext = { 
      canvasContext: context, 
      viewport: viewport, 
     }; 


     page.render(renderContext); 
     // $('#containerPDFViewer').modal({ backdrop: 'static' }); //disable backdrop so user need to make choice 
     }); 
    }); 
    }); 
    } 
    catch (e) { 
    throw e; 
    } 

    var BASE64_MARKER = ';base64,'; 
    function convertDataURIToBinary(dataURI) { 
    var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length; 
    var base64 = dataURI.substring(base64Index); 
    var raw = window.atob(base64); 
    var rawLength = raw.length; 
    var array = new Uint8Array(new ArrayBuffer(rawLength)); 

    for (var i = 0; i < rawLength; i++) { 
     array[i] = raw.charCodeAt(i); 
     // array[i] = raw.codePointAt(i); 
    } 

    return array; 
    } 
###更新2

私は、私の問題はjavascriptの部分とは関係がありますが、私が作業しているlaravelフレームワークを使っていることに気づいています。 私のデータをmySQLから取得しているときブレードビュー(両方ともUTF-8)でも問題ありませんが、純粋なブレードではなくjavascriptでエラーが発生するので、dd($ myvar-> value)でチェックしましたので、それが '$' - 記号i変換されずに "アンパサンド($ amp;)"に変換されます。そのブレードの問題をどのように解決できますか?

+0

あなたは次のリンクを試すことができます https://stackoverflow.com/questions/3700326/decode-amp-back-to-in-javascript –

+0

私の問題のコードニッペルを追加しました。 –

+0

ありがとう@RahulLekurwale、私はすでにその投稿を見ました。私を助けなかった=( –

答えて

0

さて、今私は私の問題のための答えを見つけました:DB内 いくつかのテーブルは、utf8_general_ciの照合であったが、laravelに/app/config/database.php 'collation' => 'utf8mb4_unicode_ci'あります。だから解決策は、照合順序にテーブルを変更し、{!! $myvar->field !!}とwoooosh経由でブレードのDBから値を呼び出す、すべてが正常に動作します!

関連する問題