Dompdf并设置不同的字体系列

时间:2014-06-25 15:00:50

标签: php dompdf

生成PDF时,它完全忽略了应用于CSS的font-family属性。而不是说 Verdana ,它使用 Times New Roman。所以我的CSS看起来像:

.sub-header {
    font-size: 1.4rem;
    text-transform: uppercase;
    font-family: NeutraText-Book !important;
    padding-bottom: 1.5rem;
}

PDF生成如下:

$pdf = PDF::loadHTML($view);
return $pdf->stream();

如何设置我想要的字体?

7 个答案:

答案 0 :(得分:23)

PDF文档内部支持以下字体:Helvetica,Times-Roman,Courier,Zapf-Dingbats,&符号(全部使用Windows ANSI编码)。 dompdf将在PDF中嵌入任何引用的字体,只要它已预先加载或可由dompdf访问并在CSS @font-face规则中引用。加载过程是必要的,以便生成用于类型设置的字体度量。

dompdf支持与基础R& OS PDF类相同的字体:只要字体指标(.afm / .ufm)可用,就输入类型1(.pfb)和TrueType(.ttf)。捆绑的基于PHP的php-font-lib支持加载和子设置字体。

加载字体的过程因您的需求和服务器访问而异。加载字体有三种方法:

  1. 使用CSS @ font-face规则在运行时加载字体。
  2. 从命令行使用dompdf / load_font.php。
  3. 浏览包含的管理站点中的dompdf / www / fonts.php。
  4. 使用CSS @ font-face规则在运行时加载字体

    无需命令行访问权限。只要您想要加载的字体在线可用,您就可以通过CSS轻松加载。

    @font-face {
      font-family: 'Open Sans';
      font-style: normal;
      font-weight: normal;
      src: url(http://themes.googleusercontent.com/static/fonts/opensans/v8/cJZKeOuBrn4kERxqtaUH3aCWcynf_cDxXwCLxiixG1c.ttf) format('truetype');
    }
    

    从命令行使用dompdf / load_font.php

    如果您可以访问命令行,则加载字体非常简单:

    [php] load_font.php "NeutraText-Book" /path/to/neutratext.ttf
    

    运行不带任何参数的命令以查看帮助文本。但很快,参数是:字体名称,普通字体文件,粗体字体文件,斜体字体文件,粗体斜体字体文件

    浏览包含的管理网站中的dompdf / www / fonts.php

    不言自明(sample)。您唯一需要做的就是确保您已修改了管理员用户名/密码组合


    注意:默认情况下不会包含load_font.php和管理网站,以dompdf 0.7.0开头

    改编自dompdf wiki(Unicode How-ToAbout Fonts and Character Encoding)和其他来源。

答案 1 :(得分:12)

我有类似的问题,我一直在寻找解决方案2天......对于新版本,接受的答案不再适用。

@ jay-bienvenu答案是对的。 新版本的DomPDF并不包含所有内容,而且文档也很差。

所以你必须:

  1. 下载load_font.php并将其放入您的根目录 项目: curl -o load_font.php https://raw.githubusercontent.com/dompdf/utils/master/load_font.php

  2. 然后用您的编辑器打开load_font.php并将正确的路径放到autoload.inc.php中,     例如require_once 'lib/dompdf/autoload.inc.php';

  3. 打开命令行,转到项目的根文件夹,然后运行该实用程序,其中包含您要注册的字体的名称以及TFF文件的路径 例如php load_font.php SourceSansPro ./pathToYourFolder/lib/dompdf/SourceSansPro-Regular.ttf ./pathToYourFolder/lib/dompdf/SourceSansPro-Bold.ttf

  4. 现在已安装字体。您可以像在html中一样使用它作为webfont:

    
    
    <html>
    <head>
        <meta http-equiv="Content-Type" content="charset=utf-8" />
        <style type="text/css">
            @page {
                margin: 0;
            }
            * { padding: 0; margin: 0; }
            @font-face {
                font-family: "source_sans_proregular";           
                src: local("Source Sans Pro"), url("fonts/sourcesans/sourcesanspro-regular-webfont.ttf") format("truetype");
                font-weight: normal;
                font-style: normal;
    
            }        
            body{
                font-family: "source_sans_proregular", Calibri,Candara,Segoe,Segoe UI,Optima,Arial,sans-serif;            
            }
        </style>
    </head>
    <body>
    Your code here ....
    </body>
    </html>
    &#13;
    &#13;
    &#13;

    并在php中制作pdf:

    require_once 'lib/dompdf/autoload.inc.php';
    
    use Dompdf\Dompdf;
    
    // instantiate and use the dompdf class
    $dompdf = new Dompdf();
    $dompdf->loadHtml($html, 'UTF-8');
    
    // (Optional) Setup the paper size and orientation
    $dompdf->setPaper('A4');
    
    $dompdf->set_option('defaultMediaType', 'all');
    $dompdf->set_option('isFontSubsettingEnabled', true);
    
    // Render the HTML as PDF
    $dompdf->render();
    

    编辑:我发了一篇关于如何使用dompdf并应用自定义字体的博文,以便更加详细:https://www.blog.lab21.gr/using-domdpf-create-pdf-php

答案 2 :(得分:3)

Dompdf About Fonts and Character Encoding说字体实用程序已包含但未告诉您如何获取并运行它。以下是:

  1. load_font.php下载到项目的根目录。 curl -o load_font.php https://raw.githubusercontent.com/dompdf/utils/master/load_font.php

  2. 使用文本编辑器(例如vim)打开load_font.php。将require_once "autoload.inc.php";更改为require_once "vendor/autoload.php";

  3. 使用您要注册的字体名称和TFF文件的路径运行该实用程序。例如:php load_font.php 'Brush Script MT' https/fonts/brush-script-mt.ttf

  4. 阅读load_font.php的代码,了解有关如何使用此命令的更多信息。

答案 3 :(得分:1)

您需要在DomPDF中加载字体。查看this pag e了解详情。

答案 4 :(得分:1)

感谢上面Brians的回答,但在我的情况下只有一个选项可以使用“dompdf / www / fonts.php”安装字体

它安装了字体 浏览包含的管理站点中的dompdf / www / fonts.php。 (它将类似于http://yoursite.com/sites/all/modules/print/lib/dompdf/www/fonts.php

转到页面底部,然后点击链接

[Authenticate to access this section][1]

它提示警告说“必须在dompdf_config.custom.inc.php中更改密码”。

  1. 转到dompdf_config.custom.inc.php文件并添加用户名和 密码在文件的底部。你可以找到 “DOMPDF_ADMIN_USERNAME”和“DOMPDF_ADMIN_PASSWORD”。取消注释这些 2行并添加用于安装字体的用户名和密码。
  2. 现在,再次点击[Authenticate to access this section][2],它会问 用户名和密码。输入您在第一步中提供的用户名和密码。

  3. 如果您在浏览器中再次浏览相同的fonts.php路径,您可以在页面底部找到安装新字体部分(您可以在图片中看到)install new fonts,(但是,我搬了我的rockwell.ttf和rockwell.afm文件首先到了fonts文件夹,然后我安装在这里)

  4. 选择所需的字体ttf文件,然后进行安装。它安装并显示安装的字体,但它不适合我。所以我不得不为我的新字体创建.afm文件。(这里我想使用rockwell字体)

  5. 我创建了rockwell.afm文件的步骤。  1

    我这样做就像dompdf其他14种原生字体一样,我不确定这是多么可以接受。但它对我有用。我只是想完成它。

    • 我添加了我的rockwell字体,我在php文件中找到了dompdf原生字体名称

    • 在dompdf / include / dompdf.cls.php文件中向public static $native_fonts数组添加了“rockwell”

    • 将“rockwell”阵列添加到
      dompdf / lib / fonts / dompdf_font_family_cache.dist.php文件如下adding rockwell array

    就是这样。它为我生成了rockwell.afm文件,如rockwell afm file

    • 只需使用您想要使用的任何字体系列,例如

       body {  
                      font-family: 'rockwell';
                      font-size:10;
                      }   
      

答案 5 :(得分:0)

您需要使用dompdf库来生成具有特定字体系列的pdf。

$html ='<!doctype html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>';

$html.='</head><body>';
$html.="<style> 
@font-face { font-family: 'Roboto Regular'; font-weight: normal; src: url(\'fonts/Roboto-Regular.ttf\') format(\'truetype\'); } 
@font-face { font-family: 'Roboto Bold'; font-weight: bold; src: url(\'fonts/Roboto-Bold.ttf\') format(\'truetype\'); } 
body{ font-family: 'Roboto Regular', sans-serif; font-weight: normal; line-height:1.6em; font-size:17pt; }
h1,h2{ font-family: 'Roboto Bold', sans-serif; font-weight: bold; line-height:1.2em; }
</style>";

$html.='test <br>
<span style="font-family:\'Open Sans\'"> test </span> <br>          ';
$html.= '</body></html>';

$dompdf = new Dompdf\Dompdf();
$dompdf->load_html($html,'UTF-8');
$dompdf->set_paper('A4', 'portrait');
$dompdf->render();
$dompdf->stream();

答案 6 :(得分:0)

这里有很多答案,很难获得可靠的跨语言支持。我相信,对于我们这些生产分布式软件的人来说,还有一些服务器设置块可以阻止pdfdom中的@importsrc:url()之类的某些功能,这些功能会自动嵌入字体。

以下解决方案已在许多服务器和本地托管站点上运行,并且不需要命令行访问:

  1. 检索要用作.ttf的字体(对于语言支持(包括西里尔文,希腊文,梵文,拉丁文和越南文,我们使用Noto Sans并选中了所有可选语言)
  2. 运行/构建以下脚本并仅触发PDFBuilder_install_font_family()仅一次(单次安装)

Gist for PDFBuilder_install_font_family()