Esempio n. 1
0
        public static void RedactCharacters(Doc doc, IList <TextFragment> fragments)
        {
            if (fragments.Count == 0)
            {
                return;
            }
            ResourceTracker tracker = new ResourceTracker(doc);
            Dictionary <int, List <TextFragment> > streams = new Dictionary <int, List <TextFragment> >();

            foreach (TextFragment fragment in fragments)
            {
                List <TextFragment> redactions = null;
                int id = tracker.CopyOnWrite(fragment.StreamID, fragment.PageID);
                streams.TryGetValue(id, out redactions);
                if (redactions == null)
                {
                    redactions  = new List <TextFragment>();
                    streams[id] = redactions;
                }
                redactions.Add(fragment);
            }
            foreach (KeyValuePair <int, List <TextFragment> > pair in streams)
            {
                // get data
                StreamObject stream = doc.ObjectSoup[pair.Key] as StreamObject;
                Debug.Assert(stream != null);             // should never happen
                stream.Decompress();                      // shouldn't really be necessary
                Debug.Assert(stream.Compressed == false); // should never happen
                byte[] data = stream.GetData();
                // construct new stream
                List <TextFragment> redactions = pair.Value;
                redactions.Sort((x, y) => x.StreamOffset.CompareTo(y.StreamOffset));
                MemoryStream mem = new MemoryStream(data.Length);
                int          p   = 0;
                for (int i = 0; i < redactions.Count; i++)
                {
                    TextFragment   redaction = redactions[i];
                    RedactionGroup group     = new RedactionGroup(data);
                    for (int j = i; j < redactions.Count; j++)
                    {
                        if (!group.Add(redactions[j]))
                        {
                            i = j - 1;
                            break;
                        }
                    }
                    if (p < redaction.StreamOffset)
                    {
                        mem.Write(data, p, redaction.StreamOffset - p);
                        byte[] tjBytes = group.GetTextOperator().GetData();
                        mem.Write(tjBytes, 1, tjBytes.Length - 2);
                    }
                    p = redaction.StreamOffset + redaction.StreamLength;
                }
                mem.Write(data, p, data.Length - p);
                stream.SetData(mem.ToArray());
            }
        }
Esempio n. 2
0
 public void Delete()
 {
     foreach (KeyValuePair <int, List <ImageRendition> > pair in _redactions)
     {
         StreamObject          so         = (StreamObject)_doc.ObjectSoup[pair.Key];
         List <ImageRendition> renditions = pair.Value;
         renditions.Sort((i1, i2) => { return(i1.StreamOffset.CompareTo(i2.StreamOffset)); });
         if (!so.Decompress())
         {
             throw new ArgumentException("Unable to decompress stream.");
         }
         byte[] data = so.GetData();
         foreach (ImageRendition rendition in renditions)
         {
             for (int i = 0; i < rendition.StreamLength; i++)
             {
                 data[i + rendition.StreamOffset] = 0x20;                         // space
             }
         }
         so.SetData(data);
         so.CompressFlate();
     }
 }
Esempio n. 3
0
        public static void RedactTextOps(Doc doc, IList <TextFragment> fragments)
        {
            if (fragments.Count == 0)
            {
                return;
            }
            ResourceTracker tracker = new ResourceTracker(doc);
            Dictionary <int, List <TextFragment> > streams = new Dictionary <int, List <TextFragment> >();

            foreach (TextFragment fragment in fragments)
            {
                List <TextFragment> redactions = null;
                int id = tracker.CopyOnWrite(fragment.StreamID, fragment.PageID);
                streams.TryGetValue(id, out redactions);
                if (redactions == null)
                {
                    redactions  = new List <TextFragment>();
                    streams[id] = redactions;
                }
                redactions.Add(fragment);
            }
            foreach (KeyValuePair <int, List <TextFragment> > pair in streams)
            {
                // get data
                StreamObject stream = doc.ObjectSoup[pair.Key] as StreamObject;
                Debug.Assert(stream != null);             // should never happen
                stream.Decompress();                      // shouldn't really be necessary
                Debug.Assert(stream.Compressed == false); // should never happen
                byte[] data = stream.GetData();
                // construct new stream
                List <TextFragment> redactions = pair.Value;
                redactions.Sort((x, y) => x.StreamOffset.CompareTo(y.StreamOffset));
                MemoryStream mem = new MemoryStream(data.Length);
                int          p   = 0;
                foreach (TextFragment redaction in redactions)
                {
                    if (p < redaction.StreamOffset)
                    {
                        mem.Write(data, p, redaction.StreamOffset - p);
                        IDictionary <char, int> widths = redaction.Font.Widths;
                        int defaultWidth = doc.GetInfoInt(redaction.Font.ID, "/DescendantFonts[0]*/DW*");
                        if (defaultWidth == 0)
                        {
                            defaultWidth = 1000;
                        }
                        int width1000ths = 0;
                        foreach (char c in redaction.Text)
                        {
                            int width = 0;
                            if (!widths.TryGetValue(c, out width))
                            {
                                width = defaultWidth;
                            }
                            width1000ths += defaultWidth;
                        }
                        string tj      = string.Format("[{0}] TJ\r\n", width1000ths);
                        byte[] tjBytes = ASCIIEncoding.ASCII.GetBytes(tj);
                        mem.Write(tjBytes, 0, tjBytes.Length);
                    }
                    p = redaction.StreamOffset + redaction.StreamLength;
                }
                mem.Write(data, p, data.Length - p);
                stream.SetData(mem.ToArray());
            }
        }