La conversion de PDF en tiff multipage (Groupe 4)
Je suis en train de convertir des Pdf en fichiers représenté par le org.apache.pdfbox.pdmodel.PDDocument classe et la icafe bibliothèque (https://github.com/dragon66/icafe/) à un tiff de plusieurs pages avec le groupe 4 de la compression et de 300 dpi. L'exemple de code qui fonctionne pour moi pour 288 ppp, mais, curieusement, PAS pour 300 dpi, de l'export tiff reste tout blanc. Personne n'a une idée de ce que la question est ici?
L'exemple de fichier pdf que j'utilise dans l'exemple se trouve ici: http://www.bergophil.ch/a.pdf
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import cafe.image.ImageColorType;
import cafe.image.ImageParam;
import cafe.image.options.TIFFOptions;
import cafe.image.tiff.TIFFTweaker;
import cafe.image.tiff.TiffFieldEnum.Compression;
import cafe.io.FileCacheRandomAccessOutputStream;
import cafe.io.RandomAccessOutputStream;
public class Pdf2TiffConverter {
public static void main(String[] args) {
String pdf = "a.pdf";
PDDocument pddoc = null;
try {
pddoc = PDDocument.load(pdf);
} catch (IOException e) {
}
try {
savePdfAsTiff(pddoc);
} catch (IOException e) {
}
}
private static void savePdfAsTiff(PDDocument pdf) throws IOException {
BufferedImage[] images = new BufferedImage[pdf.getNumberOfPages()];
for (int i = 0; i < images.length; i++) {
PDPage page = (PDPage) pdf.getDocumentCatalog().getAllPages()
.get(i);
BufferedImage image;
try {
// image = page.convertToImage(BufferedImage.TYPE_INT_RGB, 288); //works
image = page.convertToImage(BufferedImage.TYPE_INT_RGB, 300); //does not work
images[i] = image;
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fos = new FileOutputStream("a.tiff");
RandomAccessOutputStream rout = new FileCacheRandomAccessOutputStream(
fos);
ImageParam.ImageParamBuilder builder = ImageParam.getBuilder();
ImageParam[] param = new ImageParam[1];
TIFFOptions tiffOptions = new TIFFOptions();
tiffOptions.setTiffCompression(Compression.CCITTFAX4);
builder.imageOptions(tiffOptions);
builder.colorType(ImageColorType.BILEVEL);
param[0] = builder.build();
TIFFTweaker.writeMultipageTIFF(rout, param, images);
rout.close();
fos.close();
}
}
Ou est-il une autre bibliothèque pour écrire multi-page Tiff?
EDIT:
Grâce à dragon66 le bug dans icafe
est maintenant résolu. Dans l'intervalle, j'ai expérimenté avec d'autres bibliothèques et aussi avec en invoquant ghostscript
. Comme je pense que ghostscript
est très fiable comme id est un outil largement utilisé, d'autre part, je dois compter que l'utilisateur de mon code a un ghostscript-installation
, quelque chose comme ceci:
/**
* Converts a given pdf as specified by its path to an tiff using group 4 compression
*
* @param pdfFilePath The absolute path of the pdf
* @param tiffFilePath The absolute path of the tiff to be created
* @param dpi The resolution of the tiff
* @throws MyException If the conversion fails
*/
private static void convertPdfToTiffGhostscript(String pdfFilePath, String tiffFilePath, int dpi) throws MyException {
//location of gswin64c.exe
String ghostscriptLoc = context.getGhostscriptLoc();
//enclose src and dest. with quotes to avoid problems if the paths contain whitespaces
pdfFilePath = "\"" + pdfFilePath + "\"";
tiffFilePath = "\"" + tiffFilePath + "\"";
logger.debug("invoking ghostscript to convert {} to {}", pdfFilePath, tiffFilePath);
String cmd = ghostscriptLoc + " -dQUIET -dBATCH -o " + tiffFilePath + " -r" + dpi + " -sDEVICE=tiffg4 " + pdfFilePath;
logger.debug("The following command will be invoked: {}", cmd);
int exitVal = 0;
try {
exitVal = Runtime.getRuntime().exec(cmd).waitFor();
} catch (Exception e) {
logger.error("error while converting to tiff using ghostscript", e);
throw new MyException(ErrorMessages.GHOSTSTSCRIPT_ERROR, e);
}
if (exitVal != 0) {
logger.error("error while converting to tiff using ghostscript, exitval is {}", exitVal);
throw new MyException(ErrorMessages.GHOSTSTSCRIPT_ERROR);
}
}
J'ai trouvé que le produit tif
de ghostscript
distingue fortement de la qualité de l' tiff
produit par icafe
(le groupe 4 tiff
de ghostscript
regarde en niveaux de gris)
et où puis-je trouver la dernière version icafe.jar? Ou dois-je créer moi-même?
merci, ça fonctionne maintenant. J'ai également expérimenté avec ghostscript (à l'aide d'-sDEVICE=tiffg4) et je me demandais pourquoi le résultat est-il si différent (surtout pour les images, de texte, la différence n'est pas si frappante). Ghostscript produit des fichiers tiff qui ressemblent plus à des greylevel (bien qu'il soit d'aide inspiratoire avec pep), tandis que icafe produit plutôt "moche" images en noir et blanc
Remarque: ICAFE, vous permet désormais de définir ppp pour les deux directions verticale et horizontale
Merci Icafe est grande sur ce ...
OriginalL'auteur Raphael Roth | 2015-08-12
Vous devez vous connecter pour publier un commentaire.
Il a été un moment depuis que la question a été posée et j'ai enfin trouver le temps et un merveilleux commandé le tramage de la matrice qui me permet de donner quelques détails sur la façon dont "icafe" peut être utilisé pour obtenir de meilleurs résultats qu'en l'appelant externe ghostscript exécutable. Quelques nouvelles fonctionnalités ont été ajoutées à "icafe" récemment, tels que l'amélioration de la quantification et ordonné des algorithmes de tramage qui est utilisé dans l'exemple de code suivant.
Ici l'exemple de fichier pdf que je vais utiliser est princeCatalogue. La plupart du code suivant est à partir de l'OP avec quelques modifications en raison de package de changement de nom et de plus ImageParam paramètres de contrôle.
Pour ghostscript, j'ai utilisé la ligne de commande directement avec les mêmes paramètres fournis par les OP. Les captures d'écran de la première page de l'TIFF images sont ci-dessous:
Le côté gauche montre la sortie de "ghostscript" et le côté droit de la sortie de "icafe". Il peut être vu, au moins dans ce cas, la sortie de "icafe" est meilleure que la sortie de "ghostscript".
À l'aide de CCITTFAX4 de compression, la taille du fichier de "ghostscript" est 2,22 M et la taille du fichier de "icafe" est de 2,08 M. les Deux ne sont pas si bon compte tenu de l'effet de tramage est utilisé lors de la création de l'impression en noir et blanc. En fait, un autre algorithme de compression permettra de créer de façon de plus petite taille de fichier. Par exemple, à l'aide de l'algorithme LZW, la même sortie de "icafe" n'est 634K, et si vous utilisez le mode de compression DEFLATE la taille du fichier de sortie est allé vers le bas pour 582K.
OriginalL'auteur dragon66
Voici un code pour enregistrer en tiff multipage que j'utilise avec PDFBox. Il nécessite la TIFFUtil classe de PDFBox (il n'est pas publique, de sorte que vous avez à faire une copie).
J'ai expérimenté sur moi-même il y a quelques temps en utilisant ce code:
https://www.java.net/node/670205 (J'ai utilisé la solution 2)
Cependant...
Si vous créez un tableau avec beaucoup d'images, de votre consommation de mémoire
va vraiment vers le haut. Donc, il serait sans doute mieux le rendu d'une image, puis
l'ajouter au fichier tiff, puis afficher la page suivante et de perdre la
référence de la précédente, de sorte que le gc peut obtenir de l'espace si nécessaire.
OriginalL'auteur Tilman Hausherr