ToolController.php 4.5 KB
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use BaconQrCode\Renderer\ImageRenderer;
use BaconQrCode\Renderer\RendererStyle\RendererStyle;
use BaconQrCode\Writer;
use Illuminate\Http\Request;
use karmabunny\BaconBackends\GdImageBackEnd;
use setasign\Fpdi\Fpdi;

class ToolController extends Controller
{
    /**
     * @param array $data
     * @param string $message
     * @param int $status
     * @return string
     */
    protected function success($data = [], $message = 'success', $status = 200)
    {
        $array = compact('status', 'message', 'data');
        return json_encode($array, JSON_UNESCAPED_UNICODE);
    }

    /**
     * @param int $status
     * @param string $message
     * @param array $data
     * @return string
     */
    protected function error($message = 'error', $status = 400, $data = [])
    {
        $array = compact('status', 'message', 'data');
        return json_encode($array, JSON_UNESCAPED_UNICODE);
    }

    /**
     * 生成二维码
     * @param Request $request
     * @return string
     * @author Akun
     * @date 2026/03/05 10:28
     */
    public function createQr(Request $request)
    {
        $qrText = $request->input('qr_text');
        if (empty($qrText)) {
            return $this->error('二维码内容未知');
        }

        // 生成二维码图片
        try {
            $qrImage = '/www/wwwroot/qrcode/qrcode_' . time() . '.png';
            $renderer = new ImageRenderer(
                new RendererStyle(300, 0),
                new GdImageBackEnd() // 使用 GD 后端
            );
            $writer = new Writer($renderer);

            $writer->writeFile($qrText, $qrImage);

            return $this->success(['qr_image' => $qrImage]);
        } catch (\Exception $e) {
            return $this->error($e->getMessage());
        }
    }

    /**
     * pdf文件添加二维码
     * @param Request $request
     * @return string
     * @throws \setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException
     * @throws \setasign\Fpdi\PdfParser\Filter\FilterException
     * @throws \setasign\Fpdi\PdfParser\PdfParserException
     * @throws \setasign\Fpdi\PdfParser\Type\PdfTypeException
     * @throws \setasign\Fpdi\PdfReader\PdfReaderException
     * @author Akun
     * @date 2026/03/04 10:43
     */
    public function addQrToPdf(Request $request)
    {
        $sourceFile = $request->input('original_pdf');
        if (empty($sourceFile)) {
            return $this->error('pdf地址未知');
        }
        if (!file_exists($sourceFile)) {
            return $this->error('pdf文件不存在');
        }
        $qrImage = $request->input('qr_image');
        if (empty($qrImage)) {
            return $this->error('二维码地址未知');
        }
        if (!file_exists($qrImage)) {
            return $this->error('二维码文件不存在');
        }

        try {
            $pdf = new Fpdi();

            $pageCount = $pdf->setSourceFile($sourceFile);

            for ($i = 1; $i <= $pageCount; $i++) {

                $tpl = $pdf->importPage($i);
                $size = $pdf->getTemplateSize($tpl);

                $pdf->AddPage($size['orientation'], [$size['width'], $size['height']]);
                $pdf->useTemplate($tpl);

                // ✅ 只在第一页添加二维码
                if ($i === 1) {

                    $qrWidth = 30;  // 二维码宽度(单位:mm)
                    $margin = 5;   // 距离边缘间距(mm)

                    $x = $size['width'] - $qrWidth - $margin;
                    $y = $margin;

                    $pdf->Image($qrImage, $x, $y, $qrWidth);

                    $text = 'Scan to verify the original MTC on official website';

                    // 设置字体(必须设置,否则不显示)
                    $pdf->SetFont('Arial', '', 8);

                    // 计算文字位置
                    $textY = $y + $qrWidth + 2; // 二维码下方2mm

                    // 设置光标位置
                    $pdf->SetXY($x - 1, $textY);

                    // 固定宽度,自动换行
                    $pdf->MultiCell($qrWidth + 10, 4, $text, 0, 'L');
                }
            }

            // 生成新的pdf文件
            $outputFile = substr($sourceFile, 0, -4) . '_' . time() . '.pdf';
            $pdf->Output('F', $outputFile);

            return $this->success(['target_pdf' => $outputFile]);
        } catch (\Exception $e) {
            return $this->error($e->getMessage());
        }
    }
}