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

Adobe Embed API保存失效求助:嵌入PDF修改后无法保存

问题:Adobe Embed API嵌入PDF后保存操作无效

我使用Adobe Embed API在网页中嵌入PDF,支持添加批注、标记等操作,所有文件存储在DigitalOcean Spaces。目前遇到的问题是:修改PDF后点击「保存」按钮,实际并未完成保存。

解决方向

  • 完善Save API回调的实际保存逻辑:当前的Save回调仅直接返回成功状态,但没有执行将修改后的PDF上传至DigitalOcean Spaces的核心操作。回调函数的content参数包含了修改后的PDF二进制数据,需要在Promise内部完成上传流程,成功后再调用resolve,失败则调用reject。
  • 确认DigitalOcean Spaces的权限与上传路径:确保你的服务具备向Spaces写入文件的权限,可通过后端接口中转上传(更安全),或配置Spaces的CORS规则与签名机制支持前端直接上传。
  • 验证Save回调是否触发:在Save回调函数内添加console.log(metadata, content),查看浏览器控制台是否有输出,确认点击保存时回调是否被正确调用。
  • 调整回调注册与previewFile的顺序:建议先完成所有回调的注册,再调用adobeDCView.previewFile(),确保SDK初始化时已绑定好回调逻辑。
  • 检查只读权限配置:确认metaData中的hasReadOnlyAccess值为false,如果read_only变量在编辑场景下被设为true,会直接禁止保存操作。

相关代码

JS代码(adobe-embed.js)

document.addEventListener("adobe_dc_view_sdk.ready", function() {
    var adobeDCView = new AdobeDC.View({
         clientId: adobe_key,
         divId: "adobe-dc-view"
    });

    // 先注册回调,再预览文件
    adobeDCView.registerCallback(
        AdobeDC.View.Enum.CallbackType.SAVE_API,
        function(metadata, content, options) {
            return new Promise((resolve, reject) => {
                // 示例:通过后端接口中转上传至DigitalOcean Spaces
                fetch('/api/upload-modified-pdf', {
                    method: 'POST',
                    body: content,
                    headers: {
                        'Content-Type': 'application/pdf',
                        'X-File-Name': metadata.fileName
                    }
                })
                .then(response => {
                    if (response.ok) {
                        resolve({
                            code: AdobeDC.View.Enum.ApiResponseCode.SUCCESS,
                            data: {
                                metaData: metadata
                            }
                        });
                    } else {
                        reject({
                            code: AdobeDC.View.Enum.ApiResponseCode.FAIL,
                            data: { message: '保存失败,请重试' }
                        });
                    }
                })
                .catch(error => {
                    reject({
                        code: AdobeDC.View.Enum.ApiResponseCode.FAIL,
                        data: { message: error.message }
                    });
                });
            });
        }, saveOptions
    );

    adobeDCView.registerCallback(
        AdobeDC.View.Enum.CallbackType.GET_USER_PROFILE_API,
        function() {
            return new Promise((resolve, reject) => {
                resolve({
                    code: AdobeDC.View.Enum.ApiResponseCode.SUCCESS,
                    data: profile
                });
            });
        },
    );

    adobeDCView.previewFile({
        content: {
            location: {
                url: document_url
            }
        },
        metaData: {
            fileName: file_name,
            hasReadOnlyAccess: read_only
        }
    });
});  

HTML渲染代码

<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta id="viewport" name="viewport" content="width=device-width, initial-scale=1"/>

    <link rel="shortcut icon" href="{% static 'assets/images/favicon.png' %}" />
</head>

<body style="margin: 0px">
 <div id="adobe-dc-view"></div>
 <script src="https://documentcloud.adobe.com/view-sdk/viewer.js"></script>
 <script type="text/javascript">
     var document_url = '{{ url }}';
     var file_name = '{{ filename }}';
     var read_only = {{ read_only }};
     var adobe_key = '{{ adobe_embed_key }}';

     const profile = {
         userProfile: {
             name: '{{ user.name }}',
             firstName: '{{ user.fname }}',
             lastName: '{{ user.lname }}',
             email: '{{ user.email }}'
         }
     };

     const saveOptions = {
         autoSaveFrequency: 0,
         enableFocusPolling: false,
         showSaveButton: true
     };
    </script>
    <script type="text/javascript" src="{% static 'assets/js/htw/adobe-embed.js' %}"></script>
</body>
</html>   

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:24:47