IText7 Как получить расположение текстов в формате классических китайских документов?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 IText7 Как получить расположение текстов в формате классических китайских документов?

Сообщение Anonymous »

Что я имею в виду под форматом классического китайского документа?
Абзац состоит из строк, первая строка находится крайним справа, вторая строка – слева от первой строки и т. д.
Строка состоит из символов: первый символ находится вверху, второй символ находится под первым символом и т. д.
У меня есть файл LR-10709-24-25.pdf в формате классического китайского документа, мне почему-то нужно расположение текстов для анализа.
  • Примените программу (см. ниже) к файлу History-2-3.pdf, который имеет обычный английский формат, и получите правильный результат:
Изображение
  • Применил ту же программу к LR-10709-24-25.pdf, получил совершенно неверный результат:
Изображение
  • Я думаю речь идет о координатах, текущей матрице преобразования, textMatrix, TextRenderInfo, но мне нужна помощь, чтобы понять эти вещи с помощью этой проблемы.
Вот моя программа

Вот моя программа

Вот моя программа

р>

Код: Выделить всё

using iText.Kernel.Colors;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Data;
using iText.Kernel.Pdf.Canvas.Parser.Listener;
using System.Text;

string srcFileName = "LR-10709-24-25.pdf";
string destFileName = "LR-10709-24-25-enclose.pdf";
//string srcFileName = "history-2-3.pdf";
//string destFileName = "history-2-3-enclose.pdf";
PdfDocument pdfDoc = new PdfDocument(new PdfReader(srcFileName), new PdfWriter(destFileName));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pdfDoc.GetNumberOfPages(); i++)
{
SimplePositionalTextEventListener listener = new SimplePositionalTextEventListener();
new PdfCanvasProcessor(listener).ProcessPageContent(pdfDoc.GetPage(i + 1));
List result = listener.GetResultantTextWithPosition();
int R = 0, G = 0, B = 0;
foreach (SimpleTextWithRectangle textWithRectangle in result)
{
R += 40; R = R % 256;
G += 20; G = G % 256;
B += 80; B = B % 256;
PdfCanvas canvas = new PdfCanvas(pdfDoc.GetPage(i + 1));
canvas.SetStrokeColor(new DeviceRgb(R, G, B));
var rect = textWithRectangle.GetRectangle();
canvas.Rectangle(rect);
canvas.Stroke();
}
}
pdfDoc.Close();

Console.WriteLine("Press any key to continue!");
Console.ReadKey();

class SimpleTextWithRectangle
{
private Rectangle rectangle;
private string text;

public SimpleTextWithRectangle(Rectangle rectangle, String text)
{
this.rectangle = rectangle;
this.text = text;
}

public Rectangle GetRectangle()
{
return rectangle;
}
public string GetText()
{
return text;
}
}

class SimplePositionalTextEventListener : IEventListener
{
private List textWithRectangleList = new List();
private void renderText(TextRenderInfo renderInfo)
{
if (renderInfo.GetText().Trim().Length == 0)
return;
LineSegment ascent = renderInfo.GetAscentLine();
LineSegment descent = renderInfo.GetDescentLine();
float initX = descent.GetStartPoint().Get(0);
float initY = descent.GetStartPoint().Get(1);
float endX = ascent.GetEndPoint().Get(0);
float endY = ascent.GetEndPoint().Get(1);

Rectangle rectangle = new Rectangle(initX, initY, endX - initX, endY - initY);

SimpleTextWithRectangle textWithRectangle = new SimpleTextWithRectangle(rectangle, renderInfo.GetText());
textWithRectangleList.Add(textWithRectangle);
}

public List GetResultantTextWithPosition()
{
return textWithRectangleList;
}
public void EventOccurred(IEventData data, EventType type)
{
renderText((TextRenderInfo)data);
}

public ICollection GetSupportedEvents()
{
return new List  { EventType.RENDER_TEXT };
}
}
и два файла PDF
history-2-3.pdf
LR-10709-24-25.pdf
Обновить
Я по-прежнему считаю, что TextRenderInfo содержит необходимую информацию о местонахождении текста.
Я обновляю свою программу (ниже).
  • Используйте оператор Utils.Enclose("LR-10709-24-25.pdf", "LR-10709-24-25-enclose.pdf"); чтобы создать файл LR-10709-24-25-enclose.pdf с неправильным расположением прямоугольников, как и раньше.
  • Используйте оператор Utils.DoubleWrite( "LR-10709-24-25.pdf", "LR-10709-24-25-dup.pdf") для создания файла LR-10709-24-25-dup.pdf, который использует PdfCanvas.ShowText метод для записи текста (красного цвета) с информацией TextRenderInfo.TextMatrix поверх исходного содержимого. Верхняя часть страницы 1:
    Изображение
    что неверно. .
    Результат страницы 2 ОЧЕНЬ интересен.
    Изображение
    Внимательно смотрим на картинку. Символ красного цвета более или менее крошечный, ниже такого же символа черного цвета. Различные расстояния могут быть вызваны расстоянием между символами/словами. Пятая (считая справа) вертикальная линия наиболее понятна.
  • Используйте оператор Utils.AppendPage("LR-10709-24-25 .pdf", "LR-10709-24-25-append.pdf"); для создания файла LR-10709-24-25-append.pdf, который добавляет две страницы с использованием метода PdfCanvas.ShowText для записи текста. (красным цветом) с информацией TextRenderInfo.TextMatrix. Страница 1/2 такая же, как страница 1/2 исходного PDF-файла. Вот новая страница 3 (с использованием TextRenderInfo исходной страницы 1):
    Изображение
и новое изображение страницы 4:
Изображение

Очень интересно, это выглядит так:
Сначала объедините две исходные страницы рядом, страница 2 слева, страница 1 справа. Новая страница 3 представляет собой комбинированное изображение, повернутое на 90 градусов. Новая страница 4 представляет собой комбинированное изображение, обрезанное по меньшей ширине страницы.
Итак, кажется, что TextRenderInfo содержит всю необходимую информацию для местоположения текста. Но, поскольку я новичок в iText, я не знаю о Координате, TextMatrix, Ctm, PdfFont, CropBox....
Надеюсь, кто-нибудь сможет мне помочь!
Моя обновленная программа:

Код: Выделить всё

using iText.Kernel.Colors;
using iText.Kernel.Font;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Data;
using iText.Kernel.Pdf.Canvas.Parser.Listener;

Utils.Enclose("LR-10709-24-25.pdf", "LR-10709-24-25-enclose.pdf");
Utils.DoubleWrite("LR-10709-24-25.pdf", "LR-10709-24-25-dup.pdf");
Utils.AppendPage("LR-10709-24-25.pdf", "LR-10709-24-25-append.pdf");

Console.WriteLine("Press any key to continue 123!");
Console.ReadKey();

class Utils
{
public static void Enclose(string srcFileName, string destFileName)
{
//string srcFileName = "LR-10709-24-25.pdf";
//string destFileName = "LR-10709-24-25-enclose.pdf";
//string srcFileName = "history-2-3.pdf";
//string destFileName = "history-2-3-enclose.pdf";
PdfDocument pdfDoc = new PdfDocument(new PdfReader(srcFileName), new PdfWriter(destFileName));
for (int i = 0; i < pdfDoc.GetNumberOfPages(); i++)
{
SimpleTextEventListener listener = new SimpleTextEventListener();
new PdfCanvasProcessor(listener).ProcessPageContent(pdfDoc.GetPage(i + 1));
List textInfos = listener.GetTextInfos();
PdfCanvas canvas = new PdfCanvas(pdfDoc.GetPage(i + 1));
int R = 0, G = 0, B = 0;
foreach (SimpleTextInfo textInfo in textInfos)
{
R += 40; R = R % 256;
G += 20; G = G % 256;
B += 80; B = B % 256;
canvas.SetStrokeColor(new DeviceRgb(R, G, B));
var rect = textInfo.GetRectangle();
canvas.Rectangle(rect);
canvas.Stroke();
}
}
pdfDoc.Close();
}
public static void DoubleWrite(string srcFileName, string destFileName)
{
PdfDocument pdfDoc = new PdfDocument(new PdfReader(srcFileName), new PdfWriter(destFileName));
for (int i = 0; i < pdfDoc.GetNumberOfPages(); i++)
{
SimpleTextEventListener listener = new SimpleTextEventListener();
new PdfCanvasProcessor(listener).ProcessPageContent(pdfDoc.GetPage(i + 1));
List textInfos = listener.GetTextInfos();
PdfCanvas canvas = new PdfCanvas(pdfDoc.GetPage(i + 1));
foreach (SimpleTextInfo textInfo in textInfos)
{
canvas.SaveState();
canvas.SetColor(ColorConstants.RED, true);
canvas.SetFontAndSize(textInfo.GetFont(), textInfo.GetFontSize());
canvas.BeginText();
Matrix textMatrix = textInfo.GetTextMatrix();
canvas.SetTextMatrix(textMatrix.Get(0), textMatrix.Get(1), textMatrix.Get(3), textMatrix.Get(4), textMatrix.Get(6), textMatrix.Get(7))
.ShowText(textInfo.GetText());
canvas.EndText();
canvas.RestoreState();
}
}
pdfDoc.Close();
}
public static void AppendPage(string srcFileName, string destFileName)
{
PdfDocument pdfDoc = new PdfDocument(new PdfReader(srcFileName), new PdfWriter(destFileName));
int n = pdfDoc.GetNumberOfPages();
for (int i = 0; i < n; i++)
{
SimpleTextEventListener listener = new SimpleTextEventListener();
var page = pdfDoc.GetPage(i + 1);
new PdfCanvasProcessor(listener).ProcessPageContent(page);
List  textInfos = listener.GetTextInfos();
var newPage = pdfDoc.AddNewPage();
PdfCanvas canvas = new PdfCanvas(newPage);
foreach (SimpleTextInfo textInfo in textInfos)
{
canvas.SaveState();
canvas.SetColor(ColorConstants.RED, true);
canvas.SetFontAndSize(textInfo.GetFont(), textInfo.GetFontSize());
canvas.BeginText();
Matrix textMatrix = textInfo.GetTextMatrix();
canvas.SetTextMatrix(textMatrix.Get(0), textMatrix.Get(1), textMatrix.Get(3), textMatrix.Get(4), textMatrix.Get(6), textMatrix.Get(7))
.ShowText(textInfo.GetText());
canvas.EndText();
canvas.RestoreState();
}
}
pdfDoc.Close();
}
}

class SimpleTextInfo
{
private Rectangle rectangle;
private string text;
private PdfFont font;
private float fontSize;
private Matrix textMatrix;
private Matrix canvasMatrix;
public SimpleTextInfo(Rectangle rectangle, String text, PdfFont font, float fontSize, Matrix textMatrix, Matrix canvasMatrix)
{
this.rectangle = rectangle;
this.text = text;
this.font = font;
this.fontSize = fontSize;
this.textMatrix = textMatrix;
this.canvasMatrix = canvasMatrix;
}
public Rectangle GetRectangle()
{
return rectangle;
}
public string GetText()
{
return text;
}
public PdfFont GetFont()
{
return font;
}
public float GetFontSize()
{
return fontSize;
}
public Matrix GetTextMatrix()
{
return textMatrix;
}
public Matrix GetCanvasMatrix()
{
return canvasMatrix;
}
}

class SimpleTextEventListener : IEventListener
{
private List simpleTextInfos = new List();
private void renderText(TextRenderInfo renderInfo)
{
if (renderInfo.GetText().Trim().Length == 0)
return;
LineSegment ascent = renderInfo.GetAscentLine();
LineSegment descent = renderInfo.GetDescentLine();
float initX = descent.GetStartPoint().Get(0);
float initY = descent.GetStartPoint().Get(1);
float endX = ascent.GetEndPoint().Get(0);
float endY = ascent.GetEndPoint().Get(1);
Rectangle rectangle = new Rectangle(initX, initY, endX - initX, endY - initY);
SimpleTextInfo textInfo = new SimpleTextInfo(rectangle, renderInfo.GetText(), renderInfo.GetFont(), renderInfo.GetFontSize(), renderInfo.GetTextMatrix(), renderInfo.GetGraphicsState().GetCtm());
simpleTextInfos.Add(textInfo);
}
public List GetTextInfos()
{
return simpleTextInfos;
}
public void EventOccurred(IEventData data, EventType type)
{
renderText((TextRenderInfo)data);
}
public ICollection GetSupportedEvents()
{
return new List { EventType.RENDER_TEXT };
}
}
Два файла результатов в формате PDF: LR-10709-24-25-dup.pdf и LR-10709-24-25-append.pdf

Подробнее здесь: https://stackoverflow.com/questions/784 ... -documents
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»