秋·风

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  278 随笔 :: 0 文章 :: 308 评论 :: 20万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

posted on   秋·风  阅读(905)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2014-06-30 修改delphi xe6 FMX Label字体颜色
点击右上角即可分享
微信分享提示