将json中的pdf从symfony发送到angular

时间:2017-06-07 09:30:02

标签: json angular symfony fpdf

我正在使用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

的前端发送此文件和访问的解决方案是什么?

2 个答案:

答案 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。