【问题标题】:& to & in base64 + Javascript& to & in base64 + Javascript
【发布时间】:2018-05-26 03:50:01
【问题描述】:

我的项目中有一个新问题。我想通过 pdfmake 创建一个 pdf 文件。我关注this tutorial,一切正常,除了“&”符号的“转换”。在我的“var docDefinition”中,我从 mysql 数据库中获取内容。有一些企业名称带有'&'-符号。如果我在 php 中调用企业名称,则会正确显示“&”符号。但是在 javascript 中并通过转换为 base64,生成的 pdf 中只显示“&”。 'ö'、'ä' 等其他符号显示正确。 有什么想法吗?

### 更新

这是我的代码“generatePDF.blade.php”的 sn-p:

@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 }}',
          ...
        ],
      };

然后是教程中的内容: //将pdf保存为base64字符串 var pdfstr; 尝试 { pdfMake.createPdf(docDefinition).getDataUrl(function (result) { 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 框架有关。很抱歉没有告诉你,我只是忘记了。 因此,当我在刀片视图(均为 UTF-8)中从 mySQL 获取数据时,一切都很好。但是如果我不是在纯刀片中而是在javascript中做同样的事情,我的错误就会发生。所以我通过 dd($myvar->value); 进行了检查所以我可以看到,'$'-符号没有被转换,而是“与号($amp;)”。我该如何解决刀片问题?

【问题讨论】:

  • 你可以试试下面的链接,stackoverflow.com/questions/3700326/…
  • 谢谢@Andreas,我为我的问题添加了coden-p。
  • 谢谢@RahulLekurwale,我已经看过那个帖子了。没帮到我=(

标签: javascript php mysql laravel-5 base64


【解决方案1】:

好的,现在我找到了问题的答案: DB中的一些表是utf8_general_ci,但在laravel /app/config/database.php中有'collation' =&gt; 'utf8mb4_unicode_ci'。所以解决方案是将表更改为该排序规则,然后通过{!! $myvar-&gt;field !!} 和woooosh 从刀片中的DB 调用值,一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-03-26
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2022-12-31
    • 2021-09-05
    • 2022-11-20
    相关资源
    最近更新 更多