Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > iText: чтение русскоязычных страниц


Автор: Goliath 19.4.2008, 19:20
Привет, всем.  Возникла проблема с чтением русскоязычных 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 */ }
            }
        }


    }
}

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

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

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

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

Автор: Goliath 19.4.2008, 21:09
Это только помогает, когда нужно генерировать 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 :(

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

Автор: Goliath 22.4.2008, 16:25
Я готов заплатить за помощь в данном вопросе... я перепробовал все, что знал, свой парсер писать не серьезно и времени столько нету...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)