// 完毕:
using System;
using System.IO;
using System.Drawing;
using System.Linq;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.TextMap;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Pdf.Annotations;
using System.Threading;
using System.Collections.Generic;
using GrapeCity.Documents.Common;
namespace DsPdfWeb.Demos
{
// This example shows how to strikeout a paragraph starting with a certain phrase
// ("Several species") using the text markup strikeout annotation.
public class StrikeoutParagraph
{
public int CreatePDF(Stream stream)
{
// Load the PDF:
var doc = new GcPdfDocument();
using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "Wetlands.pdf"));
doc.Load(fs);
// Strikeout the first paragraph that starts with the words "Several species":
ITextParagraph para = null;
foreach (var p in doc.Pages)
{
var paras = p.GetTextMap().Paragraphs;
para = paras.FirstOrDefault(p_ => p_.GetText().StartsWith("Several species"));
if (para != null)
break;
}
if (para == null)
return doc.Pages.Count; // Should not happen.
// Text markup strikeout annotation:
var markup = new TextMarkupAnnotation()
{
Page = para.Page,
MarkupType = TextMarkupType.StrikeOut,
Color = Color.Red
};
// Get the coordinates of all text run fragments in the paragraph,
// and add them to the annotation's area:
List<Quadrilateral> area = new List<Quadrilateral>();
foreach (var run in para.Runs)
{
foreach (var frag in run)
{
// Note: in v6.0.3 a method ITextRunFragment.GetBounds() was added,
// so this code can be replaced with a single 'frag.GetBounds()' call.
// Find the text run fragment's index in the containing line:
int index = 0;
var line = frag.Line;
var frags = line.RunFragments;
for (int i = 0; i < frags.Count && frags[i] != frag; ++i)
index += frags[i].Count;
// Add the fragment's bounds (quadrilateral) to the annotation area:
area.Add(frag.Line.GetCoords(index, frag.Count));
}
}
markup.Area = area;
// Done:
doc.Save(stream);
return doc.Pages.Count;
}
}
}