我的项目中有一个新问题。我想通过PDFMake创建一个PDF文件。我遵循本教程,一切正常,除了"'&'的"转换"之外)符号。在我的" var docDefinition"中,我从MySQL数据库中获取内容。有一些带有'&'的企业名称。如果我在PHP中调用企业名称,则可以正确显示"&" - 标志。但是在JavaScript中并通过转换为base64,仅在生成的PDF中显示" AmperSand"。正确显示了其他标志,例如"Ö","等。有什么想法吗?
### 更新这是我的代码'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; 尝试 { 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框架有关。很抱歉不告诉你,我只是忘记了。因此,当我从刀片视图中的MySQL获取数据(均为UTF-8)时,一切都很好。但是,如果我在纯叶片中而不是在纯刀片中进行相同的操作,而是在JavaScript中进行,那么我的错误就会发生。因此,我通过DD($ MyVar-> value)检查了;因此,我可以看到," $' - 符号未转换,而是" ampersand($ amp;)"。我该如何解决该刀片问题?
好吧,现在我找到了我的问题的答案:DB中的某些表是在utf8_general_ci
的整理中,但是Laravel/App/config/database.php中有'collation' => 'utf8mb4_unicode_ci'
。因此,解决方案是将表更改为整理,然后通过{!! $myvar->field !!}
和Wooosh调用DB中的值,一切都应尽其所能!