Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Erro ao inserir imagem no campo texto - Forpdi #322

Open
AdrianoUFSB opened this issue Dec 30, 2020 · 2 comments
Open

Erro ao inserir imagem no campo texto - Forpdi #322

AdrianoUFSB opened this issue Dec 30, 2020 · 2 comments
Labels

Comments

@AdrianoUFSB
Copy link

Foi inserida a figura no corpo do texto e depois foi clicado o botão SALVAR, apareceu a mensagem de erro "Ocorreu um erro inesperado: could not execute statement".

Criei um novo campo texto no documento e tentei salvar somente a imagem sem texto, mas quando foi SALVAR deu o mesmo erro.

@wgdantas
Copy link

Olá, @AdrianoUFSB , o problema parece ocorrer porque o tamanho o conteúdo da seção do documento PDI sendo editado é maior do que o previsto pelo tipo SQL do campo fpdi_document_attribute.value no banco MySQL. Me deparei com essa constatação ao ver o seguinte stack trace Java em /var/log/forpdi.log:

org.hibernate.exception.DataException: could not execute statement
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:69)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3281)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3183)

[ cortado ]

Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'value' at row 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3833)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3771)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2535)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1911)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2145)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2081)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2066)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:147)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
... 135 more

Para resolver esse problema, no meu caso, tive de modificar o tipo do campo fpdi_document_attribute.value para MEDIUMTEXT (até 16 MB).

Seguem os passos:

Edite o arquivo plataforma-for/backend-java/src/main/java/org/forpdi/planning/document/DocumentAttribute.java (mais ou menos na linha 38), alterando a definição do atributo "value", de:

@Column(nullable = true, length = 12000)

Para:

@Column(nullable = true)

No banco MySQL, altere o tipo SQL do campo fpdi_document_attribute.value, de VARCHAR(12000) para MEDIUMTEXT (ou outro, de acordo com sua necessidade).

Recompile a aplicação Backend Java do ForPDI e copie o arquivo JAR resultante para o diretório de deploy do WildFly. Na linha de comando (supondo que você esteja num sistema Unix-Like):

cd <DIR-PLATAFORMA-FOR>/backend-java
mvn clean package -P <AMBIENTE> # ou "mvn clean package", caso a config esteja em dev.properties
cp target/forpdi.war <DIR-WILDFLY>/standalone/deployments/

Onde:

  • <DIR-PLATAFORMA-FOR>: diretório-raiz do código-fonte do ForPDI/ForRisco obtido via GitHub;
  • <AMBIENTE>: ambiente de deploy ("mirror", "test" ou "prd");
  • <DIR-WILDFLY>: diretório-raiz do WildFly no servidor.

@wgdantas
Copy link

O commit e6fa377, de hoje (20210615), resolve o problema trazido por @AdrianoUFSB (pelo menos, recriando o banco, não testei de outra maneira preservando os dados do banco).

No entanto, ocorreu o seguinte erro de exportação de um documento PDI:

{"success":false,"message":"unknown protocol: data"}

O erro ocorre quando uma seção do PDI tem um campo de Área de Texto contendo imagem (no meu caso, o erro aconteceu com uma imagem PNG). Notei que a imagem é guardada em codificação Base64 no banco de dados, porém seu carregamento não acontece efetivamente.

Solução provisória adotada:

No arquivo plataforma-for/backend-iava/src/main/java/org/forpdi/system/PDFgenerate.java, modifiquei o método exportDocument, especificamente no carregamento da imagem (mais ou menos na linha 778).

De:

Image image = Image.getInstance(new URL(
			img.replaceAll("<img src=\"", "").replaceAll("\">", "")));

Para:

String[] parts = img.replaceAll("<img src=\"", "").replaceAll("\">", "").split(",");
String imageString = parts[1];
byte[] imageByte = java.util.Base64.getDecoder().decode(imageString);
Image image = Image.getInstance(imageByte);

Um ajuste a mais que efetuei também no método exportDocument foi modificar o redimensionamento da imagem para visualização no PDF exportado.

De:

image.scalePercent(scaler * 0.4f);

Para:

image.scalePercent(scaler * 0.8f);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants