Dompdf和设置不同的字体族

46

生成PDF文件时,我的font-family属性在CSS中被完全忽略了。与其使用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();

我该如何设置自己想要的字体?

11个回答

48

PDF文档内部支持以下字体:Helvetica、Times-Roman、Courier、Zapf-Dingbats和Symbol(均使用Windows ANSI编码)。只要通过预加载或在CSS的@font-face规则中引用且dompdf可以访问,dompdf将在PDF中嵌入任何引用的字体。加载过程是必需的,以便生成用于排版的字体度量。

dompdf支持与底层R&OS PDF类相同的字体:Type 1(.pfb)和TrueType(.ttf),只要字体度量(.afm/.ufm)可用即可。基于PHP的php-font-lib提供了加载和子集化字体的支持。

根据您的需求和服务器访问权限,加载字体的过程会有所不同。您可以有三种方法来加载字体:

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

使用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,该网站已包含在内

很容易理解 (示例)。你需要做的唯一一件事就是确保你已经修改了管理员用户名/密码组合。


注意:load_font.php和管理站点将不会默认包含在dompdf 0.7.0中

改编自dompdf维基 (Unicode教程关于字体和字符编码) 和其他来源。


我正在使用laravel-dompdf。我在本地xampp服务器上有一个项目。项目名称为“text”。位置位于htdocs文件夹下(xampp / htdocs / test)。我如何通过命令行添加自定义字体,例如孟加拉语字体“kalpurush”。 您能否发送命令行以及从哪里发送。假设我应该从哪里运行命令。(例如:从测试文件夹还是从供应商或其他地方)。laravel-dompdf安装供应商目录。将kalpurush.ttf文件添加到storage / fonts /目录中。 - raihan

34

我有类似的问题,已经寻找解决方案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

现在字体已安装。您可以像在HTML中正常使用Web字体一样使用它:

<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>

用 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


在执行类似上面的操作之前,请按照以下步骤进行 https://github.com/dompdf/dompdf#Font_Installation - Sri Harsha
它好像可以用了。我使用Noto Sans SC出现了缺失的中文字符,而且拉丁字符之间的距离非常遥远。 - NateS

10
Dompdf的关于字体和字符编码中提到了字体工具的包含,但没有告诉你如何获取并运行它。以下是操作步骤:
  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

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

这个可以。我只需要在 dompdf_font_family_cache.dist 中添加已加载的字体即可。谢谢。 - Khay Leng
这对我也起作用,但请点击此处查看详细描述:https://stackoverflow.com/a/54209787/5339927 - undefined

8

我在实现自定义字体方面遇到了很多困难。

我找到了一个简单且有效的解决方案。所有的功劳都归于https://peterdev.pl/how-to-set-a-font-in-pdf/

如果您使用composer安装了dompdf,那么这就是您需要做的:

$html = '<style type="text/Css">
      @font-face {
         font-family: "Muli";
         font-style: normal;
         font-weight: normal;
      }

      div{ 
         font-family: "Muli";
      }
   </style>

    <div>My PDF File in Muli</div>';

$fontDirectory = '/var/www/html/fonts'; //change to the diretory where you fonts is located on your server
$options = new Dompdf\Options();
$options->setChroot($fontDirectory);

$dompdf = new Dompdf\Dompdf($options);
$dompdf->getFontMetrics()->registerFont(
        ['family' => 'Muli', 'style' => 'normal', 'weight' => 'normal'],
        $fontDirectory . '/muli-v20-latin-regular.ttf'
); // you have to set the style (e.g. italic) and weight (e.g. bold)
$dompdf->loadHtml($html);
$dompdf->render();

Dompdf将字体保存在以下目录中:

vendor/dompdf/dompdf/lib/fonts

您的脚本需要对此目录具有写访问权限(chmod 775和chown www-data:www-data应该可以工作)。

就是这样。希望它也对您有用 :)


1
如果您正在使用barryvdh/laravel-dompdf,请使用 $pdf = App.make('dompdf.wrapper'); $pdf = getDomPDF()->getFontMetrics()..... - user783388

5

以下是2022年的做法:

使用composer安装dompdf/dompdf:^1.2


use Dompdf\Dompdf;

require '../vendor/autoload.php';

$html = <<<HTML
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="https://fonts.googleapis.com/css2?family=Montserrat&display=swap" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Tangerine&display=swap" rel="stylesheet" />
<style>

.m {
    font-family: 'Montserrat';
}

.t {
    font-family: 'Tangerine';
}

</style>
</head>
<body>
    <p class="m">
        Montserrat
    </p>
    <p class="t">
        Tangerine
    </p>
</body>
</html>
HTML
;

//$_dompdf_show_warnings = true;
//$_dompdf_debug = true;

$tmp = sys_get_temp_dir();

$dompdf = new Dompdf([
    'logOutputFile' => '',
    // authorize DomPdf to download fonts and other Internet assets
    'isRemoteEnabled' => true,
    // all directories must exist and not end with /
    'fontDir' => $tmp,
    'fontCache' => $tmp,
    'tempDir' => $tmp,
    'chroot' => $tmp,
]);

$dompdf->loadHtml($html);

$dompdf->render();

$dompdf->stream('hello.pdf', [
    'compress' => true,
    'Attachment' => false,
]);

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. 现在,再次单击[Authenticate to access this section][2],它会要求输入用户名和密码。输入第一步中给出的用户名和密码。

  3. 如果您在浏览器中再次浏览相同的fonts.php路径,则可以在页面底部找到安装新字体部分(如图所示)install new fonts。(但是,我首先将我的rockwell.ttf和rockwell.afm文件移动到了fonts文件夹中,然后在此处安装)

  4. 选择所需的字体ttf文件,然后安装它。它已安装并显示在已安装的字体中,但对我无效。因此,我不得不为我的新字体创建.afm文件。(我想使用rockwell字体)

我创建 rockwell.afm 文件所做的步骤。

我像为 dompdf 创建其他 14 种原生字体一样操作,我不确定这是否可接受,但对我而言它有效。我只是想把它完成。

  • 我在 php 文件中发现 dompdf 原生字体名称的任何位置添加了我的 rockwell 字体。

  • 在 dompdf/include/dompdf.cls.php 文件中的 public static $native_fonts 数组中添加了 "rockwell"。

  • 在 dompdf/lib/fonts/dompdf_font_family_cache.dist.php 文件中添加了 "rockwell" 数组,如下所示:adding rockwell array

就是这样。它为我生成了 rockwell.afm 文件,如下图所示:rockwell afm file

  • just use whatever font family you want to use like

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

如果您的原始文档是UTF8编码,您就不需要AFM文件。dompdf团队推荐使用UTF8编码,因为它提供了最好的字符支持。可能会有一些情况下默认编码(Windows ANSI)更受欢迎,但这种情况很少见。因此,目前加载字体只会生成UFM文件。 - BrianS
请注意,我不会将您的字体添加到$native_fonts数组中,也不会修改任何类库以添加您的字体。我也不会修改dompdf_font_family_cache.dist.php文件。应该有一个类似的文件没有.dist扩展名,其中包含您的字体信息。如果这种情况没有发生,则安装过程出现了问题。 - BrianS
否则是一个不错的逐步指南。 - BrianS

1
你需要使用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();

1
您需要在DomPDF中加载字体。有关详细信息,请查看此页面

实际上,我建议参考Unicode How-toAbout Fonts - BrianS

1
可能在DOMPDF中使用自定义字体的最简单方法就是像在标准HTML文档中那样链接它的源代码。下面的示例完美地工作-支持拉丁扩展字符并正确解释UTF-8。
请参考以下示例:

<head>
  <meta http-equiv="Content-Type" content="charset=utf-8" />
  <link href='https://fonts.googleapis.com/css?family=Barlow&subset=latin-ext' rel='stylesheet'>
  <style>
    body {
        font-family: 'Barlow';
        font-size: 14px;
    }
  </style>
</head>


0

DOMPDF建议从storage/fonts/目录加载字体。您可以在config/dompdf.php中的defines数组中查看它,键为font_dir。 通过将我的字体文件复制并粘贴到storage/fonts目录中,我的问题得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接