100分 紧急求助,生成PDF格式文件,特殊字符显示为“?”,请高手指点

lucky8star 2010-08-17 10:07:22
我是使用第三方控件生成PDF文档。
第三方字体类部分源码为:
unit PdfFonts;

interface

uses
SysUtils, Classes, PdfDoc, PdfTypes;

const
TYPE1_FONT_STR_TABLE: array[0..2] of TPDF_STR_TBL =(
(KEY: 'Type'; VAL: 'Font'),
(KEY: 'Subtype'; VAL: 'Type1'),
(KEY: 'Encoding'; VAL: 'WinAnsiEncoding')
);

// Times definition

TIMES_ROMAN_W_ARRAY: array[32..255] of Integer = (
250,333,408,500,500,833,778,180,333,333,500,564,250,333,
250,278,500,500,500,500,500,500,500,500,500,500,278,278,564,564,
564,444,921,722,667,667,722,611,556,722,722,333,389,722,611,889,
722,722,556,722,667,556,611,722,722,944,722,722,611,333,278,333,
469,500,333,444,500,444,500,444,333,500,500,278,278,500,278,778,
500,500,500,500,333,389,278,500,500,722,500,500,444,480,200,480,
541,0,500,0,333,500,444,1000,500,500,333,1000,556,333,889,0,
611,0,0,333,333,444,444,350,500,1000,333,980,389,333,722,0,
444,722,0,333,500,500,500,500,200,500,333,760,276,500,564,0,
760,333,400,564,300,300,333,500,453,250,333,300,310,500,750,750,
750,444,722,722,722,722,722,722,889,667,611,611,611,611,333,333,
333,333,722,722,722,722,722,722,722,564,722,722,722,722,722,722,
556,500,444,444,444,444,444,444,667,444,444,444,444,444,278,278,
278,278,500,500,500,500,500,500,500,564,500,500,500,500,500,500,
500,500);

TIMES_INT_TABLE: array[0..1] of TPDF_INT_TBL = (
(KEY: 'FirstChar'; VAL: 32),
(KEY: 'LastChar'; VAL: 255)
);

TIMES_DISC_STR_TABLE: array[0..2] of TPDF_STR_TBL =(
(KEY: 'Type'; VAL: 'FontDescriptor'),
(KEY: 'FontName'; VAL: 'Type1'),
(KEY: 'Encoding'; VAL: 'WinAnsiEncoding')
);

TIMES_DISC_INT_TABLE: array[0..6] of TPDF_INT_TBL =(
(KEY: 'Ascent'; VAL: 891),
(KEY: 'CapHeight'; VAL: 891),
(KEY: 'Descent'; VAL: -216),
(KEY: 'Flags'; VAL: PDF_FONT_STD_CHARSET +
PDF_FONT_SERIF),
(KEY: 'ItalicAngle'; VAL: 0),
(KEY: 'StemV'; VAL: 78),
(KEY: 'MissingWidth'; VAL: 778)
);

TIMES_BBOX: array[0..3] of Integer = (-168,-218,1000,898);


type
TPdfType1Font = class(TPdfFont)
private
FFirstChar: Byte;
FLastChar: Byte;
FArray: array[0..255] of Word;
public
procedure SetData(Value: TPdfDictionary); override;
function GetCharWidth(AText: string; APos: integer): integer; override;
end;

TPdfTimesRoman = class(TPdfType1Font)
public
constructor Create(AXref: TPdfXref; AName: string); override;
end;

TPdfTimesBold = class(TPdfType1Font)
public
constructor Create(AXref: TPdfXref; AName: string); override;
end;

TPdfTimesItalic = class(TPdfType1Font)
public
constructor Create(AXref: TPdfXref; AName: string); override;
end;

TPdfTimesBoldItalic = class(TPdfType1Font)
public
constructor Create(AXref: TPdfXref; AName: string); override;
end;

TPdfBatang = class(TPdfType1Font)
public
constructor Create(AXref: TPdfXref; AName: string); override;
end;




implementation

{ TPdfType1Font }
function TPdfType1Font.GetCharWidth(AText: string; APos: integer): integer;
begin
result := FArray[ord(AText[APos])];
end;

procedure TPdfType1Font.SetData(Value: TPdfDictionary);
var
i: integer;
DefaultWidth: Word;
Widths: TPdfArray;
begin
inherited SetData(Value);

// initialize char widths array by default value (if missing width parameter
// is defined, use it as default value.)
if Data.PdfNumberByName('MissingWidth') <> nil then
DefaultWidth := Data.PdfNumberByName('MissingWidth').Value
else
DefaultWidth := 0;
for i := 0 to 255 do
FArray[i] := DefaultWidth;

FFirstChar := Data.PdfNumberByName('FirstChar').Value;
FLastChar := Data.PdfNumberByName('LastChar').Value;

// fill width array with "Widths" table values.
Widths := Data.PdfArrayByName('Widths');
for i := 0 to Widths.ItemCount - 1 do
FArray[i + FFirstChar] := TPdfNumber(Widths.Items[i]).Value;
end;

{ FixedWidth }


{ TPdfTimesRoman }
constructor TPdfTimesRoman.Create(AXref: TPdfXref; AName: string);
var
FWidths: TPdfArray;
FFont: TPdfDictionary;
begin
inherited Create(AXref, AName);
FFont := TPdfDictionary.CreateDictionary(AXref);
AXref.AddObject(FFont);

AddStrElements(FFont, TYPE1_FONT_STR_TABLE);
AddIntElements(FFont, TIMES_INT_TABLE);
FFont.AddItem('BaseFont', TPdfName.CreateName('Times-Roman'));

FWidths := TPdfArray.CreateNumArray(AXref, TIMES_ROMAN_W_ARRAY);
FFont.AddInternalItem('Widths', FWidths);

SetData(FFont);
end;


{ TPdfBatang }
constructor TPdfBatang.Create(AXref: TPdfXref; AName: string);
var
FWidths: TPdfArray;
FFont: TPdfDictionary;
begin
inherited Create(AXref, AName);
FFont := TPdfDictionary.CreateDictionary(AXref);
AXref.AddObject(FFont);

AddStrElements(FFont, TYPE1_FONT_STR_TABLE);
AddIntElements(FFont, TIMES_INT_TABLE);
FFont.AddItem('BaseFont', TPdfName.CreateName('Batang'));

FWidths := TPdfArray.CreateNumArray(AXref, TIMES_ROMAN_W_ARRAY);
FFont.AddInternalItem('Widths', FWidths);

SetData(FFont);
end;

initialization


RegisterClassAlias(TPdfTimesRoman, 'Times-Roman');

RegisterClassAlias(TPdfBatang, 'Batang');

finalization

UnRegisterClass(TPdfTimesRoman);

UnRegisterClass(TPdfBatang);
end.

注解:TPdfBatang为字体Batang,是朝鲜字体,我操作系统上已经有了。我想在要把它加到这里面来。
现在是当我打开PDF的时候,会弹出一个对话框:字体Batang包含错误的/BBOX。我认为是上面类似
TIMES_ROMAN_W_ARRAY: array[32..255] of Integer = (
250,333,408,500,500,833,778,180,333,333,500,564,250,333,
250,278,500,500,500,500,500,500,500,500,500,500,278,278,564,564,
564,444,921,722,667,667,722,611,556,722,722,333,389,722,611,889,
722,722,556,722,667,556,611,722,722,944,722,722,611,333,278,333,
469,500,333,444,500,444,500,444,333,500,500,278,278,500,278,778,
500,500,500,500,333,389,278,500,500,722,500,500,444,480,200,480,
541,0,500,0,333,500,444,1000,500,500,333,1000,556,333,889,0,
611,0,0,333,333,444,444,350,500,1000,333,980,389,333,722,0,
444,722,0,333,500,500,500,500,200,500,333,760,276,500,564,0,
760,333,400,564,300,300,333,500,453,250,333,300,310,500,750,750,
750,444,722,722,722,722,722,722,889,667,611,611,611,611,333,333,
333,333,722,722,722,722,722,722,722,564,722,722,722,722,722,722,
556,500,444,444,444,444,444,444,667,444,444,444,444,444,278,278,
278,278,500,500,500,500,500,500,500,564,500,500,500,500,500,500,
500,500);

TIMES_INT_TABLE: array[0..1] of TPDF_INT_TBL = (
(KEY: 'FirstChar'; VAL: 32),
(KEY: 'LastChar'; VAL: 255)
);

TIMES_DISC_STR_TABLE: array[0..2] of TPDF_STR_TBL =(
(KEY: 'Type'; VAL: 'FontDescriptor'),
(KEY: 'FontName'; VAL: 'Type1'),
(KEY: 'Encoding'; VAL: 'WinAnsiEncoding')
);

TIMES_DISC_INT_TABLE: array[0..6] of TPDF_INT_TBL =(
(KEY: 'Ascent'; VAL: 891),
(KEY: 'CapHeight'; VAL: 891),
(KEY: 'Descent'; VAL: -216),
(KEY: 'Flags'; VAL: PDF_FONT_STD_CHARSET +
PDF_FONT_SERIF),
(KEY: 'ItalicAngle'; VAL: 0),
(KEY: 'StemV'; VAL: 78),
(KEY: 'MissingWidth'; VAL: 778)
);

TIMES_BBOX: array[0..3] of Integer = (-168,-218,1000,898);

这样的代码,我没有对 Batang 添加导致的,但是我又不知道对应的数值时多少。请高手帮帮忙,急需解决!
...全文
327 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lucky8star 2010-08-26
  • 打赏
  • 举报
回复
没有大家清楚如何包含字体吗
其中控件对字体
TIMES_ROMAN_W_ARRAY: array[32..255] of Integer = (
250,333,408,500,500,833,778,180,333,333,500,564,250,333,
250,278,500,500,500,500,500,500,500,500,500,500,278,278,564,564,
564,444,921,722,667,667,722,611,556,722,722,333,389,722,611,889,
722,722,556,722,667,556,611,722,722,944,722,722,611,333,278,333,
469,500,333,444,500,444,500,444,333,500,500,278,278,500,278,778,
500,500,500,500,333,389,278,500,500,722,500,500,444,480,200,480,
541,0,500,0,333,500,444,1000,500,500,333,1000,556,333,889,0,
611,0,0,333,333,444,444,350,500,1000,333,980,389,333,722,0,
444,722,0,333,500,500,500,500,200,500,333,760,276,500,564,0,
760,333,400,564,300,300,333,500,453,250,333,300,310,500,750,750,
750,444,722,722,722,722,722,722,889,667,611,611,611,611,333,333,
333,333,722,722,722,722,722,722,722,564,722,722,722,722,722,722,
556,500,444,444,444,444,444,444,667,444,444,444,444,444,278,278,
278,278,500,500,500,500,500,500,500,564,500,500,500,500,500,500,
500,500);
这样描述,有谁知道每个字体对应的数组以及_BBOX是多少啊
从未对字体有过多的了解,请这方面的高手帮帮忙啊,我可以在开一个帖子追加分。
lucky8star 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kye_jufei 的回复:]
使用POWER PDF把字體包進去...
[/Quote]
兄弟能否说的详细点,如何包进去啊。我可以在追加100分
kye_jufei 2010-08-18
  • 打赏
  • 举报
回复
使用POWER PDF把字體包進去...
lucky8star 2010-08-18
  • 打赏
  • 举报
回复
谢谢楼上几位答复。的确是字体的问题。我使用的这个控件不支持朝鲜体。Batang 是朝鲜体的一种。
如果参照我使用的控件中那种定义字体的写法,我该如何写呢。现在就是因为碰到一个音乐特殊符号,
在Batang字体下才能输出来。现在不知道有没有高手自定义过呢?
亮剑_ 2010-08-17
  • 打赏
  • 举报
回复
同意1楼,就是字体没有打包进PDF的原因
fenshm 2010-08-17
  • 打赏
  • 举报
回复
控件编码有问题~!
kye_jufei 2010-08-17
  • 打赏
  • 举报
回复
肯定是字體問題,曾經在作CXGRID導出自定義議的PDF報表時,使用了三方控件:如POWERPDF、FR自帶的、還有DELPHI自帶的TLB_PDFREADER,都未解決字體的問題。。。最後使用PDFCTROLTOKIT解決了。。。


你可以使用這個控件,一位網友提供的,解析也不錯: http://www.pudn.com/downloads162/sourcecode/delphi_control/detail737817.html

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧