c#用下面的code写 一个string 到PDF 文件,将会是"DEM", this.pdfStream.WriteLine("0 0 m 0 30 l 10 30 l 20 20 l 20 10 l 10 0 l s");
this.pdfStream.WriteLine("50 0 m 30 0 l 30 30 l 50 30 l 30 20 m 40 20 l S");
this.pdfStream.WriteLine("60 0 m 60 30 l 70 20 l 80 30 l 80 0 l S");为什么"0 0 m 0 30 l 10 30 l 20 20 l 20 10 l 10 0 l s"  是D;
"50 0 m 30 0 l 30 30 l 50 30 l 30 20 m 40 20 l S" 是E;
"60 0 m 60 30 l 70 20 l 80 30 l 80 0 l S" 是M??????

解决方案 »

  1.   

    using System;
    using System.IO;
    using System.Text;
    using OpenPdf;namespace OpenPdf
    {
    public class PdfStream
    {
    private Stream m_st; public void FillFromFile(string filename)
    {
    m_st = new FileStream(filename, FileMode.Open);
    if(m_st == null)
    {
    throw new ParseException("Failed to open file: \"" + filename + "\"");
    }
    } public void FillFromString(string data)
    {
    UTF8Encoding ue = new UTF8Encoding();
    m_st = new MemoryStream();
    m_st.Write(ue.GetBytes(data), 0, data.Length);
    Position = 0;
    } public override string ToString()
    {
    long pos = Position;
    Position = 0;
    string retval = ReadBlock((int) Length);
    Position = pos;
    return retval;
    } public bool Eof
    {
    get
    {
    return Position >= Length;
    }
    } public long Position
    {
    get
    {
    return m_st.Position;
    }
    set
    {
    m_st.Position = value;
    }
    } public long Length
    {
    get
    {
    return m_st.Length;
    }
    } // We expect to see some text here...
    public bool Expect(string expected, bool throwOnFail)
    {
    return Expect(expected, throwOnFail, false);
    } public bool Expect(string expected, bool throwOnFail, bool stripTrailingWhitespace)
    {
    long pos = Position;
    string read = ReadBlock(expected.Length); if(read != expected)
    {
    Position = pos; if(throwOnFail)
    {
    throw new Exception("failed to find expected text \"" + expected + "\"");
    }
    return false;
    } while(Utility.IsWhite(PeekBlock(1)))
    {
    ReadBlock(1);
    }
    return true;
    } public void TrimFromEnd(string expected, bool leadingWhiteSpace)
    {
    long pos = Position;
    Position = Length - expected.Length;
    if(PeekBlock(expected.Length) != expected)
    {
    Position = pos;
    return;
    } while(Utility.IsWhite(PeekBlock(1)))
    {
    Position--;
    } // TODO: This is really expensive, but better ways are too hard to code for now
    long len = Position;
    Position = 0;
    MemoryStream newst = new MemoryStream();
    byte[] buf = new byte[len + 1];
    m_st.Read(buf, 0, (int) (len));
    newst.Write(buf, 0, (int) (len));
    m_st = newst;
    Position = pos;
    } // Return a given number of characters without changing the state of the stream
    public string PeekBlock(int count)
    {
    long pos = Position;
    string line = ReadBlock(count);
    Position = pos;
    return line;
    } // Read a given number of characters
    public string ReadBlock(int count)
    {
    // TODO: This can be nicer if we use an encoder as we do for FillFromString
    StringBuilder sb = new StringBuilder();
    byte[] data = new byte[count]; count = m_st.Read(data, 0, count);
    for(int i = 0; i < count; i++)
    {
    sb.Append((char) data[i]);
    } return sb.ToString();
    } public string ReadRange(long start, long end)
    {
    // TODO: This can be nicer if we use an encoder as we do for FillFromString
    long pos = Position;
    int count = (int) (end - start);
    Position = start; StringBuilder sb = new StringBuilder();
    byte[] data = new byte[count]; count = m_st.Read(data, 0, count);
    for(int i = 0; i < count; i++)
    {
    sb.Append((char) data[i]);
    } Position = pos;
    return sb.ToString();
    } // Read a line whilst not affecting the state of the stream
    public string PeekLine()
    {
    long pos = Position;
    string line = ReadLine();
    Position = pos;
    return line;
    } public string PeekLine(bool stripLeadingWhitespace, bool stripTrailingWhitespace)
    {
    long pos = Position;
    string line = ReadLine(true, true);
    Position = pos;
    return line;
    } // Read to the end of a line...
    public string ReadLine()
    {
    return ReadLine(false, false);
    } public string ReadLine(bool stripLeadingWhitespace, bool stripTrailingWhitespace)
    {
    StringBuilder line = new StringBuilder();
    byte[] data = new byte[1]; data[0] = (byte) ' ';
    if(stripLeadingWhitespace)
    {
    while((data[0] == ' ') || (data[0] == '\t'))
    {
    m_st.Read(data, 0, 1);
    if(Eof)
    {
    return line.ToString();
    }
    }
    line.Append((char) data[0]);
    } while((data[0] != '\r') && (data[0] != '\n') && !Eof)
    {
    m_st.Read(data, 0, 1);
    if((data[0] != '\r') && (data[0] != '\n'))
    {
    line.Append((char) data[0]);
    }
    } if(data[0] == '\r')
    {
    long pos = Position;
    m_st.Read(data, 0, 1);
    if(Eof)
    {
    return line.ToString();
    } if(data[0] != '\n')
    {
    Position = pos;
    }
    } if(stripTrailingWhitespace)
    {
    while(line.ToString().EndsWith(" ") || line.ToString().EndsWith(" \t"))
    {
    line.Remove(line.Length - 1, 1);
    }
    } return line.ToString();
    } public byte[] ReadLineAsBytes()
    {
    ByteBuilder line = new ByteBuilder();
    byte[] data = new byte[1]; data[0] = (byte) ' '; while((data[0] != '\r') && (data[0] != '\n') && !Eof)
    {
    m_st.Read(data, 0, 1);
    if((data[0] != '\r') && (data[0] != '\n'))
    {
    line.Append(data[0]);
    }
    } if(data[0] == '\r')
    {
    long pos = Position;
    m_st.Read(data, 0, 1); if(data[0] != '\n')
    {
    Position = pos;
    line.Append((byte) '\n');
    }
    } return line.ToBytes();
    }
    }
    }