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

📄 metado.cs

📁 itextsharp for pdf document
💻 CS
📖 第 1 页 / 共 2 页
字号:
                    cb.arc(state.transformX(l), state.transformY(b), state.transformX(r), state.transformY(t), 0, 360);
                    strokeAndFill();
                    break;
                }
                case META_ARC:
                {
                    if (isNullStrokeFill(state.LineNeutral))
                        break;
                    float yend = state.transformY(meta.readShort());
                    float xend = state.transformX(meta.readShort());
                    float ystart = state.transformY(meta.readShort());
                    float xstart = state.transformX(meta.readShort());
                    float b = state.transformY(meta.readShort());
                    float r = state.transformX(meta.readShort());
                    float t = state.transformY(meta.readShort());
                    float l = state.transformX(meta.readShort());
                    float cx = (r + l) / 2;
                    float cy = (t + b) / 2;
                    float arc1 = getArc(cx, cy, xstart, ystart);
                    float arc2 = getArc(cx, cy, xend, yend);
                    arc2 -= arc1;
                    if (arc2 <= 0)
                        arc2 += 360;
                    cb.arc(l, b, r, t, arc1, arc2);
                    cb.stroke();
                    break;
                }
                case META_PIE:
                {
                    if (isNullStrokeFill(state.LineNeutral))
                        break;
                    float yend = state.transformY(meta.readShort());
                    float xend = state.transformX(meta.readShort());
                    float ystart = state.transformY(meta.readShort());
                    float xstart = state.transformX(meta.readShort());
                    float b = state.transformY(meta.readShort());
                    float r = state.transformX(meta.readShort());
                    float t = state.transformY(meta.readShort());
                    float l = state.transformX(meta.readShort());
                    float cx = (r + l) / 2;
                    float cy = (t + b) / 2;
                    float arc1 = getArc(cx, cy, xstart, ystart);
                    float arc2 = getArc(cx, cy, xend, yend);
                    arc2 -= arc1;
                    if (arc2 <= 0)
                        arc2 += 360;
                    ArrayList ar = PdfContentByte.bezierArc(l, b, r, t, arc1, arc2);
                    if (ar.Count == 0)
                        break;
                    float[] pt = (float [])ar[0];
                    cb.moveTo(cx, cy);
                    cb.lineTo(pt[0], pt[1]);
                    for (int k = 0; k < ar.Count; ++k) {
                        pt = (float [])ar[k];
                        cb.curveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
                    }
                    cb.lineTo(cx, cy);
                    strokeAndFill();
                    break;
                }
                case META_CHORD:
                {
                    if (isNullStrokeFill(state.LineNeutral))
                        break;
                    float yend = state.transformY(meta.readShort());
                    float xend = state.transformX(meta.readShort());
                    float ystart = state.transformY(meta.readShort());
                    float xstart = state.transformX(meta.readShort());
                    float b = state.transformY(meta.readShort());
                    float r = state.transformX(meta.readShort());
                    float t = state.transformY(meta.readShort());
                    float l = state.transformX(meta.readShort());
                    float cx = (r + l) / 2;
                    float cy = (t + b) / 2;
                    float arc1 = getArc(cx, cy, xstart, ystart);
                    float arc2 = getArc(cx, cy, xend, yend);
                    arc2 -= arc1;
                    if (arc2 <= 0)
                        arc2 += 360;
                    ArrayList ar = PdfContentByte.bezierArc(l, b, r, t, arc1, arc2);
                    if (ar.Count == 0)
                        break;
                    float[] pt = (float [])ar[0];
                    cx = pt[0];
                    cy = pt[1];
                    cb.moveTo(cx, cy);
                    for (int k = 0; k < ar.Count; ++k) {
                        pt = (float [])ar[k];
                        cb.curveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
                    }
                    cb.lineTo(cx, cy);
                    strokeAndFill();
                    break;
                }
                case META_RECTANGLE:
                {
                    if (isNullStrokeFill(true))
                        break;
                    float b = state.transformY(meta.readShort());
                    float r = state.transformX(meta.readShort());
                    float t = state.transformY(meta.readShort());
                    float l = state.transformX(meta.readShort());
                    cb.rectangle(l, b, r - l, t - b);
                    strokeAndFill();
                    break;
                }
                case META_INTERSECTCLIPRECT:
                {
                    float b = state.transformY(meta.readShort());
                    float r = state.transformX(meta.readShort());
                    float t = state.transformY(meta.readShort());
                    float l = state.transformX(meta.readShort());
                    cb.rectangle(l, b, r - l, t - b);
                    cb.eoClip();
                    cb.newPath();
                    break;
                }
                case META_EXTTEXTOUT:
                {
                    int y = meta.readShort();
                    int x = meta.readShort();
                    int count = meta.readWord();
                    int flag = meta.readWord();
                    int x1 = 0;
                    int y1 = 0;
                    int x2 = 0;
                    int y2 = 0;
                    if ((flag & (MetaFont.ETO_CLIPPED | MetaFont.ETO_OPAQUE)) != 0) {
                        x1 = meta.readShort();
                        y1 = meta.readShort();
                        x2 = meta.readShort();
                        y2 = meta.readShort();
                    }
                    byte[] text = new byte[count];
                    int k;
                    for (k = 0; k < count; ++k) {
                        byte c = (byte)meta.readByte();
                        if (c == 0)
                            break;
                        text[k] = c;
                    }
                    string s;
                    try {
						s = System.Text.Encoding.GetEncoding("windows-1252").GetString(text, 0, k);
                    }
                    catch (Exception e) {
						e.GetType();
						s = System.Text.ASCIIEncoding.ASCII.GetString(text, 0, k);
                    }
                    outputText(x, y, flag, x1, y1, x2, y2, s);
                    break;
                }
                case META_TEXTOUT:
                {
                    int count = meta.readWord();
                    byte[] text = new byte[count];
                    int k;
                    for (k = 0; k < count; ++k) {
                        byte c = (byte)meta.readByte();
                        if (c == 0)
                            break;
                        text[k] = c;
                    }
                    string s;
                    try {
						s = System.Text.Encoding.GetEncoding("windows-1252").GetString(text, 0, k);
                    }
                    catch (Exception e) {
						e.GetType();
						s = System.Text.ASCIIEncoding.ASCII.GetString(text, 0, k);
                    }
                    count = (count + 1) & 0xfffe;
                    meta.skip(count - k);
                    int y = meta.readShort();
                    int x = meta.readShort();
                    outputText(x, y, 0, 0, 0, 0, 0, s);
                    break;
                }
                case META_SETBKCOLOR:
                    state.CurrentBackgroundColor = meta.readColor();
                    break;
                case META_SETTEXTCOLOR:
                    state.CurrentTextColor = meta.readColor();
                    break;
                case META_SETTEXTALIGN:
                    state.TextAlign = meta.readWord();
                    break;
                case META_SETBKMODE:
                    state.BackgroundMode = meta.readWord();
                    break;
                case META_SETPOLYFILLMODE:
                    state.PolyFillMode = meta.readWord();
                    break;
                case META_SETPIXEL:
                {
                    Color color = meta.readColor();
                    int y = meta.readShort();
                    int x = meta.readShort();
                    cb.saveState();
                    cb.ColorFill = color;
                    cb.rectangle(state.transformX(x), state.transformY(y), .2f, .2f);
                    cb.fill();
                    cb.restoreState();
                    break;
                }
            }
            meta.skip((tsize * 2) - (meta.Length - lenMarker));
        }
        
    }
    
    public void outputText(int x, int y, int flag, int x1, int y1, int x2, int y2, string text) {
        MetaFont font = state.CurrentFont;
        float refX = state.transformX(x);
        float refY = state.transformY(y);
        float sin = (float)Math.Sin(font.Angle);
        float cos = (float)Math.Cos(font.Angle);
        float fontSize = font.getFontSize(state);
        BaseFont bf = font.Font;
        int align = state.TextAlign;
        float textWidth = bf.getWidthPoint(text, fontSize);
        float tx = 0;
        float ty = 0;
        float descender = bf.getFontDescriptor(BaseFont.DESCENT, fontSize);
        float ury = bf.getFontDescriptor(BaseFont.BBOXURY, fontSize);
        cb.saveState();
        cb.concatCTM(cos, sin, -sin, cos, refX, refY);
        if ((align & MetaState.TA_CENTER) == MetaState.TA_CENTER)
            tx = -textWidth / 2;
        else if ((align & MetaState.TA_RIGHT) == MetaState.TA_RIGHT)
            tx = -textWidth;
        if ((align & MetaState.TA_BASELINE) == MetaState.TA_BASELINE)
            ty = 0;
        else if ((align & MetaState.TA_BOTTOM) == MetaState.TA_BOTTOM)
            ty = -descender;
        else
            ty = -ury;
        Color textColor;
        if (state.BackgroundMode == MetaState.OPAQUE) {
            textColor = state.CurrentBackgroundColor;
            cb.ColorFill = textColor;
            cb.rectangle(tx, ty + descender, textWidth, ury - descender);
            cb.fill();
        }
        textColor = state.CurrentTextColor;
        cb.ColorFill = textColor;
        cb.beginText();
        cb.setFontAndSize(bf, fontSize);
        cb.setTextMatrix(tx, ty);
        cb.showText(text);
        cb.endText();
        if (font.isUnderline()) {
            cb.rectangle(tx, ty - fontSize / 4, textWidth, fontSize / 15);
            cb.fill();
        }
        if (font.isStrikeout()) {
            cb.rectangle(tx, ty + fontSize / 3, textWidth, fontSize / 15);
            cb.fill();
        }
        cb.restoreState();
    }
    
    public bool isNullStrokeFill(bool isRectangle) {
        MetaPen pen = state.CurrentPen;
        MetaBrush brush = state.CurrentBrush;
        bool noPen = (pen.Style == MetaPen.PS_NULL);
        int style = brush.Style;
        bool isBrush = (style == MetaBrush.BS_SOLID || (style == MetaBrush.BS_HATCHED && state.BackgroundMode == MetaState.OPAQUE));
        bool result = noPen && !isBrush;
        if (!noPen) {
            if (isRectangle)
                state.LineJoinRectangle = cb;
            else
                state.LineJoinPolygon = cb;
        }
        return result;
    }

    public void strokeAndFill(){
        MetaPen pen = state.CurrentPen;
        MetaBrush brush = state.CurrentBrush;
        int penStyle = pen.Style;
        int brushStyle = brush.Style;
        if (penStyle == MetaPen.PS_NULL) {
            cb.closePath();
            if (state.PolyFillMode == MetaState.ALTERNATE) {
                cb.eoFill();
            }
            else {
                cb.fill();
            }
        }
        else {
            bool isBrush = (brushStyle == MetaBrush.BS_SOLID || (brushStyle == MetaBrush.BS_HATCHED && state.BackgroundMode == MetaState.OPAQUE));
            if (isBrush) {
                if (state.PolyFillMode == MetaState.ALTERNATE)
                    cb.closePathEoFillStroke();
                else
                    cb.closePathFillStroke();
            }
            else {
                cb.closePathStroke();
            }
        }
    }
    
    internal static float getArc(float xCenter, float yCenter, float xDot, float yDot) {
        double s = Math.Atan2(yDot - yCenter, xDot - xCenter);
        if (s < 0)
            s += Math.PI * 2;
        return (float)(s / Math.PI * 180);
    }
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -