Laravel DomPdf 添加自定义字体

12

我正在尝试在Laravel的Dompdf中使用OLD English字体。我已经将字体插入到Laravel视图中。但是,当生成PDF时似乎没有起作用。我尝试编辑dompdf >vendor >.../dompdf_font_family_cache.dist.php文件,但没有运气。

有人能建议一个解决方案吗?

提前感谢。


在这里找到了一个解决方案(https://dev59.com/CWAf5IYBdhLWcg3wqELp),这能帮到你吗! - Shailesh Ladumor
@ShaileshLadumor。 不,它没有帮助。 - maxasela
你不应该直接编辑那个文件。最简单的方法是使用@font-face声明。你在评论中指出你已经尝试过这个...你应该更新你的问题,以便我们可以看到你尝试了什么。正在运行的进程是否具有对存储/字体目录的读写访问权限,这是laravel-dompdf的默认设置(参考)? - BrianS
6个回答

34
  1. 在Laravel项目的storage目录下创建一个名为fonts的文件夹 ( storage/fonts )
  2. 将你的 .otf 或 .ttf 文件放置于 storage/fonts 目录中。
  3. 利用 Laravel 提供的 storage_path 方法,在视图/HTML 中添加 @font-face 规则。

@font-face {
    font-family: 'Your custom font name';
    src: url({{ storage_path('fonts\your-custom-font.ttf') }}) format("truetype");
    font-weight: 400; // use the matching font-weight here ( 100, 200, 300, 400, etc).
    font-style: normal; // use the matching font-style here
}
  • 在你的 CSS 中添加如下所示的字体族规则

  • body {
        font-family: "Your custom font name";
    }
    

    希望这能有所帮助。


    1
    对我来说,出于某种原因,它不起作用。我检查了字体文件,它是存在的。 - guyaloni
    是的,它是一个.ttf文件。 - guyaloni
    这个方法可以使用,但我还需要为domPDF定义“chroot”选项,以使其能够正常工作:$options->set('chroot', storage_path()); - waffl
    1
    如果您使用GIT,您还应该检查storag/fonts文件夹(但不是文件),例如添加一个.gitignore文件,其中包含以下内容: * (换行) !.gitignore - Patrick Schmidt
    还要确保您自定义的 font-family 不包含空格,否则由于某些原因可能无法正常工作。 - NoOorZ24
    显示剩余4条评论

    6

    我也尝试了添加自定义字体。我在视图中添加了字体(使用@font-face声明),但是当我尝试生成pdf时,它会在AdobeFontMetrics.php中给我一个ErrorException。 我通过在laravel项目的storage文件夹中创建一个字体文件夹来解决这个问题。 现在我的目录结构如下:

    > storage
        > app
        > fonts
        > framework
        > logs
    

    我希望这能有所帮助


    2

    将字体文件放置在storage/fonts文件夹中。

    例如,我的OpenSans字体文件存储在storage/fonts/文件夹中。

    你也可以从GoogleFonts下载Open Sans字体文件。

    最后,在HTML文件中添加以下样式标签即可。

    <style>
              
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-Bold.ttf") }}) format("truetype");
                    font-weight: 700;
                    font-style: normal;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-BoldItalic.ttf") }}) format("truetype");
                    font-weight: 700;
                    font-style: italic;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-ExtraBold.ttf") }}) format("truetype");
                    font-weight: 800;
                    font-style: normal;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-ExtraBoldItalic.ttf") }}) format("truetype");
                    font-weight: 800;
                    font-style: italic;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-Light.ttf") }}) format("truetype");
                    font-weight: 300;
                    font-style: normal;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-LightItalic.ttf") }}) format("truetype");
                    font-weight: 300;
                    font-style: italic;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-Medium.ttf") }}) format("truetype");
                    font-weight: 500;
                    font-style: normal;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-MediumItalic.ttf") }}) format("truetype");
                    font-weight: 500;
                    font-style: italic;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-Regular.ttf") }}) format("truetype");
                    font-weight: 400;
                    font-style: normal;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-SemiBold.ttf") }}) format("truetype");
                    font-weight: 600;
                    font-style: normal;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-SemiBoldItalic.ttf") }}) format("truetype");
                    font-weight: 600;
                    font-style: italic;
                }
        
                @font-face {
                    font-family: 'Open Sans';
                    src: url({{ storage_path("fonts/static/OpenSans/OpenSans-Italic.ttf") }}) format("truetype");
                    font-weight: 400;
                    font-style: italic;
                }
        
                body {
                    font-family: 'Open Sans', sans-serif;
                }
    </style>
    

    2
    @font-face {
    font-family: 'Journal';
    src: url('yourwebsite.com/journal.ttf")}}') format('truetype');
    }
    .typed {
    font-family: 'Journal';
    }
    <p class='typed'>Signature</p>
    

    请确保将您的字体名称放在这样的位置font: Journal; 这将起作用。
    此外,在您的存储文件夹下添加字体文件夹。

    1
    Set font into html page which is load in Dompdf
        <html>
        <head>
          <style>
          @font-face {
            font-family: 'Helvetica';
            font-weight: normal;
            font-style: normal;
            font-variant: normal;
            src: url("font url");
          }
          body {
            font-family: Helvetica, sans-serif;
          }
          </style>
        </head>
        <body>
          <p>hello world</p>
        </body>
        </html>
    

    有人找到答案了吗? - maxasela
    无法工作。谢谢。 - maxasela
    1
    我明白了,你有一个解决方案...为了让大家受益,你应该添加一个答案,说明你是如何解决问题的。 - BrianS
    谢谢您 @BrianS 不,我没有解决方案。尽管我已经找到了一个替代方案(与Laravel无关)。我创建了一个默认包含表头和账单表格的打印布局,并使用CSS样式和Dompdf中的空格来保持事物的有序性,而不是一次性全部打印。 :D - maxasela
    有人找到解决方案了吗? - Mau España

    0

    我曾经遇到过同样的问题,但是我通过一行代码解决了它。 如果你查看Dompdf的定义,它提供了setOption方法供使用。

    你需要在你的控制器中更新这段代码。

     $pdf = PDF::loadView('promo-template.pdf', compact('data'))
                ->setOption('fontDir', public_path('/fonts'));
    

    它将在字体目录中生成一个installed-fonts.json文件。 输入图像描述

    在您的style.css中包含您的字体,它将自动获取自定义字体并为其创建JSON文件。


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