在Linux上使用FastReport生成PDF出现文本内容换行无效,这是由于fastReport调用Graphics.DrawString绘制文字,而在Linux系统中Graphics.DrawString则调用mono实现的libgdiplus库,最终问题就是libgdiplus库实现有问题,这样不光FastReport有问题,凡是调用Graphics.DrawString绘制文字都会有问题。
解决方法
需要自己使用Pango重新编译libgdiplus库
安装依赖
sudo apt-get install libgif-dev autoconf libtool automake build-essential gettext libglib2.0-dev libcairo2-dev libtiff-dev libexif-dev libpango1.0-dev
获取libgdiplus源码
git clone https://github.com/mono/libgdiplus.git
编译
./autogen.sh --with-pango --prefix=/usr
make
- 安装或替换
sudo make install
或者把编译的libgdiplus.so.0.0.0
文件复制到/usr/lib
目录中,注意手动复制的可能需要修改文件权限chmod 644 /usr/lib/libgdiplus.so.0.0.0
- 如果需要拷贝到其他系统使用,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) 。