Acentuacao se Perde quando salvo via Java um arquivo BrOffice [RESOLVIDO]

Pessoal fiz um programa que esta dezipando um arquivo .odt salvando todo o conteudo desse arquivo + um conteudo que eh inserdio no comeco, num novo arquivo

soh que os acentos estao se perdendo quando eu salvo no novo documento (SOH NO LINUX) … quando eu rodo o programa no windows ele mante os acentos mas quando eu rodo a aplicacao no linux os acentos esta se transformando em ??

jah tentei mudar TODOS os encodings do projeto alternei entre ISO-8859-1 e UTF-8 … nenhum dos dois funcionou

estou usando para desenvolver o netbeans 6.1 a jvm aqui eh a versao 1.6.alguma coisa, versao do servidor de aplicacao eh o tamcat 6

vou o trecho do codigo onde ele esta fazendo a copia

[code]public boolean InsertDocNumber(String fileName, String docnumber) {

    BufferedReader in = null;
    try {
        in = new BufferedReader(new FileReader(fileName));
        String aux        = "";
        String replace    = "";
        String newcontent = "";
        String oldcontent = "";
        String regex      = "";
        int[] vectorStartIndex = new int[2];
        Pattern pattern;
        Matcher matcher;

        while ((aux = in.readLine()) != null) {
            oldcontent += aux;
        }
        in.close();
        newcontent = oldcontent;

        regex = "</office:automatic-styles>";
        pattern = Pattern.compile(regex);
        matcher = pattern.matcher(newcontent);
        replace =
                new StringBuilder()
                .append("<style:style style:name=\"primeiraPaginaNumero8745\" style:family=\"text\">")
                .append(" <style:text-properties fo:font-variant=\"normal\" fo:text-transform=\"none\"")
                .append(" fo:color=\"#000000\" style:text-line-through-style=\"none\"")
                .append(" style:text-position=\"0% 100%\" style:font-name=\"Times New Roman7\"")
                .append(" fo:font-size=\"12pt\" fo:letter-spacing=\"normal\" fo:language=\"pt\" fo:country=\"BR\"")
                .append(" fo:font-style=\"normal\" style:text-underline-style=\"none\" fo:font-weight=\"normal\"")
                .append(" fo:background-color=\"transparent\" style:text-rotation-angle=\"0\"")
                .append(" style:text-rotation-scale=\"line-height\" style:font-relief=\"none\"/>")
                .append("</style:style>")
                .append(regex)
                .toString();
        newcontent = matcher.replaceFirst(replace);

        vectorStartIndex[0] = oldcontent.indexOf("<text:p");
        vectorStartIndex[1] = oldcontent.indexOf("<text:h");
        int first = firstIndex(vectorStartIndex);

        switch (first) {
            case 0:
                //System.out.println("Caso 1");
                regex = "<text:p[^>]*>";
                pattern = Pattern.compile(regex);
                matcher = pattern.matcher(newcontent);
                if (matcher.find()) {
                    String group = matcher.group();
                    int start = matcher.start();
                    if (group.contains("/>")) {
                        //System.out.println("START: " + matcher.start());
                        //System.out.println("END: " + matcher.end());
                        //System.out.println(group.substring(0, group.indexOf("/>")));
                        replace = 
                                new StringBuilder()
                                    .append(group.substring(0, group.indexOf("/>")))
                                    .append("><text:span text:style-name=\"primeiraPaginaNumero8745\">")
                                    .append("Numero do Documento: ")
                                    .append(docnumber)
                                    .append("<text:line-break/></text:span></text:p>")
                                    .toString();
                        //System.out.println("REPLACE: " + replace);
                        newcontent = newcontent.replaceFirst(group, replace);
                    } else {
                        replace =
                                new StringBuilder()
                                    .append(group)
                                    .append("<text:span text:style-name=\"primeiraPaginaNumero8745\">")
                                    .append("Numero do Documento: ")
                                    .append(docnumber)
                                    .append("<text:line-break/></text:span>")
                                    .toString();
                        //System.out.println("REPLACE: " + replace);
                        newcontent = newcontent.replaceFirst(group, replace);
                        int endParagraph = newcontent.indexOf("</text:p", start);
                        int firstPicture = newcontent.indexOf("<draw", start);
                        if (firstPicture < endParagraph) {
                            replace = "anchor-type=\"text\"";
                            //System.out.println(replace);
                            newcontent = newcontent.replaceFirst("anchor-type=\"paragraph\"", replace);
                        }
                    }
                }
                break;
            case 1:
                //System.out.println("Caso 2");
                regex = "<text:h[^>]*>";
                pattern = Pattern.compile(regex);
                matcher = pattern.matcher(newcontent);
                if (matcher.find()) {
                    String group = matcher.group();
                    int start = matcher.start();
                    if (group.contains("/>")) {
                        //System.out.println("START: " + start);
                        //System.out.println("END: " + matcher.end());
                        //System.out.println(group.substring(0, group.indexOf("/>")));
                        replace =
                                new StringBuilder()
                                    .append(group.substring(0, group.indexOf("/>")))
                                    .append("><text:span text:style-name=\"primeiraPaginaNumero8745\">")
                                    .append("Numero do Documento: ")
                                    .append(docnumber)
                                    .append("<text:line-break/></text:span></text:h>")
                                    .toString();
                        //System.out.println("REPLACE: " + replace);
                        newcontent = newcontent.replaceFirst(group, replace);
                    } else {
                        replace =
                                new StringBuilder()
                                    .append(group)
                                    .append("<text:span text:style-name=\"primeiraPaginaNumero8745\">")
                                    .append("Numero do Documento: ")
                                    .append(docnumber)
                                    .append("<text:line-break/></text:span>")
                                    .toString();
                        //System.out.println("REPLACE: " + replace);
                        newcontent = newcontent.replaceFirst(group, replace);
                        int endParagraph = newcontent.indexOf("</text:h", start);
                        int firstPicture = newcontent.indexOf("<draw", start);
                        if (firstPicture < endParagraph) {
                            replace = "anchor-type=\"text\"";
                            //System.out.println(replace);
                            newcontent = newcontent.replaceFirst("anchor-type=\"paragraph\"", replace);
                        }
                    }
                }
                break;
            default:
                //System.out.println("Caso 3");
                break;
        }

        BufferedWriter on = new BufferedWriter(new FileWriter(fileName));
        on.write(newcontent);
        on.close();
        return true;
    } catch (FileNotFoundException ex) {
        Logger.getLogger(OdtNumberGenerator.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    } catch (IOException ex) {
        Logger.getLogger(OdtNumberGenerator.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    }
}[/code]

Se você quer especificar exatamente o encoding para ler arquivos, em vez de usar new BufferedReader (new FileReader(“xxx”)), use new BufferedReader (new InputStreamReader (new FileInputStream (“xxx”), “ISO-8859-1”)) ou new BufferedReader (new InputStreamReader (new FileInputStream (“xxx”), “UTF-8”));

valeu pela dica, mas o programa continua dando erro, tentei as duas codificacoes :confused:

levando em conta que dentro do projeto troquei nao soh no BufferedReader … troquei todas as ocorrencias para deixar tudo igual. depois que eu usei esse trecho de codigo nem no windows funcionou …soh que no windows ele trocou as letras com acento por ÿ

texto original, escrito no broffice

texto mudado pela JVM

e no “UI-ASCII” vc tentou ?

tentei nao. vou tentar aqui agora. essa codificacao eh de que lingua? espanhol?

Nigh, ele conseguiu criar o arquivo com todas as acentuacoes, soh que ele esta dando um excecao:

java.io.UnsupportedEncodingException: UI-ASCII at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:52) at java.io.InputStreamReader.<init>(InputStreamReader.java:83) at br.gov.ce.upload.odt.OdtNumberGenerator.InsertDocNumber(OdtNumberGenerator.java:220) at br.gov.ce.upload.odt.OdtNumberGenerator.generateOdt(OdtNumberGenerator.java:539) at br.gov.ce.upload.odt.OdtNumberGenerator.trataOdt(OdtNumberGenerator.java:579) at br.gov.ce.seplag.upload.actions.FileUploadAction.upload(FileUploadAction.java:194)

o que faco para ele nao ficar dando esse erro?

hum eu tenho impressao que o negoco funcionou porque ele nao escreveu nada no arquivo ele travou antes de colocar no buffer … o programa funcionar primeiro fazendo o upload na outra maquina e depois modificando o arquivo :confused:

se colocar só “ASCII” nao da excessão, mas nao aparece os acentos tambem… testei aki
isso ai é problema de encoding sim, tem que achar o que o .odt usa…

esse UnsupportedEncodingException, é pq o java nao suporta algum encoding

in = new BufferedReader (new InputStreamReader (new FileInputStream (fileName), "ASCII"));

nao funcionou, trocou todos as acentuacoes graficas e o cedilha por ??

EDIT
Nigh quando eu tiro a encodificacao

in = new BufferedReader (new InputStreamReader (new FileInputStream (fileName)));

ele funciona quando eu rodo no windows, mas quando eu passo para o linux ele esta trocando os caracteres estranhos por ??

:? :?

Achei um que funciona -> “Unicode”
testei aki os acentos pelo menos funiona… xD

Quando vc “Salvar como” um arquivo .txt, vc pode escolher alguns encoding, o Unicode que eu estei funionou p/ o odt…
Ve ai se serve p/ vc…

Quando vc nao especifica um encoding ele usa algum padrão do java, não sei se esse padrão muda de windows p/ linux…
De qualquer forma vc deve especificar um e usar na hora de gravar e ler… Unicode funciona pra tudo que é caracteres, melhor usar ele xD

[quote=NighTiger]Achei um que funciona -> “Unicode”
testei aki os acentos pelo menos funiona… xD

Quando vc “Salvar como” um arquivo .txt, vc pode escolher alguns encoding, o Unicode que eu estei funionou p/ o odt…
Ve ai se serve p/ vc… [/quote]

ja tinha tentado essa codificacao “Unicode” ele cria um arquivo corrompido, nem abre o .odt

ele cria o content.xml cheio de quadrados

           FileOutputStream out = new FileOutputStream("c:\\newf.odt");
           out.write("é ça ó".getBytes("Unicode"));
           out.close();

Esse codigo funciona perfeitamente aki.
Se esta criando algo corrompido, é por que outra coisa errada.

Vale lembrar que ele não criou de verdade um arquivo do openOffice, ele só
criou um arquivo com “.odt” no final do seu nome, e que por sorte o editor do openOffice
consegue ler…

[quote=NighTiger] FileOutputStream out = new FileOutputStream("c:\\newf.odt"); out.write("é ça ó".getBytes("Unicode")); out.close();

Esse codigo funciona perfeitamente aki.
Se esta criando algo corrompido, é por que outra coisa errada.

Vale lembrar que ele não criou de verdade um arquivo do openOffice, ele só
criou um arquivo com “.odt” no final do seu nome, e que por sorte o editor do openOffice
consegue ler…[/quote]

problema eh que eu estou tendo que mecher com um arquivo criado no broffice … por isso estou tento que dezipar o bicho para poder inserir o conteudo no arquivo content.xml que fica dentro dele :confused: no cabecalho desse arquivo diz que a codificacao desse XML eh UTF-8 … mas foi a primeira codificacao que eu tentei usar, o arquivo fica corrompido quando eu escrevo nessa codificacao

ah ta desculpa… não tinha lido o seu post direito uaheuheauhes…
Mas alterar o content.xml num é mto mais dificil e inseguro do que usar uma api que altere o documento ?

Eu uso essa aki -> http://api.openoffice.org/docs/common/ref/com/sun/star/module-ix.html
Ela é toda complicada, dificil de usar… Mas faz muita coisa no documento openOffice, se vc precisar

Não sei como resolver seu problema do encoding nesse xml… =/

:smiley:

santo codigo esse que voce botou … eu tava usando esse BufferedWriter para escrever no arquivo, desse jeito ae que voce botou passando os bites e escrevendo com o FileOutputStream passando a codificacao, funcionou

vlw

soh para constar: usei UTF-8

é tem que especificar na hora de escrever tb. rs