Сохранение встроенного 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();
}