Выделение текста (цветов) существующего PDF с помощью iTextsharp с использованием C # - PullRequest
4 голосов
/ 21 декабря 2011

Я хотел бы знать, можем ли мы выделить текст (цвета) уже созданного PDF, используя itextsharp?

Я вижу примеры, например, создание нового PDF, но при этом мы можем применять цвета. Я ищу, где можно получить фрагменты текста из PDF, применить цвета и сохранить его.

Вот что я пытаюсь выполнить: прочитать файл PDF, разобрать текст и выделить текст на основе бизнес-правил.

Любое стороннее предложение dll также работает, в качестве первого шага, к которому я обращаюсь opensource iTextsharp library.

1 Ответ

6 голосов
/ 21 декабря 2011

Да, вы можете выделить текст, но, к сожалению, вам придется работать над этим.То, что похоже на основной момент, является аннотацией к текстовой разметке PDF, если рассматривать спецификацию.Эта часть довольно проста.Сложная часть заключается в определении координат для применения аннотации.

Вот простой код для создания выделения с использованием существующего PdfStamper с именем stamper:

PdfAnnotation highlight = PdfAnnotation.CreateMarkup(stamper.Writer, rect, null, PdfAnnotation.MARKUP_HIGHLIGHT, quad);

После того, как вывыделите цветом, который вы можете установить, используя:

highlight.Color = BaseColor.YELLOW;

, а затем добавьте его к своему stamper на странице 1, используя:

stamper.AddAnnotation(highlight,1);

Технически параметр rect не делаетНа самом деле он привыкает (насколько я могу судить) и вместо этого переопределяется параметром quad.Параметр quad представляет собой массив координат x, y, которые по существу представляют углы прямоугольника (технически четырехугольник).Спецификация говорит, что они начинаются в левом нижнем углу и идут против часовой стрелки, но в действительности они кажутся идущими снизу слева направо, справа налево вверху справа вверху.Вычисление четырехугольника - это боль, поэтому вместо этого проще создать прямоугольник и создать из него четырехугольник:

iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(60.6755f, 749.172f, 94.0195f, 735.3f);
float[] quad = { rect.Left, rect.Bottom, rect.Right, rect.Bottom, rect.Left, rect.Top, rect.Right, rect.Top };

Так как же получить прямоугольник существующего текста?Для этого вам нужно взглянуть на TextExtractionStrategy и PdfTextExtractor.Нам еще многое предстоит сделать, поэтому я начну с , указывающего вам на это сообщение , с которым связаны некоторые другие сообщения.

Ниже приводится полнофункциональное приложение WinForms на C # 2010, предназначенное для iTextSharp 5.1..1.2 это демонстрирует создание простого PDF и выделение части текста с использованием жестко закодированных координат.Если вам нужна помощь в расчете этих координат, начните с ссылки выше, а затем задавайте любые вопросы!

using System;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Create a simple test file
            string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");

            using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (Document doc = new Document(PageSize.LETTER))
                {
                    using (PdfWriter w = PdfWriter.GetInstance(doc, fs))
                    {
                        doc.Open();
                        doc.Add(new Paragraph("This is a test"));
                        doc.Close();
                    }
                }
            }

            //Create a new file from our test file with highlighting
            string highLightFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Highlighted.pdf");

            //Bind a reader and stamper to our test PDF
            PdfReader reader = new PdfReader(outputFile);

            using (FileStream fs = new FileStream(highLightFile, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (PdfStamper stamper = new PdfStamper(reader, fs))
                {
                    //Create a rectangle for the highlight. NOTE: Technically this isn't used but it helps with the quadpoint calculation
                    iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(60.6755f, 749.172f, 94.0195f, 735.3f);
                    //Create an array of quad points based on that rectangle. NOTE: The order below doesn't appear to match the actual spec but is what Acrobat produces
                    float[] quad = { rect.Left, rect.Bottom, rect.Right, rect.Bottom, rect.Left, rect.Top, rect.Right, rect.Top };

                    //Create our hightlight
                    PdfAnnotation highlight = PdfAnnotation.CreateMarkup(stamper.Writer, rect, null, PdfAnnotation.MARKUP_HIGHLIGHT, quad);

                    //Set the color
                    highlight.Color = BaseColor.YELLOW;

                    //Add the annotation
                    stamper.AddAnnotation(highlight,1);
                }
            }

            this.Close();
        }
    }
}
...