我正在使用symfony和angular进行项目,我希望以json或其他方式发送pdf文件,将其从我的后端发送到前端应用程序。
我不会尝试将其保存在服务器上并仅发送要访问的URL。我想要的是在json数据上发送它。
更多细节我使用FPDF生成pdf文件,我想在json中使用它。 这是我的控制器:
/**
* @Get("/testt")
*/
public function test2Action()
{
$pdf = new \FPDF('P','mm','A4');
$pdf->AddPage();
$pdf->Image(__DIR__.'/../../../../web/assets/images/icons8-Calendar Filled-50.png');
$pdf->SetFont('Arial','B',14);
$pdf->SetXY(25,12);
$pdf->Cell(40,10,utf8_decode('Evénements'));
$pdf->SetXY(10,25);
$pdf->Cell(40,10,utf8_decode("72eordre"));
$pdf->SetXY(12,42);
$pdf->Image(__DIR__.'/../../../../web/assets/images/icons8-Marker-50.png',null,null,-150);
$pdf->SetFont('Arial','B',10);$pdf->SetTextColor(110,110,110);
$pdf->SetXY(22,36);
$pdf->Cell(40,10,utf8_decode(" Grand Palais"));
$pdf->SetXY(22,41);
$pdf->Cell(40,10,utf8_decode("saada 458"));
$pdf->SetXY(22,46);
$pdf->Cell(40,10,utf8_decode("59000, marrakech-"));
$pdf->SetXY(12,61);
$pdf->Image(__DIR__.'/../../../../web/assets/images/calendar-gris.png',null,null,-150);
$pdf->SetXY(22,58);
$pdf->Cell(40,10,utf8_decode("Du 27 septembre 2017 à 08:00"));
$pdf->SetXY(22,63);
$pdf->Cell(40,10,utf8_decode("Au 29 semptembre 2017 à 18:00"));
$pdf->SetXY(10,80);
$pdf->SetFont('Arial','B',10);$pdf->SetFont('');$pdf->SetTextColor(110,110,110);
$pdf->Cell(40,10,utf8_decode("Cette carte"));
$pdf->SetXY(10,85);
$pdf->Cell(20,10,utf8_decode(" obtenir votre badge "));
$pdf->SetXY(25,96);
$pdf->Image(__DIR__.'/../../../../web/assets/qrcode.png',null,null,-220);
$pdf->SetXY(25,160);
$pdf->SetFillColor(1,49,180);
$pdf->SetLineWidth(0.2835);
$pdf->Rect(12,160,85,20, "F");
$pdf->SetXY(14,161);
$pdf->SetFont('Arial','B',14);$pdf->SetTextColor(255,255,255);
$pdf->Cell(20,10,utf8_decode("yassine "));
$pdf->SetXY(14,168);
$pdf->SetFont('Arial','B',12);$pdf->SetTextColor(255,255,255);$pdf->SetFont('');
$pdf->Cell(20,10,utf8_decode("CHEF DE PROJET "));
$pdf->SetDrawColor(150,150,150);
$pdf->Line(10, 25, 100, 25);
$pdf->Line(10, 35, 100, 35);
$pdf->Line(15, 55, 100, 55);
$pdf->Line(10, 75, 100, 75);
return new Response($pdf->Output(), 200, array(
'Content-Type' => 'application/pdf'));
}
如您所见,响应类型默认位于FPDF api中:application / pdf
那么从角度为2.3
的前端发送此文件和访问的解决方案是什么?答案 0 :(得分:1)
将PDF嵌入到JSON响应中的安全方法是将其编码为base64格式。之后,您可以在客户端解析响应,解码PDF数据并使用PDF内容执行任何操作。
return new JsonResponse(['data' => base64_encode($pdf->Output())]);
答案 1 :(得分:0)
先前的响应是正确的,我们在许多公司中都像这样工作,您也可以使用FrameworkBundle的ControllerTrait提供的快捷方式来渲染JsonResponse:
return $this->json(['data' => base64_encode($pdf->Output())]);
但是,在2019年,我们有许多移动应用程序,base64编码不是一个好的解决方案,考虑到base64的大尺寸(原始内容的最大33%),手机可以烧掉。
对于解决方案,我们不将REST与JSON结合使用,而只是通过BinaryFileResponse(自动设置正确的内容类型)来提供文件
public function downloadAction(Request $request)
{
$em = $this->get('doctrine.orm.entity_manager');
/** @var MessageFile $file */
$file = $em->getRepository(MessageFile::class)->findFile(
$request->attributes->get('id')
);
return new BinaryFileResponse($file->getPath());
}
在Angular应用中,只需调用downloadAction。