在2ccc论坛上有人提问说怎样解决pdfium中文乱码,盒子论坛 v2.1 (2ccc.com)的dbyoung给出的解决方案:
将PDFium.pas的TPdf.AddText 函数中:
TextObject:=FPDFPageObj_NewTextObj(Document,FPDF_BYTESTRING(AnsiString(Font)),FontSize); 注释掉,修改为:
procedure TPdf.AddText(const Text, Font: WString; FontSize: Single; X, Y: Double; Color: TColor; Alpha: Byte); var TextObject: FPDF_PAGEOBJECT; fontStream:TMemoryStream; ARGB: FPDF_DWORD; dFont:FPDF_FONT; begin CheckPageActive; fontStream:= TMemoryStream.Create; fontStream.LoadFromFile('c:\Windows\fonts\simhei.ttf'); // 宋体字体文件名称 dFont:=FPDFText_LoadFont(Document,fontStream.Memory,fontStream.Size,FPDF_FONT_TRUETYPE,1); TextObject:=FPDFPageObj_CreateTextObj(Document, dFont, FontSize); FreeAndNil(fontStream); // TextObject := FPDFPageObj_NewTextObj(Document, FPDF_BYTESTRING(AnsiString(Font)), FontSize); CheckPdf(TextObject <> nil, 'Cannot create text object'); CheckPdf(FPDFText_SetText(TextObject, FPDF_WIDESTRING(WideString(Text))) <> 0, 'Cannot set text'); ARGB := ColorToARGB(Color, Alpha); CheckPdf(FPDFPageObj_SetFillColor(TextObject, FPDF_GetRValue(ARGB), FPDF_GetGValue(ARGB), FPDF_GetBValue(ARGB), FPDF_GetAValue(ARGB)) <> 0, 'Cannot set color'); FPDFPageObj_Transform(TextObject, 1, 0, 0, 1, X, Y); FPDFPage_InsertObject(Page, TextObject); UpdatePage; end;
生成pdf中文demo源码(lazarus):
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs,PDFium; type { TForm1 } TForm1 = class(TForm) Pdf1: TPdf; procedure FormCreate(Sender: TObject); private public end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); var Annotation: TPdfAnnotation; begin try Pdf1.CreateDocument; Pdf1.AddPage(1, 400, 300); Pdf1.CreatePath(20, 20, fmAlternate, clYellow, $FF, True, clBlack, $FF, 0.5); Pdf1.LineTo(20, 280); Pdf1.LineTo(380, 280); Pdf1.LineTo(380, 20); Pdf1.ClosePath; Pdf1.AddPath; Pdf1.CreatePath(40, 60, fmWinding, clGreen, $FF, True, clWhite, $FF, 2.0); Pdf1.BezierTo(100, 120, 200, 120, 200, 220); Pdf1.MoveTo(40, 60); Pdf1.BezierTo(100, 120, 100, 220, 200, 220); Pdf1.AddPath; Pdf1.CreatePath(200, 80, fmWinding, clRed, $FF, True, clWhite, $FF, 1.0); Pdf1.LineTo(340, 80); Pdf1.LineTo(270, 180); Pdf1.ClosePath; Pdf1.AddPath; Pdf1.AddText(utf8toansi('测试中文abcd'), '宋体', 20, 70, 50); // Pdf1.AddPicture(Image.Picture, 320, 220); //ZeroMemory(@Annotation, SizeOf(Annotation)); Annotation.AuthorText := 'Author'; Annotation.ContentsText := 'Hello!'; Annotation.Subtype := anText; Annotation.Rectangle.Left := 270; Annotation.Rectangle.Top := 60; Annotation.Rectangle.Right := 280; Annotation.Rectangle.Bottom := 50; Pdf1.CreateAnnotation(Annotation); Pdf1.SaveAs('document.pdf'); finally Pdf1.Active := False; end; end; end.
生成的PDF可以显示中文了:
这个解决方案的缺点是生成的PDF嵌入字体,生成的PDF较大。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2014-06-30 修改delphi xe6 FMX Label字体颜色