& Амп; в & в base64 + Javascript

0

У меня новая проблема в моем проекте. Я хочу создать pdf файл с помощью pdfmake. Я следовал этому руководству, и все работает отлично, за исключением "трансформации" знака "&". В моем "var docDefinition" я получаю контент из базы данных mysql. В нем есть имена предприятий с "&" -sign. Если я называю имя предприятия в php, "&" -sign отображается правильно. Но внутри javascript и через преобразование в base64 в генерируемый pdf файл отображается только "амперсанд". Другие знаки, такие как "ö", "ä" и т.д., Отображаются правильно. Есть идеи?

### Обновить

Вот фрагмент моего кода "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 }}',
          ...
        ],
      };

А затем материал из учебника://сохраняем pdf в base64 строки var pdfstr; try {pdfMake.createPdf(docDefinition).getDataUrl (функция (результат) {pdfstr = result; 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-> значение); и поэтому я вижу, что "$" -sign не преобразован, а "амперсанд ($ amp;)". Как я могу решить эту проблему с лезвием?

Теги:
base64
laravel-5

1 ответ

0

Хорошо, теперь я нашел ответ для своей проблемы: некоторые таблицы в БД были в сортировке utf8_general_ci, но в laravel/app/config/database.php есть 'collation' => 'utf8mb4_unicode_ci'. Таким образом, решение состоит в том, чтобы изменить таблицы на эту сортировку, а затем вызвать значения из БД в лезвии через {!! $myvar->field !!} {!! $myvar->field !!} и woooosh, все работает так, как должно!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню