⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frxpdffile.pas

📁 报表控件。FastReport 是非常强大的报表控件
💻 PAS
📖 第 1 页 / 共 4 页
字号:
              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 + -