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);
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较大。

浙公网安备 33010602011771号