Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> iText: чтение русскоязычных страниц, Проблема чтения русскоязычных pdf файлов 
:(
    Опции темы
Goliath
Дата 19.4.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 1.3.2005

Репутация: 1
Всего: 5



Привет, всем.  Возникла проблема с чтением русскоязычных pdf файлов при использование iText. Ниже приведу простой код. В google и т.п. просмотрел все, такое чувство, что все генерируют, но ни кто не парсит русскоязычные pdf.

Код

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

import com.lowagie.text.pdf.PRStream;
import com.lowagie.text.pdf.PRTokeniser;
import com.lowagie.text.pdf.PdfDictionary;
import com.lowagie.text.pdf.PdfIndirectReference;
import com.lowagie.text.pdf.PdfLister;
import com.lowagie.text.pdf.PdfName;
import com.lowagie.text.pdf.PdfReader;

public class PDFParser
{
    
    public static void main(String arg[])
    {
        String result = "";
        try 
        {
            //InputStreamReader in = new InputStreamReader(new FileInputStream("D:\\2.pdf"), "windows-1251");
            InputStream in =  new FileInputStream("D:\\5.pdf");
            
            PdfReader reader = new PdfReader(in);
            
            System.out.println(reader.getInfo());
            
            PrintStream list = new PrintStream(new FileOutputStream("objects.txt"));
            PdfLister lister = new PdfLister(new PrintStream(list));
            
            System.out.println("Количество страниц: "+reader.getNumberOfPages());
            
            PdfDictionary trailer = reader.getPageN(1);
            //ByteBuffer b = ByteBuffer.allocate(Byte.SIZE);
            //String a = new String(reader.getPageContent(1), "utf8");
            //System.out.println(a);
            
            PdfIndirectReference content_ref = (PdfIndirectReference) trailer.get(PdfName.CONTENTS);
            PRStream content =    (PRStream)reader.getPdfObject(content_ref.getNumber());
            lister.listDict(content);
            
            byte[] contentstream = PdfReader.getStreamBytes(content);
            
            PRTokeniser tokenizer = new PRTokeniser(contentstream);
        //    OutputStreamWriter out = new OutputStreamWriter (list);
            
            while (tokenizer.nextToken()) 
            {
                if (tokenizer.getTokenType() == PRTokeniser.TK_STRING) 
                {
                    String t = tokenizer.getStringValue();
                    result+=t+" ";
                    //lister.listDict(tokenizer.get)
                }
            }
        
            System.out.println(result);
            list.println(result);

        } catch (Exception e) {
            e.printStackTrace();
        }
        
        ////////////////DB part
        Connection conn = null;

        try
        {
            String userName = "root";
            String password = "1";
          
            String url = "jdbc:mysql://localhost:3306/test_db?user="
                            + userName
                            + "&password="
                            + password;
           
            Class.forName ("com.mysql.jdbc.Driver").newInstance ();
            conn = DriverManager.getConnection (url);
            
            System.out.println ("Database connection established");
            
            Statement s = conn.createStatement ();
            s.execute("INSERT INTO test SET content = '"+result+"'");
            s.close ();
        }
        catch (Exception e)
        {
            System.err.println ("Cannot connect to database server");
            System.err.println (e.toString());
        }
        finally
        {
            if (conn != null)
            {
                try
                {
                    conn.close ();
                    System.out.println ("Database connection terminated");
                }
                catch (Exception e) { /* ignore close errors */ }
            }
        }


    }
}

--------------------
Наша жизнь растрачивается на мелочи… Упрощайте, упрощайте. [Генри Торо] 
PM MAIL   Вверх
Hidrag
Дата 19.4.2008, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: 3
Всего: 25



Ой.... тоже недавно воевал с пдф через эту либу, бой был проигран, война временно заморожена.
Еще есть проблема, с заменой текста, так например если "слово" было написано большими буквами латинского алфавита, то и заменить его можно только на слово большими буквами латинского алфавита. Вставка слов на русском языке вообще не работала :(  Время было мало, решили отказаться от пдф, но вопрос остался...

Попробуй еще добавить строку, может поможет:
Код

FontFactory.registerDirectory("C:\\WINDOWS\\Fonts");

для винды... для других систем другой путь будет.


--------------------
user posted image
PM WWW ICQ   Вверх
Goliath
Дата 19.4.2008, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 1.3.2005

Репутация: 1
Всего: 5



Это только помогает, когда нужно генерировать pdf, а при парсинге шрифт вообще указывать не нужно. Ниже код для формирования:

Код

Document document = new Document();
...
String FONT_LOCATION =      "tahoma.ttf";
BaseFont baseFont = BaseFont.createFont(FONT_LOCATION, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

Font font = new Font(baseFont, Font.DEFAULTSIZE, Font.NORMAL);

document.add(new Paragraph("Русский", font));
...

Но вот как отпарсить? Я думаю это проблема при чтенее файла, но PdfReader не поддерживает FileInputStream :(
--------------------
Наша жизнь растрачивается на мелочи… Упрощайте, упрощайте. [Генри Торо] 
PM MAIL   Вверх
Goliath
Дата 21.4.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 1.3.2005

Репутация: 1
Всего: 5



Ребята у кого есть опыт по кодировкам дайте советы, плз...

Это сообщение отредактировал(а) Goliath - 22.4.2008, 16:22
--------------------
Наша жизнь растрачивается на мелочи… Упрощайте, упрощайте. [Генри Торо] 
PM MAIL   Вверх
Goliath
Дата 22.4.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 1.3.2005

Репутация: 1
Всего: 5



Я готов заплатить за помощь в данном вопросе... я перепробовал все, что знал, свой парсер писать не серьезно и времени столько нету...
--------------------
Наша жизнь растрачивается на мелочи… Упрощайте, упрощайте. [Генри Торо] 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0650 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.