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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1215016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!