PDF 解码的 Base64 PDF 可以用 chrome 和浏览器打开,但不能用 adobe
PDF Decoded Base64 PDF can be open by chrome and browsers but not with adobe
我对 php 生成的 pdf 文件有疑问。 pdf 的生成工作得很好。将文件保存到我的网络服务器后,我可以下载它并使用我的 Mac 或 Edge Chrome 和 Firefox 等浏览器打开它。只有当我用 Adobe Acrobat 打开文件时 Reader 它没有打开文件。
错误:打开此文件时出错。文件损坏无法修复
我用 javascript 和一点点 php 创建了文件。
在 JS 中,我使用库 pdfLib 来创建 pdf 文件。
const existingPdfBytes = await fetch(url).then(res => res.arrayBuffer());
const pdfDoc = await PDFDocument.load(existingPdfBytes);
.
.
...changes in the pdf File...
.
.
const pdfBytes = await pdfDoc.save();
const dateOfToday = getDateofToday();
const dateTimeStamp = new Date().getTime();
const fileName = "Vertrag_von_" + dateOfToday + "_ID_" + dateTimeStamp + ".pdf";
sendWithAjax(pdfBytes, studio[4], answers["email"], fileName, answers["telenummer"]);
function sendWithAjax(pdfBytes, studioMail, customerMail , fileName, customerPhoneNumber) {
pdfBytes = bytesToBase64(pdfBytes);
if (window.XMLHttpRequest) {
// AJAX nutzen mit IE7+, Chrome, Firefox, Safari, Opera
xmlhttp=new XMLHttpRequest();
}
else {
// AJAX mit IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST", "sendContractEmail.php", true);
var data = new FormData();
data.append("byte", JSON.stringify(pdfBytes));
data.append("studioMail", JSON.stringify(studioMail));
data.append("customerMail", JSON.stringify(customerMail));
data.append("fileName", JSON.stringify(fileName));
data.append("customerPhoneNumber", JSON.stringify(customerPhoneNumber));
xmlhttp.send(data);
}
在 JS 中创建 pdf 文件后,我在 ajax 的帮助下将 UInt8_Array 和其他信息发送到我的 php 文件。
在 php.file 中,我使用以下代码将 Uint8_Array 解码为 Base64 字符串,并将其保存在我的网络服务器上的文件中。
if(!empty($_POST['byte'])){
$data = json_decode($_POST['byte']);
$fileName = json_decode($_POST['fileName']);
$studioMail = json_decode($_POST['studioMail']);
$customerMail = json_decode($_POST['customerMail']);
$customerPhoneNumber = json_decode($_POST['customerPhoneNumber']);
if (!empty($data)) {
// Detects if there is base64 encoding header in the string.
// If so, it needs to be removed prior to saving the content to a phisical file.
if (strpos($data, ',') !== false) {
@list($encode, $data) = explode(',', $data);
}
$base64data = base64_decode($data, true);
$pdf = fopen ('contractPDFs/'.$fileName ,'w');
fwrite ($pdf,$base64data);
fclose ($pdf);
}
echo "Contract saved";
sendEMailToStudio($fileName, $studioMail, $customerMail, $customerPhoneNumber);
sendEMailToCustomer($customerMail);
} else {
echo "No Data Sent";
}
有人可以帮助我解决我的问题并解释为什么我无法使用 Adobe Acrobat 打开 pdf 文件 Reader?
谢谢
经过长时间的研究,我找到了解决方案。
我将线路改为
const pdfBytes = await pdfDoc.save();
const pdfBytes = await pdfDoc.save({useObjectStreams: false});
这是我的 JS 文件中唯一的变化。现在我像以前一样将数据发送到我的 php 文件。
在我的 php 文件中,我更改了:
if (!empty($data)) {
// Detects if there is base64 encoding header in the string.
// If so, it needs to be removed prior to saving the content to a phisical file.
if (strpos($data, ',') !== false) {
@list($encode, $data) = explode(',', $data);
}
$base64data = base64_decode($data, true);
$pdf = fopen ('contractPDFs/'.$fileName ,'w');
fwrite ($pdf,$base64data);
fclose ($pdf);
}
到
if (!empty($data)) {
$pdf = file_put_contents('contractPDFs/'.$fileName, base64_decode($data));
}
进行此更改后,我可以使用 Adobe Acrobat 打开 pdf Reader。
我希望我能帮助别人并保护你的时间。
我对 php 生成的 pdf 文件有疑问。 pdf 的生成工作得很好。将文件保存到我的网络服务器后,我可以下载它并使用我的 Mac 或 Edge Chrome 和 Firefox 等浏览器打开它。只有当我用 Adobe Acrobat 打开文件时 Reader 它没有打开文件。
错误:打开此文件时出错。文件损坏无法修复
我用 javascript 和一点点 php 创建了文件。 在 JS 中,我使用库 pdfLib 来创建 pdf 文件。
const existingPdfBytes = await fetch(url).then(res => res.arrayBuffer());
const pdfDoc = await PDFDocument.load(existingPdfBytes);
.
.
...changes in the pdf File...
.
.
const pdfBytes = await pdfDoc.save();
const dateOfToday = getDateofToday();
const dateTimeStamp = new Date().getTime();
const fileName = "Vertrag_von_" + dateOfToday + "_ID_" + dateTimeStamp + ".pdf";
sendWithAjax(pdfBytes, studio[4], answers["email"], fileName, answers["telenummer"]);
function sendWithAjax(pdfBytes, studioMail, customerMail , fileName, customerPhoneNumber) {
pdfBytes = bytesToBase64(pdfBytes);
if (window.XMLHttpRequest) {
// AJAX nutzen mit IE7+, Chrome, Firefox, Safari, Opera
xmlhttp=new XMLHttpRequest();
}
else {
// AJAX mit IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST", "sendContractEmail.php", true);
var data = new FormData();
data.append("byte", JSON.stringify(pdfBytes));
data.append("studioMail", JSON.stringify(studioMail));
data.append("customerMail", JSON.stringify(customerMail));
data.append("fileName", JSON.stringify(fileName));
data.append("customerPhoneNumber", JSON.stringify(customerPhoneNumber));
xmlhttp.send(data);
}
在 JS 中创建 pdf 文件后,我在 ajax 的帮助下将 UInt8_Array 和其他信息发送到我的 php 文件。
在 php.file 中,我使用以下代码将 Uint8_Array 解码为 Base64 字符串,并将其保存在我的网络服务器上的文件中。
if(!empty($_POST['byte'])){
$data = json_decode($_POST['byte']);
$fileName = json_decode($_POST['fileName']);
$studioMail = json_decode($_POST['studioMail']);
$customerMail = json_decode($_POST['customerMail']);
$customerPhoneNumber = json_decode($_POST['customerPhoneNumber']);
if (!empty($data)) {
// Detects if there is base64 encoding header in the string.
// If so, it needs to be removed prior to saving the content to a phisical file.
if (strpos($data, ',') !== false) {
@list($encode, $data) = explode(',', $data);
}
$base64data = base64_decode($data, true);
$pdf = fopen ('contractPDFs/'.$fileName ,'w');
fwrite ($pdf,$base64data);
fclose ($pdf);
}
echo "Contract saved";
sendEMailToStudio($fileName, $studioMail, $customerMail, $customerPhoneNumber);
sendEMailToCustomer($customerMail);
} else {
echo "No Data Sent";
}
有人可以帮助我解决我的问题并解释为什么我无法使用 Adobe Acrobat 打开 pdf 文件 Reader?
谢谢
经过长时间的研究,我找到了解决方案。
我将线路改为
const pdfBytes = await pdfDoc.save();
const pdfBytes = await pdfDoc.save({useObjectStreams: false});
这是我的 JS 文件中唯一的变化。现在我像以前一样将数据发送到我的 php 文件。
在我的 php 文件中,我更改了:
if (!empty($data)) {
// Detects if there is base64 encoding header in the string.
// If so, it needs to be removed prior to saving the content to a phisical file.
if (strpos($data, ',') !== false) {
@list($encode, $data) = explode(',', $data);
}
$base64data = base64_decode($data, true);
$pdf = fopen ('contractPDFs/'.$fileName ,'w');
fwrite ($pdf,$base64data);
fclose ($pdf);
}
到
if (!empty($data)) {
$pdf = file_put_contents('contractPDFs/'.$fileName, base64_decode($data));
}
进行此更改后,我可以使用 Adobe Acrobat 打开 pdf Reader。
我希望我能帮助别人并保护你的时间。