Что я имею в виду под форматом классического китайского документа?
Абзац состоит из строк, первая строка находится крайним справа, вторая строка – слева от первой строки и т. д.
Строка состоит из символов: первый символ находится вверху, второй символ находится под первым символом и т. д.
У меня есть файл 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....
Надеюсь, кто-нибудь сможет мне помочь!
Моя обновленная программа:
Что я имею в виду под [b]форматом классического китайского документа[/b]? Абзац состоит из строк, первая строка находится крайним справа, вторая строка – слева от первой строки и т. д. Строка состоит из символов: первый символ находится вверху, второй символ находится под первым символом и т. д. У меня есть файл LR-10709-24-25.pdf в [b]формате классического китайского документа[/b], мне почему-то нужно расположение текстов для анализа. [list] [*]Примените программу (см. ниже) к файлу History-2-3.pdf, который имеет обычный английский формат, и получите правильный результат: [/list] [img]https://i.sstatic.net/cw4ny98g.png[/img]
[list][*]Применил ту же программу к LR-10709-24-25.pdf, получил совершенно неверный результат: [/list] [img]https://i.sstatic.net/LVglw7dr.png[/img]
[list] [*]Я думаю речь идет о координатах, текущей матрице преобразования, textMatrix, TextRenderInfo, но мне нужна помощь, чтобы понять эти вещи с помощью этой проблемы. [/list] Вот моя программа
Вот моя программа
Вот моя программа
р> [code]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;
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 }; } } [/code] и два файла PDF history-2-3.pdf LR-10709-24-25.pdf Обновить Я по-прежнему считаю, что TextRenderInfo содержит необходимую информацию о местонахождении текста. Я обновляю свою программу (ниже). [list] [*]Используйте оператор 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: [img]https://i.sstatic.net/65laomOB.png[/img] что неверно. . Результат страницы 2 ОЧЕНЬ интересен. [img]https://i.sstatic.net/nSTMhYfP.png[/img] Внимательно смотрим на картинку. Символ красного цвета более или менее крошечный, ниже такого же символа черного цвета. Различные расстояния могут быть вызваны расстоянием между символами/словами. Пятая (считая справа) вертикальная линия наиболее понятна.
[*]Используйте оператор 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): [img]https://i.sstatic.net/bZKHE0QU.png[/img]
[/list] и новое изображение страницы 4: [img]https://i.sstatic.net/csrMKNgY.png[/img]
[b]Очень интересно[/b], это выглядит так: Сначала объедините две исходные страницы рядом, страница 2 слева, страница 1 справа. Новая страница 3 представляет собой комбинированное изображение, повернутое на 90 градусов. Новая страница 4 представляет собой комбинированное изображение, обрезанное по меньшей ширине страницы. Итак, кажется, что TextRenderInfo содержит всю необходимую информацию для [b]местоположения текста[/b]. Но, поскольку я новичок в iText, я не знаю о Координате, TextMatrix, Ctm, PdfFont, CropBox.... Надеюсь, кто-нибудь сможет мне помочь! Моя обновленная программа: [code]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;
У меня много очередей, управляемых MassTransit, использующих RabbitMq в качестве транспорта. Эти очереди в настоящее время являются классическими зеркальными очередями, и их необходимо переключить на очереди кворума. Нарушение трафика не является...
Я пытаюсь создать PDF-файл с помощью PD4ML, но при его рендеринге несколько китайских символов появляются как ? в выходном файле.
Ниже приведен фрагмент кода для справки, с помощью которого я создаю PDF-файл.
try {
// Initialize PD4ML
PD4ML pd4ml =...
Я пытаюсь создать PDF-файл с помощью PD4ML, но при его рендеринге несколько китайских символов появляются как ? в выходном файле.
Ниже приведен фрагмент кода для справки, с помощью которого я создаю PDF-файл.
try {
// Initialize PD4ML
PD4ML pd4ml =...
Я столкнулся с проблемой отображения китайских символов в виджетах Tkinter на моем Raspberry Pi Zero 2 W. Хотя заголовок окна и терминал правильно отображают китайские символы, такие виджеты, как «Метка» и «Текст», отображают...
Я столкнулся с проблемой отображения китайских символов в виджетах Tkinter на моем Raspberry Pi Zero 2 W. Хотя заголовок окна и терминал правильно отображают китайские символы, такие виджеты, как «Метка» и «Текст», отображают...