Сохраните новый PDF-файл на сервер с помощью Adobe Pdf Embed API
Я получил этот код здесь https://codepen.io/practicalPDF/pen/eYBOpEm По сути, после аннотирования или комментирования PDF-файла он помогает вам загрузить новый PDF-файл. Я попытался изменить его так, чтобы при сохранении закомментированного PDF-файла он отправлялся на мой сервер, а не загружался на мой компьютер. Не работает
<script type="text/javascript">
var path = "<?php echo $last_file ?>"
var urlToPDF =
"https://docsdemedard.com/"+path;
const clientId = "dbd96f4342ab4e92b822ac5fd166d737";
const viewerOptions = {
embedMode: "FULL_WINDOW",
showDownloadPDF: false,
showPrintPDF: false,
showAnnotationTools: true
};
const saveOptions = {
autoSaveFrequency: 0,
enableFocusPolling: false,
showSaveButton: true
}
function fetchPDF(urlToPDF) {
return new Promise((resolve) => {
fetch(urlToPDF)
.then((resolve) => resolve.blob())
.then((blob) => {
resolve(blob.arrayBuffer());
})
})
}
function hideLink() {
document.getElementById("getFile").style.display = "none";
}
function updateSaveUI(zipFileName) {
document.getElementById("getFileText").innerHTML = "You can retrieve your saved file from: <a onclick='hideLink(); return true;'' href='https://practicalpdf.com/code-pens/reflect/uploads/" + zipFileName + "'>here.</a>";
document.getElementById("getFile").style.display = "flex";
}
document.addEventListener("adobe_dc_view_sdk.ready", function () {
// Create embedded view
var adobeDCView = new AdobeDC.View({
clientId: clientId,
locale: "fr-FR",
divId: "adobe-dc-view"
});
adobeDCView.registerCallback(
AdobeDC.View.Enum.CallbackType.SAVE_API,
function (metaData, content, options) {
var uint8Array = new Uint8Array(content);
var blob = new Blob([uint8Array], { type: 'application/pdf' });
formData = new FormData();
var pdfFilename = urlToPDF.split("/").slice(-1)[0];
pdfFilename = pdfFilename.split(".")[0] + "-" + uuidv4() + ".pdf";
formData.append('pdfFile', blob, pdfFilename);
//var zipFileName = pdfFilename.replace(".pdf", ".zip");
fetch("https://practicalpdf.com/code-pens/reflect/", {
method: 'POST',
body: formData,
})
.then(
function (response) {
if (response.status == 200) {
updateSaveUI(pdfFilename);
//alert(pdfFilename);
}
}
)
return new Promise((resolve, reject) => {
resolve({
code: AdobeDC.View.Enum.ApiResponseCode.SUCCESS,
data: {
metaData: { fileName: urlToPDF.split("/").slice(-1)[0] }
}
});
});
},
saveOptions
);
// Show the file
var previewFilePromise = adobeDCView.previewFile(
{
content: { promise: fetchPDF(urlToPDF) },
metaData: { fileName: urlToPDF.split("/").slice(-1)[0] }
,
},
viewerOptions
);
});
// Пытался избавиться от этого с помощью ajax
$.post('newfile.php', {pdfFile: formData});
// Вспомогательные функции:
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
(function () {
if (Blob.arrayBuffer != "function") {
Blob.prototype.arrayBuffer = myArrayBuffer;
}
function myArrayBuffer() {
return new Promise((resolve) => {
let fileReader = new FileReader();
fileReader.onload = () => {
resolve(fileReader.result);
};
fileReader.readAsArrayBuffer(this);
});
}
})();
// Это мой серверный файл
require_once "conn.php";
$file = $_POST['pdfFile'];
$target_dir = "uploads/";
move_uploaded_file($file,$target_dir);
Может ли кто-нибудь сказать мне, что я делаю не так и как это исправить?
1 ответ
2 строка должна быть...
$file = $_FILES["pdfFile"]["tmp_name"];
Мой серверный PHP для этого CodePen выглядит так...
<?php
header('Access-Control-Allow-Origin: *');
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["pdfFile"]["name"]);
$target_zip = str_replace(".pdf", ".zip", $target_file);
if (move_uploaded_file($_FILES["pdfFile"]["tmp_name"], $target_file)) {
$zip = new ZipArchive;
if ($zip->open($target_zip, ZipArchive::CREATE) === true) {
$zip->addFile($target_file, basename($_FILES["pdfFile"]["name"]));
$zip->close();
}
}
?>