Jump to content

Postagens Recomendadas

Estou com um problema ao comprimir documentos em pdf.

Estou utilizando a biblioteca do GhostScript e o problema é que ao comprimir documentos que contenham uma página como imagem, essas páginas ficam bom fundo preto como na imagem em anexo.

Estou usando essas opções abaixo para tratar páginas com imagem, mas não sei o que pode estar faltando.

stream.clear();
            stream.setData(imgBytes.toByteArray(), false, PRStream.NO_COMPRESSION);
            stream.put(PdfName.TYPE, PdfName.XOBJECT);
            stream.put(PdfName.SUBTYPE, PdfName.IMAGE);
            stream.put(PdfName.FILTER, PdfName.DCTDECODE);
            stream.put(PdfName.WIDTH, new PdfNumber(width));
            stream.put(PdfName.HEIGHT, new PdfNumber(height));
            stream.put(PdfName.BITSPERCOMPONENT, new PdfNumber(8));
            stream.put(PdfName.COLORSPACE, PdfName.DEVICERGB);
            stream.put(PdfName.BACKGROUND, new PdfName("FFFFFF")); // Define o fundo como branco

 

Na Dll do GhostScript estou passando os seguinte parâmetros.

String[] gsArgs = new String[26];
        gsArgs[0] = "-gs";
        gsArgs[1] = "-sDEVICE=pdfwrite";
        gsArgs[2] = "-dPDFSETTINGS=/screen";        
        gsArgs[3] = "-dCompressFonts=true";
        gsArgs[4] = "-dEmbedAllFonts=true";
        gsArgs[5] =  "-dSubsetFonts=true";
        gsArgs[6] =  "-dColorImageDownsampleType=/Bicubic";
        gsArgs[7] =  "-dColorImageResolution=110";
        gsArgs[8] =  "-dGrayImageDownsampleType=/Bicubic";
        gsArgs[9] =  "-dGrayImageResolution=110";
        gsArgs[10] =  "-dMonoImageDownsampleType=/Subsample";
        gsArgs[11] =  "-dMonoImageResolution=110";
        gsArgs[12] = "-dDownsampleColorImages=true";
        gsArgs[13] = "-dDownsampleGrayImages=true";
        gsArgs[14] = "-dDownsampleMonoImages=true";
        gsArgs[15] =  "-r150" ;  
        gsArgs[16] = "-dCompatibilityLevel=1.4";
        //gsArgs[14] = "-dPDFSETTINGS=/ebook"; //DPI: screen=72 - ebook=150 - printer=300 - prepress=300
        gsArgs[17] = "-dNOPAUSE"; 
        gsArgs[18] = "-dQUIET";
        gsArgs[19] = "-dBATCH";
        gsArgs[20] = "-dUseXPutImage=false";
        gsArgs[21] = "-dAutoRotatePages=/None"; //-dAutoRotatePages=/None or /All or /PageByPage
        gsArgs[22] = "-dNumRenderingThreads=8";
        gsArgs[23] = "-sOutputFile=" + caminhoPDF + "\\compressed_temp_gs_" + nomePDFOriginal;
        gsArgs[24] = "-f";
        gsArgs[25] = caminhoPDF + "\\"+ nomePDFOriginal;              
        gs.initialize(gsArgs);
        gs.exit();
    }


Alguém pode me ajudar por favor.

 

Comprimir.png

  • Curtir 1
Link to comment
Compartilhe em outros sites

  • 2 weeks later...

Boa noite, tente remover a Definição de Fundo Branco:

No trecho do seu código onde você define o fundo como branco (stream.put(PdfName.BACKGROUND, new PdfName("FFFFFF"));), tente remover essa linha. O GhostScript deve lidar com o fundo automaticamente.
 

Ajuste as Configurações do GhostScript:

Por exemplo, você pode usar -dPDFSETTINGS=/prepress em vez de /screen. Isso deve melhorar a qualidade da imagem e evitar problemas de fundo preto.

  • Curtir 1
Link to comment
Compartilhe em outros sites

Agradeço pela dica, mas não deu certo.

Consegui resolver o problema com uma implementação nova, porém alguns documentos estão retornando o erro abaixo.

 **** Error: Couldn't initialise file.
               Output may be incorrect.

Requested FirstPage is greater than the number of pages in the file: 0
   No pages will be processed (FirstPage > LastPage).

  • Curtir 1
Link to comment
Compartilhe em outros sites

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ciaintegrativa.comprimirpdf;

/**
 *
 * @author lucas.favero
 */
import com.itextpdf.text.pdf.PdfReader;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import java.io.File;

public class ComprimirPDFGhostNew {

    public interface GhostscriptDLL extends Library {
        GhostscriptDLL INSTANCE = (GhostscriptDLL) Native.loadLibrary(Platform.isWindows() ? "gsdll64" : "gs", GhostscriptDLL.class);
        int gsapi_new_instance(long[] pinstance, Object caller);
        int gsapi_init_with_args(long instance, int argc, String[] argv);
        int gsapi_exit(long instance);
    }

    public static void main(String[] args) {
        try {
            comprimirPDF("arquivo.pdf", "arquivo_comprimido.pdf");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void comprimirPDF(String arquivoEntrada, String arquivoSaida) throws Exception {
        long[] pinstance = new long[1];
        int retorno = GhostscriptDLL.INSTANCE.gsapi_new_instance(pinstance, null);
        PdfReader arquivoPDF = new PdfReader(arquivoEntrada);        
        int lastpage = arquivoPDF.getNumberOfPages();
        if (retorno < 0) {
            throw new Exception("Erro ao criar instância do Ghostscript: " + retorno);
        }      
        
        String[] args = {
            "gs",
            "-sDEVICE=pdfwrite",
            "-dCompatibilityLevel=1.4",
            "-dPDFSETTINGS=/screen",
            "-dColorImageDownsampleType=/Bicubic",
            "-dColorImageResolution=150",
            "-dGrayImageDownsampleType=/Bicubic",
            "-dGrayImageResolution=150",
            "-dMonoImageDownsampleType=/Subsample",
            "-dMonoImageResolution=150",
            "-dDownsampleColorImages=true",
            "-dDownsampleGrayImages=true",
            "-dDownsampleMonoImages=true",
            "-dFirstPage=1",
            "-dLastPage=" + lastpage,
            "-dNOPAUSE",
            "-dQUIET",
            "-dBATCH",
            "-sOutputFile=" + arquivoSaida, arquivoEntrada};

        // Verificar se o arquivo de entrada existe
        File inputFile = new File(arquivoEntrada);
        if (!inputFile.exists()) {
            throw new Exception("Arquivo de entrada não encontrado: " + arquivoEntrada);
        }

        // Verificar se o diretório do arquivo de saída é gravável
        File outputFile = new File(arquivoSaida);
        if (!outputFile.getParentFile().canWrite()) {
            throw new Exception("Não é possível escrever no diretório de saída: " + outputFile.getParent());
        }

        retorno = GhostscriptDLL.INSTANCE.gsapi_init_with_args(pinstance[0], args.length, args);
        if (retorno < 0) {
            GhostscriptDLL.INSTANCE.gsapi_exit(pinstance[0]);
            throw new Exception("Erro ao inicializar Ghostscript com argumentos: " + retorno);
        }

        retorno = GhostscriptDLL.INSTANCE.gsapi_exit(pinstance[0]);
        if (retorno < 0) {
            throw new Exception("Erro ao sair do Ghostscript: " + retorno);
        }
    }
}
 

  • Curtir 1
Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...