You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用TinyMCE getContent() API获取完整内容并实现PDF全预览

问题描述

我有一个使用TinyMCE的表单,希望通过getContent() API方法获取编辑器内容并在PDF页面预览,已编写如下TinyMCE初始化及预览触发代码:

TinyMCE初始化代码

<script nonce="{{ csp_nonce() }}">
    var options = {
        selector: "#body_sp3d",
        menubar: 'file edit view insert format tools table help',
        plugins: [
            "advlist autolink autosave lists link image charmap print preview hr anchor pagebreak",
            "searchreplace wordcount visualblocks visualchars code fullscreen",
            "insertdatetime nonbreaking save table directionality",
            "template paste textpattern"
        ],
        toolbar: "fullscreen restoredraft insertfile undo redo toc | styleselect fontselect fontsizeselect | bold italic | alignleft aligncenter alignright alignjustify codesample | bullist numlist outdent indent toc",
    };
    tinymce.init(options);
</script>

预览触发代码

<script>
    $(document).ready(function() {
        $('#previewSp3d').on('click', function() {
            //get content from tinyMCE editor and set to #content_sp3d
            var body_sp3d        = tinymce.get('body_sp3d').getContent();
            var no_sp3d          = $('#no_sp3d').val();
            var penerima_sp3d    = $('#penerima_sp3d').val();
            var klasifikasi_sp3d = $('#klasifikasi_sp3d').val();
            var url              = "{{ route('preview.sp3d')}}";
            var full_url         = url + '?no_sp3d=' + no_sp3d + '&penerima_sp3d=' + penerima_sp3d + '&body_sp3d=' + body_sp3d + '&klasifikasi_sp3d=' + klasifikasi_sp3d;

            $('#previewSp3d').attr('href', full_url);
        });
    });
</script>

但目前仅能预览部分内容,无法在PDF页面显示所有表单内容,请问如何实现完整内容的PDF预览?


解决方案

1. 改用POST请求传递富文本内容

当前用GET方式把TinyMCE的HTML内容拼在URL里,而URL存在长度限制(不同环境下一般在2KB-8KB之间),内容较长时会被截断,直接导致PDF只显示部分内容。建议改成POST请求传递数据:

$('#previewSp3d').on('click', function(e) {
    e.preventDefault(); // 阻止默认跳转行为
    // 创建临时表单
    var form = $('<form>', {
        'method': 'POST',
        'action': "{{ route('preview.sp3d')}}"
    });
    // 添加Laravel必需的CSRF令牌
    form.append($('<input>', {
        'type': 'hidden',
        'name': '_token',
        'value': "{{ csrf_token() }}"
    }));
    // 逐一添加表单字段
    form.append($('<input>', {
        'type': 'hidden',
        'name': 'no_sp3d',
        'value': $('#no_sp3d').val()
    }));
    form.append($('<input>', {
        'type': 'hidden',
        'name': 'penerima_sp3d',
        'value': $('#penerima_sp3d').val()
    }));
    form.append($('<input>', {
        'type': 'hidden',
        'name': 'body_sp3d',
        'value': tinymce.get('body_sp3d').getContent()
    }));
    form.append($('<input>', {
        'type': 'hidden',
        'name': 'klasifikasi_sp3d',
        'value': $('#klasifikasi_sp3d').val()
    }));
    // 设置在新窗口打开预览
    form.attr('target', '_blank');
    $('body').append(form);
    form.submit();
    form.remove();
});

同时要确保后端的preview.sp3d路由已配置为支持POST请求,并且能正确接收POST参数。

2. 检查PDF渲染工具的兼容性

如果后端使用的PDF生成工具(如dompdf、wkhtmltopdf等)对HTML/CSS支持有限,也会导致部分内容无法渲染:

  • 查看TinyMCE输出的HTML是否包含PDF工具不支持的标签或复杂CSS样式,比如某些HTML5标签、嵌套过深的结构
  • 对TinyMCE的输出做预处理,将复杂样式转为内联样式,移除PDF工具不兼容的标签
  • 确保PDF生成时加载了必要的字体,避免特殊字符或自定义字体无法显示

3. 验证TinyMCE内容获取的完整性

先确认getContent()确实拿到了完整内容:在触发预览前,把内容打印到控制台检查:

console.log(tinymce.get('body_sp3d').getContent());

如果控制台输出不完整,检查TinyMCE配置里的valid_elements或invalid_elements规则,是否限制了某些标签的输出,调整配置确保所有内容都能被正确获取。

4. 处理URL编码问题(仅作为临时方案)

如果一定要用GET请求(不推荐),必须对所有参数做URL编码,避免特殊字符(如&、<、>)导致内容损坏:

var full_url = url + '?no_sp3d=' + encodeURIComponent(no_sp3d) + 
               '&penerima_sp3d=' + encodeURIComponent(penerima_sp3d) + 
               '&body_sp3d=' + encodeURIComponent(body_sp3d) + 
               '&klasifikasi_sp3d=' + encodeURIComponent(klasifikasi_sp3d);

但这种方式依然无法解决URL长度限制的问题,优先使用POST请求。


内容的提问来源于stack exchange,提问作者Hilmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:14:53