📄 frxpdffile.pas
字号:
Write('/afii57414/afii57415/afii57416/afii57417/afii57418/afii57419');
Write('/afii57420/afii57421/afii57422/afii57423/afii57424/afii57425');
Write('/afii57426/afii57427/afii57428/afii57429/afii57430');
Write(' 216 /afii57431/afii57432/afii57433/afii57434/afii57440');
Write('/afii57441/afii57442/afii57443/afii57444');
Write(' 227 /afii57445/afii57446/afii57470/afii57448/afii57449');
Write('/afii57450 240 /afii57451/afii57452/afii57453/afii57454');
Write('/afii57455/afii57456 248 /afii57457 250 /afii57458');
Write(' 253 /afii299/afii300/afii57519]');
WriteLn('>>');
end;
BALTIC_CHARSET:
begin
WriteLn('/Encoding <</Type/Encoding /BaseEncoding /WinAnsiEncoding');
Write('/Differences [ 128 /Euro /space /quotesinglbase /space /quotedblbase');
Write(' /ellipsis /dagger /daggerdbl /space /perthousand');
Write(' /space /guilsinglleft /space /dieresis /caron');
Write(' /cedilla /space /quoteleft /quoteright /quotedblleft');
Write(' /quotedblright /bullet /endash /emdash /space /trademark');
Write(' /space /guilsinglright /space /macron /ogonek /space');
Write(' 170 /Rcommaaccent 175 /AE 184 /oslash 186 /rcommaaccent');
Write(' 191 /ae /Aogonek /Iogonek /Amacron /Cacute 198 /Eogonek');
Write(' /Emacron /Ccaron 202 /Zacute /Edotaccent /Gcommaaccent');
Write(' /Kcommaaccent /Imacron /Lcommaaccent /Scaron /Nacute');
Write(' /Ncommaaccent /trademark /Omacron 216 /Uogonek /Lslash');
Write(' /Sacute /Umacron 221 /Zdotaccent /Zcaron 224 /aogonek');
Write(' /iogonek /amacron /cacute 230 /eogonek /emacron /ccaron');
Write(' 234 /zacute /edotaccent /gcommaaccent /kcommaaccent');
Write(' /imacron /lcommaaccent /scaron /nacute /ncommaaccent');
Write(' 244 /omacron 248 /uogonek /lslash /OE /umacron 253');
Write(' /zdotaccent /zcaron /dotaccent ]');
WriteLn('>>');
end;
VIETNAMESE_CHARSET:
begin
WriteLn('/Encoding <</Type/Encoding /BaseEncoding /WinAnsiEncoding');
Write('/Differences [128 /Euro 142 /Zcaron 158 /zcaron]');
WriteLn('>>');
end;
CHINESEBIG5_CHARSET: {136}
begin
WriteLn('/DescendantFonts [' + IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 R]');
WriteLn('/Encoding /ETenms-B5-H');
WriteLn('>>');
WriteLn('endobj');
Flush(Stream);
Parent.XRefAdd(Stream);
WriteLn(IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 obj');
WriteLn('<<');
WriteLn('/Type /Font');
WriteLn('/Subtype');
WriteLn('/CIDFontType2');
WriteLn('/BaseFont /'+ EncodeFontName(FontName));
WriteLn('/WinCharSet 136');
Write('/FontDescriptor ');
WriteLn('<<');
WriteLn('/Type /FontDescriptor');
if Parent.FEmbedded then
WriteLn('/FontFile2 ' + IntToStr(Index + 2 + Parent.FStartFonts) + ' 0 R');
WriteLn('/FontName /' + EncodeFontName(FontName));
WriteLn('/Flags 7');
WriteLn('/FontBBox [' + IntToStr(pm^.otmrcFontBox.Left) + ' '+ IntToStr(pm^.otmrcFontBox.Bottom) + ' '+ IntToStr(pm^.otmrcFontBox.Right) + ' '+ IntToStr(pm^.otmrcFontBox.Top) + ' ]');
WriteLn('/Style << /Panose <010502020300000000000000> >>');
WriteLn('/Ascent ' + IntToStr(pm^.otmAscent));
WriteLn('/Descent ' + IntToStr(pm^.otmDescent));
WriteLn('/CapHeight ' + IntToStr(pm^.otmTextMetrics.tmHeight));
WriteLn('/StemV ' + IntToStr(50 + Round(sqr(pm^.otmTextMetrics.tmWeight / 65))));
WriteLn('/ItalicAngle ' + IntToStr(pm^.otmItalicAngle));
WriteLn('>>');
WriteLn('/CIDSystemInfo');
WriteLn('<<');
WriteLn('/Registry(Adobe)');
WriteLn('/Ordering(CNS1)');
WriteLn('/Supplement 0');
WriteLn('>>');
WriteLn('/DW 1000');
WriteLn('/W [1 95 500]');
WriteLn('>>');
WriteLn('endobj');
end;
GB2312_CHARSET: {134}
begin
WriteLn('/DescendantFonts [' + IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 R]');
WriteLn('/Encoding /GB-EUC-H');
WriteLn('>>');
WriteLn('endobj');
Flush(Stream);
Parent.XRefAdd(Stream);
WriteLn(IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 obj');
WriteLn('<<');
WriteLn('/Type /Font');
WriteLn('/Subtype');
WriteLn('/CIDFontType2');
WriteLn('/BaseFont /'+ EncodeFontName(FontName));
WriteLn('/WinCharSet 134');
Write('/FontDescriptor ');
WriteLn('<<');
WriteLn('/Type /FontDescriptor');
if Parent.FEmbedded then
WriteLn('/FontFile2 ' + IntToStr(Index + 2 + Parent.FStartFonts) + ' 0 R');
WriteLn('/FontName /' + EncodeFontName(FontName));
WriteLn('/Flags 6');
WriteLn('/FontBBox [' + IntToStr(pm^.otmrcFontBox.Left) + ' '+ IntToStr(pm^.otmrcFontBox.Bottom) + ' '+ IntToStr(pm^.otmrcFontBox.Right) + ' '+ IntToStr(pm^.otmrcFontBox.Top) + ' ]');
WriteLn('/Style << /Panose <010502020400000000000000> >>');
WriteLn('/Ascent ' + IntToStr(pm^.otmAscent));
WriteLn('/Descent ' + IntToStr(pm^.otmDescent));
WriteLn('/CapHeight ' + IntToStr(pm^.otmTextMetrics.tmHeight));
WriteLn('/StemV ' + IntToStr(50 + Round(sqr(pm^.otmTextMetrics.tmWeight / 65))));
WriteLn('/ItalicAngle ' + IntToStr(pm^.otmItalicAngle));
WriteLn('>>');
WriteLn('/CIDSystemInfo');
WriteLn('<<');
WriteLn('/Registry(Adobe)');
WriteLn('/Ordering(GB1)');
WriteLn('/Supplement 2');
WriteLn('>>');
WriteLn('/DW 1000');
WriteLn('/W [ 1 95 500 814 939 500 7712 [ 500 ] 7716 [ 500 ] ]');
WriteLn('>>');
WriteLn('endobj');
end;
SHIFTJIS_CHARSET: {80}
begin
WriteLn('/DescendantFonts [' + IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 R]');
WriteLn('/Encoding /90msp-RKSJ-H');
WriteLn('>>');
WriteLn('endobj');
Flush(Stream);
Parent.XRefAdd(Stream);
WriteLn(IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 obj');
WriteLn('<<');
WriteLn('/Type /Font');
WriteLn('/Subtype');
WriteLn('/CIDFontType2');
WriteLn('/BaseFont /'+ EncodeFontName(FontName));
WriteLn('/WinCharSet 80');
Write('/FontDescriptor ');
WriteLn('<<');
WriteLn('/Type /FontDescriptor');
if Parent.FEmbedded then
WriteLn('/FontFile2 ' + IntToStr(Index + 2 + Parent.FStartFonts) + ' 0 R');
WriteLn('/FontName /' + EncodeFontName(FontName));
WriteLn('/Flags 6');
WriteLn('/FontBBox [' + IntToStr(pm^.otmrcFontBox.Left) + ' '+ IntToStr(pm^.otmrcFontBox.Bottom) + ' '+ IntToStr(pm^.otmrcFontBox.Right) + ' '+ IntToStr(pm^.otmrcFontBox.Top) + ' ]');
WriteLn('/Style << /Panose <010502020400000000000000> >>');
WriteLn('/Ascent ' + IntToStr(pm^.otmAscent));
WriteLn('/Descent ' + IntToStr(pm^.otmDescent));
WriteLn('/CapHeight ' + IntToStr(pm^.otmTextMetrics.tmHeight));
WriteLn('/StemV ' + IntToStr(50 + Round(sqr(pm^.otmTextMetrics.tmWeight / 65))));
WriteLn('/ItalicAngle ' + IntToStr(pm^.otmItalicAngle));
WriteLn('>>');
WriteLn('/CIDSystemInfo');
WriteLn('<<');
WriteLn('/Registry(Adobe)');
WriteLn('/Ordering(Japan1)');
WriteLn('/Supplement 2');
WriteLn('>>');
WriteLn('/DW 1000');
WriteLn('/W [ 1 95 500 231 632 500 ]');
WriteLn('>>');
WriteLn('endobj');
end;
HANGEUL_CHARSET: {129}
begin
WriteLn('/DescendantFonts [' + IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 R]');
WriteLn('/Encoding /KSCms-UHC-H');
WriteLn('>>');
WriteLn('endobj');
Flush(Stream);
Parent.XRefAdd(Stream);
WriteLn(IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 obj');
WriteLn('<<');
WriteLn('/Type /Font');
WriteLn('/Subtype');
WriteLn('/CIDFontType2');
WriteLn('/BaseFont /'+ EncodeFontName(FontName));
WriteLn('/WinCharSet 129');
Write('/FontDescriptor ');
WriteLn('<<');
WriteLn('/Type /FontDescriptor');
if Parent.FEmbedded then
WriteLn('/FontFile2 ' + IntToStr(Index + 2 + Parent.FStartFonts) + ' 0 R');
WriteLn('/FontName /' + EncodeFontName(FontName));
WriteLn('/Flags 6');
WriteLn('/FontBBox [' + IntToStr(pm^.otmrcFontBox.Left) + ' '+ IntToStr(pm^.otmrcFontBox.Bottom) + ' '+ IntToStr(pm^.otmrcFontBox.Right) + ' '+ IntToStr(pm^.otmrcFontBox.Top) + ' ]');
WriteLn('/Style << /Panose <010502020400000000000000> >>');
WriteLn('/Ascent ' + IntToStr(pm^.otmAscent));
WriteLn('/Descent ' + IntToStr(pm^.otmDescent));
WriteLn('/CapHeight ' + IntToStr(pm^.otmTextMetrics.tmHeight));
WriteLn('/StemV ' + IntToStr(50 + Round(sqr(pm^.otmTextMetrics.tmWeight / 65))));
WriteLn('/ItalicAngle ' + IntToStr(pm^.otmItalicAngle));
WriteLn('>>');
WriteLn('/CIDSystemInfo');
WriteLn('<<');
WriteLn('/Registry(Adobe)');
WriteLn('/Ordering(Korea1)');
WriteLn('/Supplement 1');
WriteLn('>>');
WriteLn('/DW 1000');
WriteLn('/W [ 1 95 500 8094 8190 500 ]');
WriteLn('>>');
WriteLn('endobj');
end;
end;
if not (Charset in [CHINESEBIG5_CHARSET, GB2312_CHARSET,SHIFTJIS_CHARSET,HANGEUL_CHARSET]) then
begin
WriteLn('/FontDescriptor ' + IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 R');
WriteLn('/FirstChar ' + IntToStr(FirstChar));
WriteLn('/LastChar ' + IntToStr(LastChar));
pwidths := GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE, SizeOf(ABCArray));
try
Write('/Widths [');
GetCharABCWidths(b.Canvas.Handle, FirstChar, LastChar, pwidths^);
for i := 0 to (LastChar - FirstChar) do
Write(IntToStr(pwidths^[i].abcA + Integer(pwidths^[i].abcB) + pwidths^[i].abcC) + ' ');
WriteLn(']');
finally
GlobalFreePtr(pwidths);
end;
WriteLn('>>');
WriteLn('endobj');
Flush(Stream);
Parent.XRefAdd(Stream);
WriteLn(IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 obj');
WriteLn('<<');
WriteLn('/Type /FontDescriptor');
WriteLn('/FontName /' + FontName);
WriteLn('/Flags 32');
WriteLn('/FontBBox [' + IntToStr(pm^.otmrcFontBox.Left) + ' '+ IntToStr(pm^.otmrcFontBox.Bottom) + ' '+ IntToStr(pm^.otmrcFontBox.Right) + ' '+ IntToStr(pm^.otmrcFontBox.Top) + ' ]');
WriteLn('/ItalicAngle ' + IntToStr(pm^.otmItalicAngle));
WriteLn('/Ascent ' + IntToStr(pm^.otmAscent));
WriteLn('/Descent ' + IntToStr(pm^.otmDescent));
WriteLn('/Leading ' + IntToStr(pm^.otmTextMetrics.tmInternalLeading));
WriteLn('/CapHeight ' + IntToStr(pm^.otmTextMetrics.tmHeight));
WriteLn('/XHeight ' + IntToStr(pm^.otmsXHeight));
WriteLn('/StemV ' + IntToStr(50 + Round(sqr(pm^.otmTextMetrics.tmWeight / 65))));
WriteLn('/AvgWidth ' + IntToStr(pm^.otmTextMetrics.tmAveCharWidth));
WriteLn('/MaxWidth ' + IntToStr(pm^.otmTextMetrics.tmMaxCharWidth));
WriteLn('/MissingWidth ' + IntToStr(pm^.otmTextMetrics.tmAveCharWidth));
if Parent.FEmbedded then
WriteLn('/FontFile2 ' + IntToStr(Index + 2 + Parent.FStartFonts) + ' 0 R');
WriteLn('>>');
WriteLn('endobj');
end;
if Parent.FEmbedded then
begin
Flush(Stream);
Parent.XRefAdd(Stream);
WriteLn(IntToStr(Index + 2 + Parent.FStartFonts) + ' 0 obj');
i := GetFontData(b.Canvas.Handle, 0, 0, nil, 1);
pfont := GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE, i);
try
i := GetFontData(b.Canvas.Handle, 0, 0, pfont, i);
MemStream := TMemoryStream.Create;
try
MemStream.Write(pfont^, i);
MemStream1 := TMemoryStream.Create;
try
frxDeflateStream(MemStream, MemStream1, gzMax);
WriteLn('<< /Length ' + IntToStr(MemStream1.Size) + ' /Filter /FlateDecode /Length1 ' + IntToStr(MemStream.Size) + ' >>');
WriteLn('stream');
Flush(Stream);
Stream.CopyFrom(MemStream1, 0);
finally
MemStream1.Free;
end;
finally
MemStream.Free;
end;
finally
GlobalFreePtr(pfont);
end;
WriteLn('');
WriteLn('endstream');
WriteLn('endobj');
end;
end;
Flush(Stream);
finally
GlobalFreePtr(pm);
end;
end
else
Exception.Create('Error on get font info');
finally
b.Canvas.Unlock;
b.Free;
end;
end;
{ TfrxPDFElement }
constructor TfrxPDFElement.Create;
begin
FIndex := 0;
FXrefPosition := 0;
FCR := False;
FLines := '';
end;
procedure TfrxPDFElement.Write(const S: String);
begin
FLines := FLines + S;
end;
procedure TfrxPDFElement.WriteLn(const S: String);
begin
FLines := FLines + S + #13#10;
end;
procedure TfrxPDFElement.Flush(const Stream: TStream);
begin
Stream.Write(FLines[1], Length(FLines));
FLines := '';
end;
procedure TfrxPDFElement.SaveToStream(const Stream: TStream);
begin
FXrefPosition := Stream.Position;
end;
{ TfrxPDFToolkit }
constructor TfrxPDFToolkit.Create;
begin
Divider := frxDrawText.DefPPI / frxDrawText.ScrPPI;
LastColor := clBlack;
LastColorResult := '0 0 0';
end;
function TfrxPDFToolkit.GetHTextPos(const Left: Extended; const Width: Extended;
const CharSpacing: Extended; const Text: String; const Align: TfrxHAlign): Extended;
var
FWidth: Extended;
begin
if (Align = haLeft) or (Align = haBlock) then
Result := Left
else begin
FWidth := frxDrawText.Canvas.TextWidth(Text) / Divider + Length(Text) * CharSpacing;
if Align = haCenter then
Result := Left + (Width - FWidth) / 2
else
Result := Left + Width - FWidth;
end;
end;
function TfrxPDFToolkit.GetLineWidth(const Text: String; const CharSpacing: Extended): Extended;
var
FWidth: Extended;
begin
frxDrawText.Lock;
try
FWidth := frxDrawText.Canvas.TextWidth(Text) / Divider + Length(Text) * CharSpacing;
finally
frxDrawText.UnLock;
end;
Result := FWidth;
end;
function TfrxPDFToolkit.GetVTextPos(const Top: Extended; const Height: Extended;
const Text: String; const Align: TfrxVAlign; const Line: Integer = 0;
const Count: Integer = 1): Extended;
var
i: Integer;
begin
if Line <= Count then
i := Line
else
i := 0;
if Align = vaBottom then
Result := Top + Height - LineHeight * (Count - i - 1)
else if Align = vaCenter then
Result := Top + (Height - (LineHeight * Count)) / 2 + LineHeight * (i + 1)
else
Result := Top + (LineHeight * i) + frxDrawText.TextHeight;
end;
procedure TfrxPDFToolkit.SetMemo(const Memo: TfrxCustomMemoView);
begin
frxDrawText.SetFont(Memo.Font);
frxDrawText.SetGaps(0, 0, Memo.LineSpacing);
LineHeight := frxDrawText.LineHeight;
end;
{ TfrxPDFOutlineNode }
constructor TfrxPDFOutlineNode.Create;
begin
Title := '';
Dest := -1;
Number := 0;
Count := 0;
CountTree :=0;
Parent := nil;
First := nil;
Prev := nil;
Next := nil;
Last := nil;
end;
destructor TfrxPDFOutlineNode.Destroy;
begin
if Next <> nil then
Next.Free;
if First <> nil then
First.Free;
inherited;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -