取消

Linux上FastReport生成PDF换行错误

在Linux上使用FastReport生成PDF出现文本内容换行无效,这是由于fastReport调用Graphics.DrawString绘制文字,而在Linux系统中Graphics.DrawString则调用mono实现的libgdiplus库,最终问题就是libgdiplus库实现有问题,这样不光FastReport有问题,凡是调用Graphics.DrawString绘制文字都会有问题。


解决方法

需要自己使用Pango重新编译libgdiplus库

  1. 安装依赖 sudo apt-get install libgif-dev autoconf libtool automake build-essential gettext libglib2.0-dev libcairo2-dev libtiff-dev libexif-dev libpango1.0-dev

  2. 获取libgdiplus源码 git clone https://github.com/mono/libgdiplus.git

  3. 编译

 ./autogen.sh --with-pango --prefix=/usr
 make
  1. 安装或替换

sudo make install 或者把编译的libgdiplus.so.0.0.0文件复制到/usr/lib目录中,注意手动复制的可能需要修改文件权限chmod 644 /usr/lib/libgdiplus.so.0.0.0

  1. 如果需要拷贝到其他系统使用,libgdiplus还有依赖其他库,可以通过ldd usr/lib/libgdiplus.so.0.0.0查看对应的依赖并安装,你也可以直接安装以下两个库就可以了

apt-get install -y libcairo2 libpango1.0


测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System.Drawing;
internal class Program
{

    static void Main(string[] args)
    {
        var width = 50;
        var height = 400;
        var pageBitmap = new Bitmap(width, height);
        var pageGraphics = Graphics.FromImage(pageBitmap);

        // Create font and brush.
        var drawFont = new Font("宋体", 11);
        var drawBrush = new SolidBrush(Color.Black);
        // Set format of string.
        var drawString = "这是一段测试文本";
        var drawFormat = new StringFormat();
        drawFormat.FormatFlags = 0;//StringFormatFlags.NoWrap;
        drawFormat.Trimming = StringTrimming.Word;
        // Draw string to screen.
        pageGraphics.DrawString(drawString, drawFont, drawBrush, new Rectangle(0, 0, 50, 400), drawFormat);
        pageBitmap.Save("a.jpg");
    }
}

在项目文件中添加System.Drawing.Common引用

1
2
3
  <ItemGroup>
    <PackageReference Include="System.Drawing.Common" Version="5.0.3" />
  </ItemGroup>

参考资料

本文会经常更新,请阅读原文: https://dashenxian.github.io/post/Linux%E4%B8%8AFastReport%E7%94%9F%E6%88%90PDF%E6%8D%A2%E8%A1%8C%E9%94%99%E8%AF%AF ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 小神仙 (包含链接: https://dashenxian.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (125880321@qq.com)

登录 GitHub 账号进行评论