2017-12-12 3 views
0

내 프로젝트에 새로운 문제가 있습니다. pdfmake를 통해 pdf 파일을 만들고 싶습니다. 나는 this tutorial을 따르고 있었고 모든 것이 올바르게 작동했지만 '&'기호의 '변형'은 예외였습니다. 내 'var docDefinition'에서 나는 mysql 데이터베이스로부터 내용을 얻고있다. 일부 기업 이름은 '&'- 기호로되어 있습니다. php 내에서 엔터프라이즈 이름을 호출하면 '&'- 로그인이 올바르게 표시됩니다. 하지만 javascript 내에서 base64로 변환하면 생성 된 pdf에 '앰퍼샌드'만 표시됩니다. 'ö', 'ä'등과 같은 다른 기호가 올바르게 표시됩니다. 아이디어가 있으십니까?& ~ & base64 + Javascript

@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 파일을 저장

다음

업데이트 ### 내 코드 'generatePDF.blade.php'의 미리보기입니다 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)를 통해 확인하고 볼 수 있도록, 그 '$'- 기호 나는 s는 변환되지 않고 "ampersand ($ amp;)"로 변환됩니다. 블레이드 문제를 어떻게 해결할 수 있습니까?

+0

는 다음 링크를 시도 할 수 https://stackoverflow.com/questions/3700326/decode-amp-back-to-in-javascript –

+0

감사 @Andreas, 나는 내 문제에 대한 codesnippet을 추가했습니다. –

+0

고마워요 @RahulLekurwale, 그 게시물을 이미 보았습니다. 도와주지 않았습니까 = ( –

답변

0

자, 이제 나는 내 문제에 대한 해답을 발견 : DB에 일부 테이블은 utf8_general_ci의 정렬에 있었지만, laravel에서은, /app/config/database.php 'collation' => 'utf8mb4_unicode_ci'있다. 그래서 해결책은 테이블을 해당 데이터 정렬로 변경 한 다음 {!! $myvar->field !!} 및 woooosh를 통해 블레이드의 DB에서 값을 호출하는 것입니다. 모든 것이 올바르게 작동합니다!

관련 문제