Вопрос по pdf, c# – Чтение PDF-содержимого с помощью iTextSharp в C #

5

Я использую этот код для чтения содержимого PDF с помощью iTextSharp. он работает нормально, когда контент английский, но не работает, если контент персидский или арабский
 Результат примерно такой:
Вот образец неанглийского PDF для теста.

َٛنا Ùٔب٘طث یؿیٛ٘ زؾا ÙÙ›ÙØ­Ù” قٛمح یٔبٕس © Karl Seguin foppersian.codeplex.com www.codebetter.com 1 1 Ùٔب٘طث َٛنا یؿیٛ٘

همانرب لوصا یسیون  مرن دیلوت رتهب رازÙا

Каково решение ?

  public string ReadPdfFile(string fileName)
        {
            StringBuilder text = new StringBuilder();

            if (File.Exists(fileName))
            {
                PdfReader pdfReader = new PdfReader(fileName);

                for (int page = 1; page <= pdfReader.NumberOfPages; page++)
                {
                    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                    string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

                    currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.UTF8.GetBytes(currentText)));
                    text.Append(currentText);
                    pdfReader.Close();
                }
            }
            return text.ToString();
        }
See this answer для примера. Но даже тогдаwas проблема (IIRC с 5.1.2), потому что персидский / арабский языки - справа налево. Предлагаем вам попробовать последний выпуск или SVN и посмотреть, была ли проблема решена. kuujinbo
проверьте этот вопрос, который может помочь вамstackoverflow.com/questions/16080741/… Mohamed Salah
Я думаю, что для арабских символов, это печать их соответствующих символов Юникода. Так что перед печатью вам необходимо преобразовать их в обычную строку / символ. vikiiii
@vikiiii Спасибо, у вас есть идеи, как мне это сделать? Shahin

Ваш Ответ

1   ответ
13

you have a stringи это Unicode,always, Фактическая реализация в памяти - UTF-16, но это не имеет значения. Никогда, никогда, никогда не разбивайте строку на байты и пытайтесь переосмыслить ее как другую кодировку и отбросить ее обратно как строку, потому что это не имеет смысла и почти всегда терпит неудачу.

Ваша проблема в этой строке:

currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.UTF8.GetBytes(currentText)));

Я собираюсь разделить его на несколько строк, чтобы проиллюстрировать:

byte[] bytes = Encoding.UTF8.GetBytes("ی"); //bytes now holds 0xDB8C
byte[] converted = Encoding.Convert(Encoding.Default, Encoding.UTF8, bytes);//converted now holds 0xC39BC592
string final = Encoding.UTF8.GetString(converted);//final now holds ی

Код перепутает что-либо выше барьера 127 ASCII. Отбросьте строку перекодировки, и все будет хорошо.

Отметим, что вполне возможно, что то, что создает строку, делает это неправильно, что на самом деле не так уж и редко. Но вам нужно решить эту проблемуbefore это становитсяstringнаbyte уровень.

EDIT

Код должен быть таким же, как ваш, за исключением того, что одна строка должна быть удалена. Кроме того, что бы вы ни использовали для отображения текста, убедитесь, что оно поддерживает Unicode. Также, как сказал @kuujinbo, убедитесь, что вы используете последнюю версию iTextSharp. Я проверял это с 5.2.0.0.

    public string ReadPdfFile(string fileName) {
        StringBuilder text = new StringBuilder();

        if (File.Exists(fileName)) {
            PdfReader pdfReader = new PdfReader(fileName);

            for (int page = 1; page <= pdfReader.NumberOfPages; page++) {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

                text.Append(currentText);
            }
            pdfReader.Close();
        }
        return text.ToString();
    }

EDIT 2

Приведенный выше код устраняет проблему кодирования, но не определяет порядок самих строк. К сожалению, эта проблема, похоже, находится на самом уровне PDF.

Consequently, showing text in such right-to-left writing systems requires either positioning each glyph individually (which is tedious and costly) or representing text with show strings (see 9.2, “Organization and Use of Fonts”) whose character codes are given in reverse order.

PDF 2008 Spec - 14.8.2.3.3 - Строки в обратном порядке

При переупорядочении строк, таких как указано выше, контент (если я правильно понимаю спецификацию) должен использовать «помеченный контент». раздел,BMC, Однако несколько образцов PDF, которые я просматривал и генерировал, по-видимому, на самом деле не делают этого. Я абсолютно могу ошибаться в этой части, потому что это очень не моя специальность, поэтому вам придется больше возиться.

Error: User Rate Limit Exceeded Shahin
Error: User Rate Limit Exceeded Shahin
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/15385270/…Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededhttp://stackoverflow.com/questions/6882098/how-can-i-get-text-formatting-with-itextsharpError: User Rate Limit Exceededthis.result.Append(renderInfo.GetText());Error: User Rate Limit Exceededvar text = renderInfo.GetText(); text = String.Join(string.Empty, text.Reverse()); this.result.Append(text);Error: User Rate Limit Exceeded

Похожие вопросы