让Magento生成的PDF打印图片(Magento invoice shipment pdf add product images)

magento-export:Magento 产品导出到 csv(magmi 就绪) 此 magento 产品导出基于 Aten Software Product Data Exporter for Magento。 修复了 db 表前缀的错误,删除了未使用的列,仅类别导出类别 ID(特别是 magmi 导入) 如何使用: 打开 export.php 并在第 43 行附近将您的密码添加到 const PASSWORD,然后您可以在浏览器中加载它 立即下载

应公司的要求,尝试着在magento打印出来的invoice和shipment中打印产品图片。于是乎参考了电商中国的http://www.ecartchina.com/display-products-images-on-pdf.html和Inchoo的http://inchoo.net/ecommerce/magento/magento-pdf-invoice-with-product-images-extension/两位前辈的文章,这里我想对带产品图打印做个小结,有什么不对的地方还望读者指教,谢谢!

Magento的打印功能其实是用ZF中的zend_pdf类库来实现的,因为magento本身就集成了zf,所以可以在代码中直接使用该类库,具体的document可以参见zf官方文档http://framework.zend.com/manual/en/zend.pdf.drawing.html 这里的测试版本我选用magento CE 1.5.1.0的老版本

首先更改app/code/local/Mage/Sales/Model/Order/Pdf/Invoice.php的代码:

class Mage_Sales_Model_Order_Pdf_Invoice extends Mage_Sales_Model_Order_Pdf_Abstract
{
	protected function insertImage($image, $x1, $y1, $x2, $y2, $width, $height, &$page)
	{
		if (!is_null($image)) {
			try{
				$width = (int) $width;
				$height = (int) $height;
				 
				//Get product image and resize it.
				$imagePath = Mage::helper('catalog/image')->init($image, 'image')
				->keepAspectRatio(true)
				->keepFrame(false)
				->resize($width, height)
				->__toString();
				
				
				$imageLocation = substr($imagePath,strlen(Mage::getBaseUrl()));
				$image = Zend_Pdf_Image::imageWithPath($imageLocation);
				//Draw image to PDF

				$page->drawImage($image, $x1, $y1, $x2, $y2);
			}
			catch (Exception $e) {
				return false;
			}
		}
	}
    public function getPdf($invoices = array())
    {
    	$width = 500;
		$height = 500;
        $this->_beforeGetPdf();
        $this->_initRenderer('invoice');

        $pdf = new Zend_Pdf();
        $this->_setPdf($pdf);
        $style = new Zend_Pdf_Style();
        $this->_setFontBold($style, 10);

        foreach ($invoices as $invoice) {
            if ($invoice->getStoreId()) {
                Mage::app()->getLocale()->emulate($invoice->getStoreId());
                Mage::app()->setCurrentStore($invoice->getStoreId());
            }
            $page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4);
            $pdf->pages[] = $page;

            $order = $invoice->getOrder();

            /* Add image */
            $this->insertLogo($page, $invoice->getStore());
            
            /* Add address */
            $this->insertAddress($page, $invoice->getStore());

            /* Add head */
            $this->insertOrder($page, $order, Mage::getStoreConfigFlag(self::XML_PATH_SALES_PDF_INVOICE_PUT_ORDER_ID, $order->getStoreId()));


            $page->setFillColor(new Zend_Pdf_Color_GrayScale(1));
            $this->_setFontRegular($page);
            $page->drawText(Mage::helper('sales')->__('Invoice # ') . $invoice->getIncrementId(), 35, 780, 'UTF-8');

            /* Add table */
            $page->setFillColor(new Zend_Pdf_Color_RGB(0.93, 0.92, 0.92));
            $page->setLineColor(new Zend_Pdf_Color_GrayScale(0.5));
            $page->setLineWidth(0.5);

            $page->drawRectangle(25, $this->y, 570, $this->y -15);
            $this->y -=10;

            /* Add table head */
            $page->setFillColor(new Zend_Pdf_Color_RGB(0.4, 0.4, 0.4));
            $page->drawText(Mage::helper('sales')->__('Products'), 35, $this->y, 'UTF-8');
            $page->drawText(Mage::helper('sales')->__('Product Image'), 255, $this->y, 'UTF-8');
            $page->drawText(Mage::helper('sales')->__('SKU'), 380, $this->y, 'UTF-8');
            $page->drawText(Mage::helper('sales')->__('Price'), 430, $this->y, 'UTF-8');
            $page->drawText(Mage::helper('sales')->__('Qty'), 480, $this->y, 'UTF-8');
            //$page->drawText(Mage::helper('sales')->__('Tax'), 480, $this->y, 'UTF-8');
            $page->drawText(Mage::helper('sales')->__('Subtotal'), 535, $this->y, 'UTF-8');

            $this->y -=15;

            $page->setFillColor(new Zend_Pdf_Color_GrayScale(0));

            /* Add body */
            foreach ($invoice->getAllItems() as $item){
                if ($item->getOrderItem()->getParentItem()) {
                    continue;
                }

                if ($this->y < 15) {
                    $page = $this->newPage(array('table_header' => true));
                }

                /* Draw item */
                $page = $this->_drawItem($item, $page, $order);
                /* Draw product image */
				$productId = $item->getOrderItem()->getProductId();
				$image = Mage::getModel('catalog/product')->load($productId);
				$this->insertImage($image, 240, (int)($this->y + 15), 350, (int)($this->y+115), $width, $height, $page);
            }

            /* Add totals */
            $page = $this->insertTotals($page, $invoice);

            if ($invoice->getStoreId()) {
                Mage::app()->getLocale()->revert();
            }
        }

        $this->_afterGetPdf();

        return $pdf;
    }

    /**
     * Create new page and assign to PDF object
     *
     * @param array $settings
     * @return Zend_Pdf_Page
     */
    public function newPage(array $settings = array())
    {
        /* Add new table head */
        $page = $this->_getPdf()->newPage(Zend_Pdf_Page::SIZE_A4);
        $this->_getPdf()->pages[] = $page;
        $this->y = 800;

        if (!empty($settings['table_header'])) {
            $this->_setFontRegular($page);
            $page->setFillColor(new Zend_Pdf_Color_RGB(0.93, 0.92, 0.92));
            $page->setLineColor(new Zend_Pdf_Color_GrayScale(0.5));
            $page->setLineWidth(0.5);
            $page->drawRectangle(25, $this->y, 570, $this->y-15);
            $this->y -=10;

            $page->setFillColor(new Zend_Pdf_Color_RGB(0.4, 0.4, 0.4));
            $page->drawText(Mage::helper('sales')->__('Product'), 35, $this->y, 'UTF-8');
            $page->drawText(Mage::helper('sales')->__('Product Image'), 255, $this->y, 'UTF-8');
            $page->drawText(Mage::helper('sales')->__('SKU'), 380, $this->y, 'UTF-8');
            $page->drawText(Mage::helper('sales')->__('Price'), 430, $this->y, 'UTF-8');
            $page->drawText(Mage::helper('sales')->__('Qty'), 480, $this->y, 'UTF-8');
            //$page->drawText(Mage::helper('sales')->__('Tax'), 535, $this->y, 'UTF-8');
            $page->drawText(Mage::helper('sales')->__('Subtotal'), 535, $this->y, 'UTF-8');

            $page->setFillColor(new Zend_Pdf_Color_GrayScale(0));
            $this->y -=20;
        }

        return $page;
    }

TAX我注释掉了,因为我不需要将其打印出来。

然后修改app/code/local/Mage/Sales/Model/Order/Pdf/Items/Invoice/Default.php

class Mage_Sales_Model_Order_Pdf_Items_Invoice_Default extends Mage_Sales_Model_Order_Pdf_Items_Abstract
{
    /**
     * Draw item line
     *
     */
    public function draw()
    {
        $order  = $this->getOrder();
        $item   = $this->getItem();
        $pdf    = $this->getPdf();
        $page   = $this->getPage();
        $lines  = array();

        // draw Product name
        $lines[0] = array(array(
            'text' => Mage::helper('core/string')->str_split($item->getName(), 60, true, true),
            'feed' => 35,
        ));

        
        // draw SKU
        $lines[0][] = array(
            'text'  => Mage::helper('core/string')->str_split($this->getSku($item), 25),
            'feed'  => 375
        );

        // draw Price
        $lines[0][] = array(
            'text'  => $order->formatPriceTxt($item->getPrice()),
            'feed'  => 445,
            'font'  => 'bold',
            'align' => 'right'
        );
        
        // draw QTY
        $lines[0][] = array(
            'text'  => $item->getQty()*1,
            'feed'  => 485
        );

        // draw Tax
        /*
        $lines[0][] = array(
            'text'  => $order->formatPriceTxt($item->getTaxAmount()),
            'feed'  => 495,
            'font'  => 'bold',
            'align' => 'right'
        );
		*/
        
        // draw Subtotal
        $lines[0][] = array(
            'text'  => $order->formatPriceTxt($item->getRowTotal()),
            'feed'  => 565,
            'font'  => 'bold',
            'align' => 'right'
        );

        // custom options
        $options = $this->getItemOptions();
        if ($options) {
            foreach ($options as $option) {
                // draw options label
                $lines[][] = array(
                    'text' => Mage::helper('core/string')->str_split(strip_tags($option['label']), 70, true, true),
                    'font' => 'italic',
                    'feed' => 35
                );

                if ($option['value']) {
                    $_printValue = isset($option['print_value']) ? $option['print_value'] : strip_tags($option['value']);
                    $values = explode(', ', $_printValue);
                    foreach ($values as $value) {
                        $lines[][] = array(
                            'text' => Mage::helper('core/string')->str_split($value, 50, true, true),
                            'feed' => 40
                        );
                    }
                }
            }
        }

        $lineBlock = array(
            'lines'  => $lines,
            'height' => 110
        );

        $page = $pdf->drawLineBlocks($page, array($lineBlock), array('table_header' => true));
        $this->setPage($page);
    }
}

循环打印出产品,并且设置行距为110,这样两步就OK了,提醒下,zend_pdf要求php extension 有GD库和Zilb库来运行jpg和png格式的图片打印,另外,请注意你的图片路径没有问题,如果图片打印不出来,请使用断点调试来确保图片路径可供程序访问。(我之前就是因为这个问题白白耗了1天,晕~)shipment的打印原理也是一样的,好了,不足之处,还请高人指正,谢谢!附上效果图:


别再被无限debugger卡住了!Chrome DevTools实战绕过技巧(含Hook与文件替换) 本文详细介绍了如何通过Chrome DevTools绕过无限debugger封锁的实战技巧,包括Hook技术与文件替换方法。针对常见的定时器轰炸、循环陷阱和动态注入等反调试手段,提供了高效的解决方案,帮助开发者快速突破调试障碍,提升爬虫和逆向工程效率。 阅读详情

相关推荐

STM32实战:增量式PID控制气体流量(附完整代码与调参技巧)

本文详细解析了如何在STM32平台上实现气体流量控制的增量式PID算法。内容涵盖从系统硬件架构选型、增量式PID算法原理与代码实现,到ADC采样滤波、PWM驱动配置等关键外设驱动,并提供了完整的参数整定技巧与工程调优实战指南,帮助开发者构建稳定可靠的气体流量控制系统。

rose2的博客 619

Magento开发教程 - 修改magento默认订单发票(invoice)

默认magneto invoice pdf生成是用Zend Framework.框架的 Zend_Pdf  模块,我们在做magento开发的 打开/app/code/local/Mage/Sales/Model/Order/Pdf/Invoice.php $page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4); //设定打印纸张 $page

phpstudios的专栏 754

智算中心建设全流程指南:从规划到落地

智算中心的建设是一个复杂而系统的过程,涉及选址、立项、办理相关手续、设计、土建、机电安装、调试、验收等多个环节。每个环节都需要充分考虑各种因素,并注意相关的事项,以确保智算中心的顺利建设和高效运行

数据中心全生命周期价值管理 3396

Magento订单打印(pdf格式) 转:鹏程万里

Magento订单打印(pdf格式) Magento自身包含有:打印发票单,打印装箱单,打印退款单。这些都是基于西方国家的习惯来布置的。公司有个需求就是打印订单的四联单,PDF格式的,要一周内完成。刚接到这个任务时,觉得头大,因为对于PHP如何生成PDF文件,以及Magento的打印系统,都还是一无所知。另外这次是中文打印,这和Magento内置的英文订单打印有区别。 接下来就是分析代码。对于

小画家 783

AI编程实战:用Spec Coding与Codex半小时重构全栈项目

这次我们来看一个能显著提升全栈开发效率的实战方法:利用 AI 编程工具 Codex 和 Spec Coding 工作流,将原本需要数周甚至一个月的全栈项目重构工期,压缩到半小时级别。这不是概念探讨,而是基于现有工具链的、可立即上手的工程实践。 对于前端开发者或全栈工程师而言,面对老旧项目重构、技术栈升级或从零搭建新项目时,最大的痛点往往是重复性、模式化的代码编写工作。手动编写 CRUD 接口、页面组件、状态管理和联调测试,耗时费力且容易出错。而 AI 辅助编程的核心价值,正是在于将开发者从这些“体力活”中解

weixin_33525298的博客 290

Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的理论简述和python仿真实现(附源码)

经典论文Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的学习与编程仿真,提供源码

m0_59701926的博客 1238

Add Custom Info on Invoice Pdf for Magento

如何在打印出来的Pdf里面增加额外信息,其实只要知道如何操纵数据,最终打印的handle还是Zend来执行,Magento内置了Zend_Pdf类,用他来打印PDF文件,下面是一个示例,比较简单易懂,在此抛砖引玉。以下代码加在Mage_Sales_Model_Order_Pdf_Invoice这个类中。 /* Gfit Msg Notice */ $freegiftboxHandle

YIP 1274

YOLOv8+BiFPN双向特征金字塔:多尺度目标检测精度提升28%的实战教程

双向特征金字塔网络(BiFPN)是一种强化多尺度特征融合支持“自顶向下+自底向上”的双向特征流动,同时保留不同尺度的细节信息;引入加权融合机制,自动学习不同特征的重要性权重;裁剪冗余节点,在轻量化的同时提升融合效率。

m0_64661770的博客 492

php编程的变化,php – 编程添加产品到购物车与价格变化

在挖了一下Magento的核心代码后,我发现你需要使用$ item-> getProduct() – > setIsSuperMode(true)为了使$ item-> setCustomPrice()和$ item-> setOriginalPrice ()工作。下面是一些可以在Observer中使用的示例代码,用于监听checkout_cart_product_add_...

weixin_36064196的博客 150

最新Python爬虫实战(入门爬虫篇)——案例7:电影网站电影数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过Python爬虫技术,成功实现了对某电影网站Top250多页电影详细信息的批量爬取与Excel保存。代码采用模块化设计,包含分页请求构造、XPath+正则提取结构化信息、Excel数据持久化保存等完整流程。通过配置User-Agent等请求头信息,有效模拟浏览器行为以绕过豆瓣基础反爬策略。整个爬虫逻辑遵循"分页遍历 → 请求页面 → 解析HTML → 提取电影信息 → 保存到Excel"的标准流程,与主流静态网站爬取范式高度一致。

努力让自己发光,对的人才能迎着光而来 11万+

第1章:认识OpenClaw

OpenClaw是一个开源的 AI 智能体 Gateway 网关项目名称演变:OpenClaw 原名 Clawdbot,因 Anthropic 商标顾虑在 2026年1月27日更名为 Moltbot(过渡名),最终在1月30日确定为 OpenClaw。三个名字本质是同一个项目,功能完全一致。🏠在你的电脑上运行:完全本地部署,数据隐私有保障📁访问本地文件:可以搜索、读取、编辑你电脑上的文件🔌扩展能力:通过Skills(技能)系统无限扩展功能💬多平台使用。

Maynor的博客 2834

magento1.9多站自动生成缩略图

关于magento1.9多站生成缩略图造成打开网页过慢,除了各种缓存和蜘蛛爬网生成缩略图并没有其它方法。对于多站产品图共用,可在magetno缩略图目录创建软件连接,让缩略图共用,减少文件占用空间,减少缩略图生成占用服务器资源。...

SleepyBear 393

使用MCAL的Fee模块集成ETAS存储协议栈

由于ETAS Fee模块导致初始化时间较长,且集成占用的内存较大,所以最终考虑使用MCAL中的Fee模块来集成ETAS的Nvm模块,本文介绍具体的集成方法注意:本文所涉及的集成前提是原有的ETAS协议栈已正常使用使用IFX Fee需要手动配置Fee,可能有出错的风险,最好是利用脚本自动生成代码来实现。另外,需要注意IFX的Fee中block数据没有CRC校验,如果使用该Fee,建议Nvm中加CRC校验(ETAS Fee中block自带CRC,可以不需要Nvm Crc),防止数据被意外篡改导致的异常。

赞的博客 404

magento 2.4 重新生成图片缩略图

php bin/magento catalog:image:resize 说明:如果后台改了使用imagemagick为缩略图插件,目前的2.4版本会有png图片出现黑底的情况。

CyrusZhou的专栏 408

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[原创]解决Magento 导出中文PDF 过大的问题。

关于“Magento导出pdf中文乱码”的解决方案,网上已经有不少人提到,这里就不再详细说,无非就是增加中文字体库,然后将app/code/core/Mage/Sales/Model/Order/Pdf/Abstract.php 里面的 _setFontXXXX() 修改加载相应的中文字体文件,修改如下: $font = Zend_Pdf_Font::fontWithPath(Ma

seiferli的专栏 1364

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Magento设置cronjob来让系统自动发送newsletter

用Newsletter来让Magento系统自动发送邮件给已经subscribe的客户email,相信应该是很多人想知道具体怎么操作的,在此小生说明下,有错误的地方欢迎指正! 要让系统自动发送邮件 需要设置cronjob这个东西,他可以自动帮我们完成一些计划任务,这是针对Unix linux机器而言的。linux机器进去Terminal,如果是用虚拟机或者vps进去ssh命令行输入:cronta

YIP 3635

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Magento结账时如何移除运费选择步骤(Skip shipping step on onepage checkout)

1.修改app\code\core\Mage\Checkout\Block \Onepage.php 我们需要做的是修改默认的step,就是修改getStep function public function getSteps() { $steps = array(); if (!$this->isCustomerLoggedIn()) { $steps['login'] = $this

YIP 2962

Magento操作Cookie 并且使用观察者&事件来禁用单页面全页缓存(EE FPC)

Groupon(http://www.groupon.hk/)的首次访问会弹出一个框让客户输入电子邮件来订阅他们的最新咨询,只要提交表单或者点已经提交的按钮该框就会消失 并且以后访问都不会出现  大家应该见过  最近按照公司的要求需要在magento里面开发类似的效果。 首先明确这其中使用的原理是cookie 那magento该怎么操纵cookie呢 其实在core的model里面有一个cooki

YIP 2771

Magento 中使用AJAX异步提交数据(Using Ajax with Magento)

如果你想用ajax提交magento的表单数据,可以尝试这种写法 getUrl('yourmoduleCompanyName/index/moduleIndexControllerAction') ?>', {asynchronous:true, evalScripts:fal

YIP 2759

Magento外部Add to cart操作(广告需要)

quick shopping Sku: Qty: Add to cart 以前觉得外部add to cart没什么用,后来才发现可以再帮我们坐推广的网站上使用,其实网站外只需要几行html代码,把如上代码放在外部: 然后add to cart的时候需要做了一跳转: <?php include_once 'app/Mage.php'; Mage:

YIP 2645

Magento前台只有产品的缩略图不显示?

最近发现一个怪异的现象,Magento前台只有产品的缩略图不显示。我检查了之前的操作,后台产品图片的选择设置,media文件夹的权限,缓存等一系列可能引发的因素,发现缩略图还是不显示,那就奇怪了,其他服务器上包括本地都是没问题的。缩略图通常是保存在media下类似这样的路径med

YIP 2595

Magento 新闻模块开发教程 (三) 创建前后端控制器

之前创建了骨架目录并且激活了新模块,现在要为模块创建前台和后台的控制器。1. 首先在app/code/local/Voodoo/News/controllers/ 中创建一个名为IndexController.php的前端控制器:class Voodoo_Ne

YIP 2544

Magento如何通过url参数给购物车添加商品?

<br />如题,如果是简单商品:<br />1.登录后台Catalog|Manage Products,查看对应商品的ID号,比如7<br /> <br />2.然后直接在地址栏输入 url<br />http://yourstoreurl/checkout/cart/add?product=[id]&qty=[qty]<br /> 或者<br /> http://yourstoreurl/checkout/cart/add/product/[id]/qty/[qty]<br /> <br />如果I

YIP 2392

Magento的路由分发机制

有半年没写东西了吧 不是没继续学 确实是懒了 好吧 言归正传! Magento的路由主要为了完成以下三个任务: 1.接收并处理浏览器数据讲它传送给系统的其他部分; 2.定义controller和action来供routes使用; 3.展示浏览器请求数据给blocks,templates和model数据。 其中最核心的前端Controller是Mage_Core_Contr

YIP 2352

How to add some custom registration fields while creating your magento account?(compatible also for 1.4.2.0 version)

1.Magento采用实体-值-属性(EVA)的灵活方式来操纵数据   实体为数据项目的描述,属性是一个属性定义表的外键约束,值则为属性的值2.为magento添加新的EVA,比如在用户注册页面添加一个ICQ的字段让用户填写自己的ICQ,你可以在app/design/frontend/YOUR_PACKAGE/YOUR_THEME/template/customer/form/regiter.phtml里面添加代码: $setup = new Mage_Eav_Model_Entity_Setup('

YIP 2338
上一篇: Magento Error:Invalid model for shipping method
下一篇: Magento copy custom option module(自定义选项复制插件)
ddjohn
博客等级 码龄17年 36粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值