/** * Returns the Calendar for a given COS string containing a date, * or {@code null} if it cannot be parsed. * * The returned value will have 0 for DST_OFFSET. * * @param text A COS string containing a date. * @return The Calendar that the text string represents, or {@code null} if it cannot be parsed. */ public static DateTime?toCalendar(CosString text) { if (text == null) { return(null); } return(toCalendar(text.GetString())); }
/// <summary> /// This will parse a PDF HEX string with fail fast semantic meaning that we stop if a not allowed character is found. /// This is necessary in order to detect malformed input and be able to skip to next object start. /// We assume starting '<' was already read. /// </summary> private static CosString ParseHexString(IRandomAccessRead reader) { var sBuf = new StringBuilder(); while (true) { int c = reader.Read(); if (ReadHelper.IsHexDigit((char)c)) { sBuf.Append((char)c); } else if (c == '>') { break; } else if (c < 0) { throw new IOException("Missing closing bracket for hex string. Reached EOS."); } else if (c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\b' || c == '\f') { } else { // if invalid chars was found: discard last // hex character if it is not part of a pair if (sBuf.Length % 2 != 0) { sBuf.Remove(sBuf.Length - 1, 1); } // read till the closing bracket was found do { c = reader.Read(); }while (c != '>' && c >= 0); // might have reached EOF while looking for the closing bracket // this can happen for malformed PDFs only. Make sure that there is // no endless loop. if (c < 0) { throw new IOException("Missing closing bracket for hex string. Reached EOS."); } // exit loop break; } } return(CosString.ParseHex(sBuf.ToString())); }