Сохранение встроенного PDF-файла Adobe на сервер с повреждением файла

Я использую Adobe Document Services PDF Embed API для отображения файлов PDF на моем веб-сайте, и я разрешаю пользователям добавлять заметки в PDF, а затем сохранять их

Моя проблема в том, что мне нужно сохранить файл обратно на сервер. Но я не могу найти буфер PDF. Мне нужно отправить буфер pdf или обновленный pdf на мой Asp.net Conbtroller

  adobeDCView.previewFile({
            /* Pass information on how to access the file */
            content: {
                /* Location of file where it is hosted */
                location: {
                    url: myurl,
                },
            },
            /* Pass meta data of file */
            metaData: {
                /* file name */
                fileName: "-VER - 0.pdf"
            }
        }, viewerConfig);
    
        /* Define Save API Handler */
        var saveApiHandler = function (metaData, content, options) {
            console.log(metaData, content, options);
            return new Promise(function (resolve, reject) {
                /* Dummy implementation of Save API, replace with your business logic */
/
                var formData = new FormData();
                formData.append('metaData', metaData);
                formData.append('content', content); // is this the pdf buffer ??? 
                formData.append('options', options);
                setTimeout(function () {
 //Want to do ajax call to controller here

                        var response = {
                            code: AdobeDC.View.Enum.ApiResponseCode.SUCCESS,
                            data: {
                                metaData: Object.assign(metaData, { updatedAt: new Date().getTime() })
                            },
                        };
                        resolve(response);
                    }, 2000);
               
                
               
            });
        };

И в моем контроллере у меня

[HttpPost ]
    public ActionResult GetData(object Metadata, Object content,object option)
    {
      
        BinaryFormatter bf = new BinaryFormatter();
        using (MemoryStream ms = new MemoryStream())            {
            bf.Serialize(ms, content);           
           System.IO. File.WriteAllBytes(@"C:\1.pdf", ms.ToArray());
        }
        return View();
    }

1 ответ

Решение

Как предложил @joelgeraci. Необходимо преобразовать контент в base64 и добавить его для формирования данных и отправки в действие контроллера (кредиты на код, предоставленный @joelgeraci

   var base64PDF = arrayBufferToBase64(content);
            var formData = new FormData();
            formData.append('content', base64PDF);

Функция преобразования буфера массива

function arrayBufferToBase64(buffer) {
        var binary = "";
        var bytes = new Uint8Array(buffer);
        var len = bytes.byteLength;
        for (var i = 0; i < len; i++) {
            binary += String.fromCharCode(bytes[i]);
        }
        return window.btoa(binary);
    }

И в контроллере

 [HttpPost]
        public ActionResult GetData(object Metadata, Object content, object option, IEnumerable<HttpPostedFileBase> productImg, String DocumentID, string filename)
        {           
            byte[] sPDFDecoded = Convert.FromBase64String(((string[])content)[0]);
            string filepath = "C:\1.pdf";
            System.IO.File.WriteAllBytes(filepath, sPDFDecoded);
            return View();
        }
Другие вопросы по тегам