private void AddWordLines(WordArea area, int rx, int bl, int size, PdfColor theAreaColor) { if (area.getUnderlined()) { int yPos = bl - size / 10; AddLine(rx, yPos, rx + area.getContentWidth(), yPos, size / 14, theAreaColor); // save position for underlining a following InlineSpace prevUnderlineXEndPos = rx + area.getContentWidth(); prevUnderlineYEndPos = yPos; prevUnderlineSize = size / 14; prevUnderlineColor = theAreaColor; } if (area.getOverlined()) { int yPos = bl + area.GetFontState().Ascender + size / 10; AddLine(rx, yPos, rx + area.getContentWidth(), yPos, size / 14, theAreaColor); prevOverlineXEndPos = rx + area.getContentWidth(); prevOverlineYEndPos = yPos; prevOverlineSize = size / 14; prevOverlineColor = theAreaColor; } if (area.getLineThrough()) { int yPos = bl + area.GetFontState().Ascender * 3 / 8; AddLine(rx, yPos, rx + area.getContentWidth(), yPos, size / 14, theAreaColor); prevLineThroughXEndPos = rx + area.getContentWidth(); prevLineThroughYEndPos = yPos; prevLineThroughSize = size / 14; prevLineThroughColor = theAreaColor; } }
/** * render inline area to PDF * * @param area inline area to render */ public void RenderWordArea(WordArea area) { FontState fontState = area.GetFontState(); String name = fontState.FontName; int size = fontState.FontSize; // This assumes that *all* CIDFonts use a /ToUnicode mapping Font font = (Font)fontState.FontInfo.GetFontByName(name); if ((!name.Equals(this.currentFontName)) || (size != this.currentFontSize)) { CloseText(); this.currentFontName = name; this.currentFontSize = size; currentStream.SetFont(name, size); } // Do letter spacing (must be outside of [...] TJ] float letterspacing = ((float)fontState.LetterSpacing) / 1000f; if (letterspacing != this.currentLetterSpacing) { this.currentLetterSpacing = letterspacing; CloseText(); //? currentStream.SetLetterSpacing(letterspacing); } //-------------------------------------------- PdfColor?a_color = this.currentFill; PdfColor areaObj_color = area.GetColor(); if (a_color == null || !areaObj_color.IsEq(a_color.Value)) { //change area color a_color = areaObj_color; CloseText(); //? this.currentFill = a_color; currentStream.SetFontColor(a_color.Value); } //-------------------------------------------- int rx = this.currentXPosition; int bl = this.currentYPosition; int areaContentW = area.getContentWidth(); if (area.getUnderlined()) { AddUnderLine(rx, bl, areaContentW, size, a_color.Value); } if (area.getOverlined()) { AddOverLine(rx, bl, areaContentW, size, fontState.Ascender, a_color.Value); } if (area.getLineThrough()) { AddLineThrough(rx, bl, areaContentW, size, fontState.Ascender, a_color.Value); } //-------------------------------------------- _textPrinter.Reset(fontState, options != null && options.Kerning); if (!textOpen || bl != prevWordY) { CloseText(); //set text matrix _textPrinter.SetTextPos(rx, bl); //pdf.Append("1 0 0 1 " + PdfNumber.doubleOut(rx / 1000f) + // " " + PdfNumber.doubleOut(bl / 1000f) + " Tm [" + startText); prevWordY = bl; textOpen = true; //*** } else { // express the space between words in thousandths of an em int space = prevWordX - rx + prevWordWidth; float emDiff = (float)space / (float)currentFontSize * 1000f; // this prevents a problem in Acrobat Reader where large // numbers cause text to disappear or default to a limit if (emDiff < -33000) { CloseText(); _textPrinter.SetTextPos(rx, bl); //pdf.Append("1 0 0 1 " + PdfNumber.doubleOut(rx / 1000f) + // " " + PdfNumber.doubleOut(bl / 1000f) + " Tm [" + startText); textOpen = true;//*** } else { _textPrinter.SetEmDiff(emDiff); //pdf.Append(PdfNumber.doubleOut(emDiff)); //pdf.Append(" "); //pdf.Append(startText); } } prevWordWidth = areaContentW; prevWordX = rx; string s = area.GetTextContent(); if (area is PageNumberInlineArea) { //need to resolve to page number s = idReferences.getPageNumber(s); } _textPrinter.WriteText(s); //------- _textPrinter.PrintContentTo(currentStream); //------- this.currentXPosition += area.getContentWidth(); }