C:\Users\Administrator\Desktop\Delphi\CreatePdf
[记录一下]pdfium中文乱码(2ccc论坛的问题) - 秋·风 - 博客园
将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);
varTextObject: FPDF_PAGEOBJECT;fontStream:TMemoryStream;ARGB: FPDF_DWORD;dFont:FPDF_FONT;
beginCheckPageActive;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+}interfaceusesClasses, SysUtils, Forms, Controls, Graphics, Dialogs,PDFium;type{ TForm1 }TForm1 = class(TForm)Pdf1: TPdf;procedure FormCreate(Sender: TObject);privatepublicend;varForm1: TForm1;implementation{$R *.lfm}{ TForm1 }procedure TForm1.FormCreate(Sender: TObject);
var Annotation: TPdfAnnotation;
begintryPdf1.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');finallyPdf1.Active := False;end;end;end.
生成的PDF可以显示中文了:

这个解决方案的缺点是生成的PDF嵌入字体,生成的PDF较大。

