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.

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).

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);
        }
    }
}
 

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...