100分 紧急求助,生成PDF格式文件,特殊字符显示为“?”,请高手指点
我是使用第三方控件生成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 添加导致的,但是我又不知道对应的数值时多少。请高手帮帮忙,急需解决!