Php Fabric js画布转换为pdf(TCPDF)

Php Fabric js画布转换为pdf(TCPDF),php,json,pdf,canvas,Php,Json,Pdf,Canvas,我使用fabric.js绘制一些明信片(背景、图像、文本)。我想基于这张卡片创建pdf。所以我将json对象发送到php,并使用foreach获取所有元素。但是,当我以相同的分辨率(761x430)创建文档并从json设置边距、位置和其他值时,pdf中的对象位置与fabric js中的不同。所以我应该做的是,我的pdf中的位置与画布上的位置相同。 要创建pdf,我使用TCPDF JSON文件 {"objects":[{"type":"text","originX":"center","origi

我使用fabric.js绘制一些明信片(背景、图像、文本)。我想基于这张卡片创建pdf。所以我将json对象发送到php,并使用foreach获取所有元素。但是,当我以相同的分辨率(761x430)创建文档并从json设置边距、位置和其他值时,pdf中的对象位置与fabric js中的不同。所以我应该做的是,我的pdf中的位置与画布上的位置相同。 要创建pdf,我使用TCPDF

JSON文件

{"objects":[{"type":"text","originX":"center","originY":"center","left":531.22,"top":249,"width":115,"height":31.2,"fill":"e2ddcf","stroke":null,"strokeWidth":5,"strokeDashArray":null,"strokeLineCap":"butt","strokeLineJoin":"miter","strokeMiterLimit":10,"scaleX":1.14,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"clipTo":null,"backgroundColor":"","text":"MOJE TŁO","fontSize":24,"fontWeight":"normal","fontFamily":"Times New Roman","fontStyle":"normal","lineHeight":1.3,"textDecoration":"","textAlign":"left","path":null,"textBackgroundColor":"","useNative":true},{"type":"image","originX":"center","originY":"center","left":63,"top":304,"width":66,"height":66,"fill":"rgb(0,0,0)","stroke":null,"strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"butt","strokeLineJoin":"miter","strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":340.06,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"clipTo":null,"backgroundColor":"","src":"src_to_picture","filters":[]}],"background":"cyan","backgroundImage":"src_to_my_picture","backgroundImageOpacity":1,"backgroundImageStretch":true}
PHP代码

$pdf = new MYPDF("L", "px", array(761, 430), true, 'UTF-8', false, false, $objects->backgroundImage, $objects->background);
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetLeftMargin(0);
    $pdf->SetRightMargin(0);
    $pdf->SetHeaderMargin(0);
    $pdf->SetFooterMargin(0);
    $pdf->setPrintFooter(false);
    #$pdf->setPrintHeader(false);
    $pdf->AddPage();
    foreach ($objects->objects as $object) {
        $pdf->StartTransform();
        switch ($object->type) {
            case 'text':
                $align = $this->setAlign($object->textAlign);
                $style = $this->setStyle($object->fontStyle);
                $newColor = $this->hex2RGB($object->fill);
                $pdf->setXY($object->left, $object->top);
                $pdf->SetFont("times", $style, $object->fontSize);
                $pdf->SetTextColor($newColor['red'], $newColor['green'], $newColor['blue']);
                $pdf->MultiCell(0, $object->height, $object->text, 0, $align, false, 1, '', '', true, 0, false, true, 0, 'T', false);
                break;
            case 'image':
                $pdf->setXY($object->left, $object->top);
                $pdf->Rotate(360-$object->angle);
                $pdf->Image($object->src, $object->left, $object->top, $object->width, $object->height, '', '', '', false, 300, '', false, false, 0);
                break;
            default:
                break;
        }
        $pdf->StopTransform();
    }
    $pdf->Close();
    echo $pdf->Output('test.pdf', 'D');

好吧,它工作了,这是非常容易使这个代码工作:D 左侧和顶部是从对象的中心给定的,因此足够的左侧边缘减去对象宽度的一半,它就工作了

$pdf = new MYPDF("L", "px", array(761, 430), true, 'UTF-8', false, false, $objects->backgroundImage, $objects->background);
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetLeftMargin(0);
$pdf->SetRightMargin(0);
$pdf->SetHeaderMargin(0);
$pdf->SetFooterMargin(0);
$pdf->setPrintFooter(false);
#$pdf->setPrintHeader(false);
$pdf->AddPage();
foreach ($objects->objects as $object) {
    $pdf->StartTransform();
    $left = $object->left - ($object->width/2);
    $top = $object->top - ($object->height/2);
    switch ($object->type) {
        case 'text':
            $align = $this->setAlign($object->textAlign);
            $style = $this->setStyle($object->fontStyle);
            $newColor = $this->hex2RGB($object->fill);
            $pdf->setXY($left, $top);
            $pdf->SetFont("times", $style, $object->fontSize);
            $pdf->SetTextColor($newColor['red'], $newColor['green'], $newColor['blue']);
            $pdf->MultiCell(0, $object->height, $object->text, 0, $align, false, 1, '', '', true, 0, false, true, 0, 'T', false);
            break;
        case 'image':
            $pdf->setXY($left, $top);
            $pdf->Rotate(360-$object->angle);
            $pdf->Image($object->src, $object->left, $object->top, $object->width, $object->height, '', '', '', false, 300, '', false, false, 0);
            break;
        default:
            break;
    }
    $pdf->StopTransform();
}
$pdf->Close();
echo $pdf->Output('test.pdf', 'D');

如果有人对此有问题,以上就是正确的代码。

好吧,如果它能正常工作,那么很容易让代码正常工作:D 左侧和顶部是从对象的中心给定的,因此足够的左侧边缘减去对象宽度的一半,它就工作了

$pdf = new MYPDF("L", "px", array(761, 430), true, 'UTF-8', false, false, $objects->backgroundImage, $objects->background);
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetLeftMargin(0);
$pdf->SetRightMargin(0);
$pdf->SetHeaderMargin(0);
$pdf->SetFooterMargin(0);
$pdf->setPrintFooter(false);
#$pdf->setPrintHeader(false);
$pdf->AddPage();
foreach ($objects->objects as $object) {
    $pdf->StartTransform();
    $left = $object->left - ($object->width/2);
    $top = $object->top - ($object->height/2);
    switch ($object->type) {
        case 'text':
            $align = $this->setAlign($object->textAlign);
            $style = $this->setStyle($object->fontStyle);
            $newColor = $this->hex2RGB($object->fill);
            $pdf->setXY($left, $top);
            $pdf->SetFont("times", $style, $object->fontSize);
            $pdf->SetTextColor($newColor['red'], $newColor['green'], $newColor['blue']);
            $pdf->MultiCell(0, $object->height, $object->text, 0, $align, false, 1, '', '', true, 0, false, true, 0, 'T', false);
            break;
        case 'image':
            $pdf->setXY($left, $top);
            $pdf->Rotate(360-$object->angle);
            $pdf->Image($object->src, $object->left, $object->top, $object->width, $object->height, '', '', '', false, 300, '', false, false, 0);
            break;
        default:
            break;
    }
    $pdf->StopTransform();
}
$pdf->Close();
echo $pdf->Output('test.pdf', 'D');

如果有人对此有问题,以上是正确的代码。

我看到您在代码中使用了MYPDF类。这是TCPDF的定制版本还是?有没有什么github的repo?它的lib与tcpdf相似,是3年前的事了,所以repo可能不存在,但是你可以使用任何php的pdf lib生成器。我看到你在代码中使用了MYPDF类。这是TCPDF的定制版本还是?有没有什么github的repo呢?它的lib与tcpdf更相似,是3年前的事了,所以repo可能不存在,但是你可以使用任何php的pdf lib生成器。