Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Comment: | {5029} refactoring to fix "Times" embedded font naming |
---|---|
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
1746f37be6c452be081c1ddb1415c8ba |
User & Date: | ab 2019-02-08 14:22:21 |
2019-02-09
| ||
10:07 | {5030} new overloaded IPToCardinal() function, and CompareFloat/CompareInt64 comparators check-in: 5b6a8b88d2 user: ab tags: trunk | |
2019-02-08
| ||
14:22 | {5029} refactoring to fix "Times" embedded font naming check-in: 1746f37be6 user: ab tags: trunk | |
00:18 | {5028} introducing TSynQueue.WaitPeekLocked method check-in: c4137ea987 user: ab tags: trunk | |
Changes to SynPdf.pas.
590 591 592 593 594 595 596 597 598 599 600 601 602 603 .... 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 .... 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 .... 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 .... 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 |
/// the available PDF color range TPdfColor = -$7FFFFFFF-1..$7FFFFFFF; /// the PDF color, as expressed in RGB terms // - maps COLORREF / TColorRef as used e.g. under windows TPdfColorRGB = cardinal; /// numerical ID for every XObject TXObjectID = integer; const /// used for an used xref entry PDF_IN_USE_ENTRY = 'n'; ................................................................................ fTPdfPageClass: TPdfPageClass; procedure RaiseInvalidOperation; procedure CreateInfo; /// get the PostScript Name of a TrueType Font // - use the Naming Table ('name') of the TTF content if not 7 bit ascii function TTFFontPostcriptName(aFontIndex: integer; AStyle: TPdfFontStyles; AFont: TPdfFontTrueType): PDFString; /// if ANSI_CHARSET is used, create a standard embedded font function CreateEmbeddedFont(const FontName: RawUTF8): TPdfFont; /// register the font in the font list procedure RegisterFont(aFont: TPdfFont); /// get the PDF font, from its internal PDF name (e.g. 'Helvetica-Bold') // - if the specified font exists in the font list, returns the corresponding object // - if the font doesn't exist yet, returns NIL function GetRegisteredNotTrueTypeFont(const APDFFontName: PDFString): TPdfFont; /// get the supplied TrueType Font from the internal font list ................................................................................ fMissingBookmarks.Free; inherited; {$ifdef USE_PDFSECURITY} fEncryption.Free; {$endif USE_PDFSECURITY} end; function TPdfDocument.CreateEmbeddedFont(const FontName: RawUTF8): TPdfFont; const // WidthArray[30]=Ascent, WidthArray[31]=Descent, // WidthArray[32..255]=Width(#32..#255) ARIAL_W_ARRAY: array[30..255] of SmallInt = ( 905, -212, 278,278,355,556,556,889,667,191,333,333,389,584,278,333, 278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584, 584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833, 722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278, 469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833, 556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334, 584,0,556,0,222,556,333,1000,556,556,333,1000,667,333,1000,0, 611,0,0,222,222,333,333,350,556,1000,333,1000,500,333,944,0, 500,667,0,333,556,556,556,556,260,556,333,737,370,556,584,0, 737,333,400,584,333,333,333,556,537,278,333,333,365,556,834,834, 834,611,667,667,667,667,667,667,1000,722,667,667,667,667,278,278, 278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667, 667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278, 278,278,556,556,556,556,556,556,556,584,611,556,556,556,556,500, 556,500); ARIAL_BOLD_W_ARRAY: array[30..255] of SmallInt = ( 905, -212, 278,333,474,556,556,889,722,238,333,333,389,584,278,333, 278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584, 584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833, 722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333, 584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889, 611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389, 584,0,556,0,278,556,500,1000,556,556,333,1000,667,333,1000,0, 611,0,0,278,278,500,500,350,556,1000,333,1000,556,333,944,0, 500,667,0,333,556,556,556,556,280,556,333,737,370,556,584,0, 737,333,400,584,333,333,333,611,556,278,333,333,365,556,834,834, 834,611,722,722,722,722,722,722,1000,722,667,667,667,667,278,278, 278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667, 667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278, 278,278,611,611,611,611,611,611,611,584,611,611,611,611,611,556, 611,556); ARIAL_ITALIC_W_ARRAY: array[30..255] of SmallInt = ( 905, -212, 278,278,355,556,556,889,667,191,333,333,389,584,278,333, 278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584, 584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833, 722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278, 469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833, 556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334, 584,0,556,0,222,556,333,1000,556,556,333,1000,667,333,1000,0, 611,0,0,222,222,333,333,350,556,1000,333,1000,500,333,944,0, 500,667,0,333,556,556,556,556,260,556,333,737,370,556,584,0, 737,333,400,584,333,333,333,556,537,278,333,333,365,556,834,834, 834,611,667,667,667,667,667,667,1000,722,667,667,667,667,278,278, 278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667, 667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278, 278,278,556,556,556,556,556,556,556,584,611,556,556,556,556,500, 556,500); ARIAL_BOLDITALIC_W_ARRAY: array[30..255] of SmallInt = ( 905, -212, 278,333,474,556,556,889,722,238,333,333,389,584,278,333, 278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584, 584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833, 722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333, 584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889, 611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389, 584,0,556,0,278,556,500,1000,556,556,333,1000,667,333,1000,0, 611,0,0,278,278,500,500,350,556,1000,333,1000,556,333,944,0, 500,667,0,333,556,556,556,556,280,556,333,737,370,556,584,0, 737,333,400,584,333,333,333,611,556,278,333,333,365,556,834,834, 834,611,722,722,722,722,722,722,1000,722,667,667,667,667,278,278, 278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667, 667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278, 278,278,611,611,611,611,611,611,611,584,611,611,611,611,611,556, 611,556); TIMES_ROMAN_W_ARRAY: array[30..255] of SmallInt = ( 891, -216, 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_ITALIC_W_ARRAY: array[30..255] of SmallInt = ( 891, -216, 250,333,420,500,500,833,778,214,333,333,500,675,250,333, 250,278,500,500,500,500,500,500,500,500,500,500,333,333,675,675, 675,500,920,611,611,667,722,611,611,722,722,333,444,667,556,833, 667,722,611,722,611,500,556,722,611,833,611,556,556,389,278,389, 422,500,333,500,500,444,500,444,278,500,500,278,278,444,278,722, 500,500,500,500,389,389,278,500,444,667,444,444,389,400,275,400, 541,0,500,0,333,500,556,889,500,500,333,1000,500,333,944,0, 556,0,0,333,333,556,556,350,500,889,333,980,389,333,667,0, 389,556,0,389,500,500,500,500,275,500,333,760,276,500,675,0, 760,333,400,675,300,300,333,500,523,250,333,300,310,500,750,750, 750,500,611,611,611,611,611,611,889,667,611,611,611,611,333,333, 333,333,722,667,722,722,722,722,722,675,722,722,722,722,722,556, 611,500,500,500,500,500,500,500,667,444,444,444,444,444,278,278, 278,278,500,500,500,500,500,500,500,675,500,500,500,500,500,444, 500,444); TIMES_BOLD_W_ARRAY: array[30..255] of SmallInt = ( 891, -216, 250,333,555,500,500,1000,833,278,333,333,500,570,250,333, 250,278,500,500,500,500,500,500,500,500,500,500,333,333,570,570, 570,500,930,722,667,722,722,667,611,778,778,389,500,778,667,944, 722,778,611,778,722,556,667,722,722,1000,722,722,667,333,278,333, 581,500,333,500,556,444,556,444,333,500,556,278,333,556,278,833, 556,500,556,556,444,389,333,556,500,722,500,500,444,394,220,394, 520,0,500,0,333,500,500,1000,500,500,333,1000,556,333,1000,0, 667,0,0,333,333,500,500,350,500,1000,333,1000,389,333,722,0, 444,722,0,333,500,500,500,500,220,500,333,747,300,500,570,0, 747,333,400,570,300,300,333,556,540,250,333,300,330,500,750,750, 750,500,722,722,722,722,722,722,1000,722,667,667,667,667,389,389, 389,389,722,722,778,778,778,778,778,570,778,722,722,722,722,722, 611,556,500,500,500,500,500,500,722,444,444,444,444,444,278,278, 278,278,500,556,500,500,500,500,500,570,500,556,556,556,556,500, 556,500); TIMES_BOLDITALIC_W_ARRAY: array[30..255] of SmallInt = ( 891, -216, 250,389,555,500,500,833,778,278,333,333,500,570,250,333, 250,278,500,500,500,500,500,500,500,500,500,500,333,333,570,570, 570,500,832,667,667,667,722,667,667,722,778,389,500,667,611,889, 722,722,611,722,667,556,611,722,667,889,667,611,611,333,278,333, 570,500,333,500,500,444,500,444,333,500,556,278,278,500,278,778, 556,500,500,500,389,389,278,556,444,667,500,444,389,348,220,348, 570,0,500,0,333,500,500,1000,500,500,333,1000,556,333,944,0, 611,0,0,333,333,500,500,350,500,1000,333,1000,389,333,722,0, 389,611,0,389,500,500,500,500,220,500,333,747,266,500,606,0, 747,333,400,570,300,300,333,576,500,250,333,300,300,500,750,750, 750,500,667,667,667,667,667,667,944,667,667,667,667,667,389,389, 389,389,722,722,722,722,722,722,722,570,722,722,722,722,722,611, 611,500,500,500,500,500,500,500,722,444,444,444,444,444,278,278, 278,278,500,556,500,500,500,500,500,570,500,556,556,556,556,444, 500,444); STANDARDFONTS: array[0..11] of record Name: RawUTF8; Widths: PSmallIntArray; end = ( (Name: 'Courier'; Widths: nil), // Widths:nil -> set all widths to 600 (Name: 'Courier-Bold'; Widths: nil), (Name: 'Courier-Oblique'; Widths: nil), (Name: 'Courier-BoldOblique'; Widths: nil), (Name: 'Helvetica'; Widths: @ARIAL_W_ARRAY), (Name: 'Helvetica-Bold'; Widths: @ARIAL_BOLD_W_ARRAY), (Name: 'Helvetica-Oblique'; Widths: @ARIAL_ITALIC_W_ARRAY), (Name: 'Helvetica-BoldOblique'; Widths: @ARIAL_BOLDITALIC_W_ARRAY), (Name: 'Times'; Widths: @TIMES_ROMAN_W_ARRAY), (Name: 'Times-Bold'; Widths: @TIMES_BOLD_W_ARRAY), (Name: 'Times-Oblique'; Widths: @TIMES_ITALIC_W_ARRAY), (Name: 'Times-BoldOblique'; Widths: @TIMES_BOLDITALIC_W_ARRAY) ); var i: integer; FontName2: PDFString; begin // handle default embedded fonts if StandardFontsReplace then begin // fonts width are for WinAnsi encoding only FontName2 := RawUTF8ToPDFString(FontName); for i := 0 to high(STANDARDFONTS) do if SameTextU(STANDARDFONTS[i].Name,FontName) then begin result := TPdfFontType1.Create(FXref,FontName2,STANDARDFONTS[i].Widths); RegisterFont(result); Exit; end; end; result := nil; end; function TPdfDocument.RegisterXObject(AObject: TPdfXObject; const AName: PDFString): integer; begin // check object and register it if AObject=nil then raise EPdfInvalidValue.Create('RegisterXObject: no AObject'); if AObject.Attributes.TypeOf<>'XObject' then raise EPdfInvalidValue.Create('RegisterXObject: no XObject'); ................................................................................ // change the font if FContents<>nil then SetFontAndSize(AFont.ShortCut, ASize); // e.g. SetFontAndSize('F0',12) FPage.Font := AFont; FPage.FontSize := ASize; end; function StandardFontName(const AName: RawUTF8; AStyle: TPdfFontStyles): RawUTF8; begin result := AName; if pfsItalic in AStyle then if pfsBold in AStyle then result := result+'-BoldOblique' else result := result+'-Oblique' else if pfsBold in AStyle then result := result+'-Bold'; end; procedure InitializeLogFontW(const aFontName: RawUTF8; aStyle: TPdfFontStyles; var aFont: TLogFontW); begin FillCharFast(AFont,sizeof(AFont),0); with aFont do begin lfHeight := -1000; if pfsBold in AStyle then ................................................................................ lfWeight := FW_NORMAL; lfItalic := Byte(pfsItalic in AStyle); lfUnderline := Byte(pfsUnderline in AStyle); lfStrikeOut := Byte(pfsStrikeOut in AStyle); UTF8ToWideChar(lfFaceName,Pointer(aFontName)); end; end; function TPdfCanvas.SetFont(const AName: RawUTF8; ASize: single; AStyle: TPdfFontStyles; ACharSet: integer=-1; AForceTTF: integer=-1; AIsFixedWidth: boolean=false): TPdfFont; const STAND_FONTS_PDF: array[0..2] of RawUTF8 = ('Helvetica','Courier','Times'); STAND_FONTS_WIN: array[0..2] of RawUTF8 = ('Arial','Courier New','Times New Roman'); STAND_FONTS_UPPER: array[0..2] of PAnsiChar = ('HELVETICA','COURIER','TIMES'); procedure SetEmbeddedFont(ABaseFont: RawUTF8); begin ABaseFont := StandardFontName(ABaseFont,AStyle); result := fDoc.GetRegisteredNotTrueTypeFont(RawUTF8ToPDFString(ABaseFont)); if result=nil then // font not already registered -> try to add now result := fDoc.CreateEmbeddedFont(ABaseFont); SetPDFFont(result,ASize); end; var AFont: TLogFontW; FontIndex, i: integer; begin result := nil; if (self=nil) or (FDoc=nil) then exit; // avoid GPF if AForceTTF>=0 then // an existing true type font has been specified FontIndex := AForceTTF else begin // handle use embedded fonts for standard fonts, if needed if (fDoc.FCharSet=ANSI_CHARSET) and fDoc.StandardFontsReplace then begin // standard/embedded fonts are WinAnsi only for i := low(STAND_FONTS_PDF) to high(STAND_FONTS_PDF) do if SameTextU(AName,STAND_FONTS_PDF[i]) or SameTextU(AName,STAND_FONTS_WIN[i]) then begin SetEmbeddedFont(STAND_FONTS_PDF[i]); if result<>nil then exit; // we got a standard/embedded font end; end; if (FPreviousRasterFontName<>'') and (FPreviousRasterFontName=AName) then FontIndex := FPreviousRasterFontIndex else begin // search the font in the global system-wide true type fonts list FontIndex := fDoc.GetTrueTypeFontIndex(AName); if FontIndex<0 then begin // unknown, device or raster font if AIsFixedWidth then // sounds to be fixed-width -> set 'Courier' FontIndex := fDoc.GetTrueTypeFontIndex(STAND_FONTS_WIN[1]); // do not exist as is: find equivalency of some "standard" font for i := low(STAND_FONTS_UPPER) to high(STAND_FONTS_UPPER) do if (FontIndex<0) and IdemPChar(pointer(AName),STAND_FONTS_UPPER[i]) then FontIndex := fDoc.GetTrueTypeFontIndex(STAND_FONTS_WIN[i]); if FontIndex<0 then begin // use variable width default font FontIndex := FDoc.fFontFallBackIndex; if FontIndex<0 then FontIndex := fDoc.GetTrueTypeFontIndex('Arial'); if FontIndex<0 then exit; end; |
> > > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < > > > | > | < > | < | < > > > > | | | > | | | | | | | | | |
590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 .... 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 .... 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 .... 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 .... 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 |
/// the available PDF color range TPdfColor = -$7FFFFFFF-1..$7FFFFFFF; /// the PDF color, as expressed in RGB terms // - maps COLORREF / TColorRef as used e.g. under windows TPdfColorRGB = cardinal; /// the recognized families of the Standard 14 Fonts TPdfFontStandard = (pfsTimes, pfsHelvetica, pfsCourier); /// numerical ID for every XObject TXObjectID = integer; const /// used for an used xref entry PDF_IN_USE_ENTRY = 'n'; ................................................................................ fTPdfPageClass: TPdfPageClass; procedure RaiseInvalidOperation; procedure CreateInfo; /// get the PostScript Name of a TrueType Font // - use the Naming Table ('name') of the TTF content if not 7 bit ascii function TTFFontPostcriptName(aFontIndex: integer; AStyle: TPdfFontStyles; AFont: TPdfFontTrueType): PDFString; /// register the font in the font list procedure RegisterFont(aFont: TPdfFont); /// get the PDF font, from its internal PDF name (e.g. 'Helvetica-Bold') // - if the specified font exists in the font list, returns the corresponding object // - if the font doesn't exist yet, returns NIL function GetRegisteredNotTrueTypeFont(const APDFFontName: PDFString): TPdfFont; /// get the supplied TrueType Font from the internal font list ................................................................................ fMissingBookmarks.Free; inherited; {$ifdef USE_PDFSECURITY} fEncryption.Free; {$endif USE_PDFSECURITY} end; function TPdfDocument.RegisterXObject(AObject: TPdfXObject; const AName: PDFString): integer; begin // check object and register it if AObject=nil then raise EPdfInvalidValue.Create('RegisterXObject: no AObject'); if AObject.Attributes.TypeOf<>'XObject' then raise EPdfInvalidValue.Create('RegisterXObject: no XObject'); ................................................................................ // change the font if FContents<>nil then SetFontAndSize(AFont.ShortCut, ASize); // e.g. SetFontAndSize('F0',12) FPage.Font := AFont; FPage.FontSize := ASize; end; procedure InitializeLogFontW(const aFontName: RawUTF8; aStyle: TPdfFontStyles; var aFont: TLogFontW); begin FillCharFast(AFont,sizeof(AFont),0); with aFont do begin lfHeight := -1000; if pfsBold in AStyle then ................................................................................ lfWeight := FW_NORMAL; lfItalic := Byte(pfsItalic in AStyle); lfUnderline := Byte(pfsUnderline in AStyle); lfStrikeOut := Byte(pfsStrikeOut in AStyle); UTF8ToWideChar(lfFaceName,Pointer(aFontName)); end; end; const // see PDF ref 9.6.2.2: Standard Type 1 Fonts // WidthArray[30]=Ascent, WidthArray[31]=Descent, // WidthArray[32..255]=Width(#32..#255) ARIAL_W_ARRAY: array[30..255] of SmallInt = ( 905,-212,278,278,355,556,556,889,667,191,333,333,389,584,278,333, 278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584, 584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833, 722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278, 469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833, 556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334, 584,0,556,0,222,556,333,1000,556,556,333,1000,667,333,1000,0, 611,0,0,222,222,333,333,350,556,1000,333,1000,500,333,944,0, 500,667,0,333,556,556,556,556,260,556,333,737,370,556,584,0, 737,333,400,584,333,333,333,556,537,278,333,333,365,556,834,834, 834,611,667,667,667,667,667,667,1000,722,667,667,667,667,278,278, 278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667, 667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278, 278,278,556,556,556,556,556,556,556,584,611,556,556,556,556,500,556,500); ARIAL_BOLD_W_ARRAY: array[30..255] of SmallInt = ( 905,-212,278,333,474,556,556,889,722,238,333,333,389,584,278,333, 278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584, 584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833, 722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333, 584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889, 611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389, 584,0,556,0,278,556,500,1000,556,556,333,1000,667,333,1000,0, 611,0,0,278,278,500,500,350,556,1000,333,1000,556,333,944,0, 500,667,0,333,556,556,556,556,280,556,333,737,370,556,584,0, 737,333,400,584,333,333,333,611,556,278,333,333,365,556,834,834, 834,611,722,722,722,722,722,722,1000,722,667,667,667,667,278,278, 278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667, 667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278, 278,278,611,611,611,611,611,611,611,584,611,611,611,611,611,556,611,556); ARIAL_ITALIC_W_ARRAY: array[30..255] of SmallInt = ( 905,-212,278,278,355,556,556,889,667,191,333,333,389,584,278,333, 278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584, 584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833, 722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278, 469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833, 556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334, 584,0,556,0,222,556,333,1000,556,556,333,1000,667,333,1000,0, 611,0,0,222,222,333,333,350,556,1000,333,1000,500,333,944,0, 500,667,0,333,556,556,556,556,260,556,333,737,370,556,584,0, 737,333,400,584,333,333,333,556,537,278,333,333,365,556,834,834, 834,611,667,667,667,667,667,667,1000,722,667,667,667,667,278,278, 278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667, 667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278, 278,278,556,556,556,556,556,556,556,584,611,556,556,556,556,500,556,500); ARIAL_BOLDITALIC_W_ARRAY: array[30..255] of SmallInt = ( 905,-212,278,333,474,556,556,889,722,238,333,333,389,584,278,333, 278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584, 584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833, 722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333, 584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889, 611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389, 584,0,556,0,278,556,500,1000,556,556,333,1000,667,333,1000,0, 611,0,0,278,278,500,500,350,556,1000,333,1000,556,333,944,0, 500,667,0,333,556,556,556,556,280,556,333,737,370,556,584,0, 737,333,400,584,333,333,333,611,556,278,333,333,365,556,834,834, 834,611,722,722,722,722,722,722,1000,722,667,667,667,667,278,278, 278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667, 667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278, 278,278,611,611,611,611,611,611,611,584,611,611,611,611,611,556,611,556); TIMES_ROMAN_W_ARRAY: array[30..255] of SmallInt = ( 891,-216,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_ITALIC_W_ARRAY: array[30..255] of SmallInt = ( 891,-216,250,333,420,500,500,833,778,214,333,333,500,675,250,333, 250,278,500,500,500,500,500,500,500,500,500,500,333,333,675,675, 675,500,920,611,611,667,722,611,611,722,722,333,444,667,556,833, 667,722,611,722,611,500,556,722,611,833,611,556,556,389,278,389, 422,500,333,500,500,444,500,444,278,500,500,278,278,444,278,722, 500,500,500,500,389,389,278,500,444,667,444,444,389,400,275,400, 541,0,500,0,333,500,556,889,500,500,333,1000,500,333,944,0, 556,0,0,333,333,556,556,350,500,889,333,980,389,333,667,0, 389,556,0,389,500,500,500,500,275,500,333,760,276,500,675,0, 760,333,400,675,300,300,333,500,523,250,333,300,310,500,750,750, 750,500,611,611,611,611,611,611,889,667,611,611,611,611,333,333, 333,333,722,667,722,722,722,722,722,675,722,722,722,722,722,556, 611,500,500,500,500,500,500,500,667,444,444,444,444,444,278,278, 278,278,500,500,500,500,500,500,500,675,500,500,500,500,500,444,500,444); TIMES_BOLD_W_ARRAY: array[30..255] of SmallInt = ( 891,-216,250,333,555,500,500,1000,833,278,333,333,500,570,250,333, 250,278,500,500,500,500,500,500,500,500,500,500,333,333,570,570, 570,500,930,722,667,722,722,667,611,778,778,389,500,778,667,944, 722,778,611,778,722,556,667,722,722,1000,722,722,667,333,278,333, 581,500,333,500,556,444,556,444,333,500,556,278,333,556,278,833, 556,500,556,556,444,389,333,556,500,722,500,500,444,394,220,394, 520,0,500,0,333,500,500,1000,500,500,333,1000,556,333,1000,0, 667,0,0,333,333,500,500,350,500,1000,333,1000,389,333,722,0, 444,722,0,333,500,500,500,500,220,500,333,747,300,500,570,0, 747,333,400,570,300,300,333,556,540,250,333,300,330,500,750,750, 750,500,722,722,722,722,722,722,1000,722,667,667,667,667,389,389, 389,389,722,722,778,778,778,778,778,570,778,722,722,722,722,722, 611,556,500,500,500,500,500,500,722,444,444,444,444,444,278,278, 278,278,500,556,500,500,500,500,500,570,500,556,556,556,556,500,556,500); TIMES_BOLDITALIC_W_ARRAY: array[30..255] of SmallInt = ( 891,-216,250,389,555,500,500,833,778,278,333,333,500,570,250,333, 250,278,500,500,500,500,500,500,500,500,500,500,333,333,570,570, 570,500,832,667,667,667,722,667,667,722,778,389,500,667,611,889, 722,722,611,722,667,556,611,722,667,889,667,611,611,333,278,333, 570,500,333,500,500,444,500,444,333,500,556,278,278,500,278,778, 556,500,500,500,389,389,278,556,444,667,500,444,389,348,220,348, 570,0,500,0,333,500,500,1000,500,500,333,1000,556,333,944,0, 611,0,0,333,333,500,500,350,500,1000,333,1000,389,333,722,0, 389,611,0,389,500,500,500,500,220,500,333,747,266,500,606,0, 747,333,400,570,300,300,333,576,500,250,333,300,300,500,750,750, 750,500,667,667,667,667,667,667,944,667,667,667,667,667,389,389, 389,389,722,722,722,722,722,722,722,570,722,722,722,722,722,611, 611,500,500,500,500,500,500,500,722,444,444,444,444,444,278,278, 278,278,500,556,500,500,500,500,500,570,500,556,556,556,556,444,500,444); STANDARDFONTS: array[0..11] of record Name: PDFString; Widths: PSmallIntArray; end = ( (Name: 'Times-Roman'; Widths: @TIMES_ROMAN_W_ARRAY), (Name: 'Times-Bold'; Widths: @TIMES_BOLD_W_ARRAY), (Name: 'Times-Italic'; Widths: @TIMES_ITALIC_W_ARRAY), (Name: 'Times-BoldItalic'; Widths: @TIMES_BOLDITALIC_W_ARRAY), (Name: 'Helvetica'; Widths: @ARIAL_W_ARRAY), (Name: 'Helvetica-Bold'; Widths: @ARIAL_BOLD_W_ARRAY), (Name: 'Helvetica-Oblique'; Widths: @ARIAL_ITALIC_W_ARRAY), (Name: 'Helvetica-BoldOblique'; Widths: @ARIAL_BOLDITALIC_W_ARRAY), (Name: 'Courier'; Widths: nil), // Widths:nil -> set all widths to 600 (Name: 'Courier-Bold'; Widths: nil), (Name: 'Courier-Oblique'; Widths: nil), (Name: 'Courier-BoldOblique'; Widths: nil)); function TPdfCanvas.SetFont(const AName: RawUTF8; ASize: single; AStyle: TPdfFontStyles; ACharSet: integer=-1; AForceTTF: integer=-1; AIsFixedWidth: boolean=false): TPdfFont; const STAND_FONTS_PDF: array[TPdfFontStandard] of RawUTF8 = ('Times','Helvetica','Courier'); STAND_FONTS_WIN: array[TPdfFontStandard] of RawUTF8 = ('Times New Roman','Arial','Courier New'); STAND_FONTS_UPPER: array[TPdfFontStandard] of PAnsiChar = ('TIMES','HELVETICA','COURIER'); procedure SetEmbeddedFont(Standard: TPdfFontStandard); var BaseIndex: integer; begin BaseIndex := ord(Standard)*4+(byte(AStyle) and 3); result := fDoc.GetRegisteredNotTrueTypeFont(STANDARDFONTS[BaseIndex].Name); if result=nil then begin // font not already registered -> add now with STANDARDFONTS[BaseIndex] do result := TPdfFontType1.Create(fDoc.FXref,Name,Widths); fDoc.RegisterFont(result); end; SetPDFFont(result,ASize); end; var AFont: TLogFontW; FontIndex: integer; f: TPdfFontStandard; begin result := nil; if (self=nil) or (FDoc=nil) then exit; // avoid GPF if AForceTTF>=0 then // an existing true type font has been specified FontIndex := AForceTTF else begin // handle use embedded fonts for standard fonts, if needed if (fDoc.FCharSet=ANSI_CHARSET) and fDoc.StandardFontsReplace then begin // standard/embedded fonts are WinAnsi only for f := low(f) to high(f) do if SameTextU(AName,STAND_FONTS_PDF[f]) or SameTextU(AName,STAND_FONTS_WIN[f]) then begin SetEmbeddedFont(f); if result<>nil then exit; // we got a standard/embedded font end; end; if (FPreviousRasterFontName<>'') and (FPreviousRasterFontName=AName) then FontIndex := FPreviousRasterFontIndex else begin // search the font in the global system-wide true type fonts list FontIndex := fDoc.GetTrueTypeFontIndex(AName); if FontIndex<0 then begin // unknown, device or raster font if AIsFixedWidth then // sounds to be fixed-width -> set 'Courier New' FontIndex := fDoc.GetTrueTypeFontIndex(STAND_FONTS_WIN[pfsCourier]); // do not exist as is: find equivalency of some "standard" font for f := low(f) to high(f) do if (FontIndex<0) and IdemPChar(pointer(AName),STAND_FONTS_UPPER[f]) then FontIndex := fDoc.GetTrueTypeFontIndex(STAND_FONTS_WIN[f]); if FontIndex<0 then begin // use variable width default font FontIndex := FDoc.fFontFallBackIndex; if FontIndex<0 then FontIndex := fDoc.GetTrueTypeFontIndex('Arial'); if FontIndex<0 then exit; end; |
Changes to SynopseCommit.inc.
1 |
'1.18.5028'
|
| |
1 |
'1.18.5029'
|