2017-06-28 5 views
1

Ich folgte this example von iText 7, um eine mehrseitige Tiff in eine mehrseitige PDF zu konvertieren, aber wenn ich die PDF öffne, ist sie beschädigt. Adobe Reader zeigt einen Fehler an und Chrome zeigt dies:Konvertieren von Tiff nach PDF: PDF ist beschädigt

Screenshot

(Jede Seite sieht so aus, aber sie sind nicht identisch).

Dies ist der Code, den ich verwendet:

File newPdfFile = new File("<path...>/converted_file.pdf"); 

URL tiffUrl = UrlUtil.toURL("<path...>/original_file.tif"); 
IRandomAccessSource ras = new RandomAccessSourceFactory().createSource(tiffUrl); 
RandomAccessFileOrArray rafoa = new RandomAccessFileOrArray(ras); 

int numberOfPages = TiffImageData.getNumberOfPages(rafoa); 

PdfDocument pdf = new PdfDocument(new PdfWriter(new FileOutputStream(newPdfFile))); 
Document document = new Document(pdf); 

for(int i = 1; i <= numberOfPages; ++i) { 
    Image image = new Image(ImageDataFactory.createTiff(tiffUrl, true, i, true)); 
    document.add(image); 
} 
document.close(); 
pdf.close(); 

Und das ist der Code, den ich mit iText verwendet 5.5.11, die arbeitet, verwendet aber eine veraltete Konstruktor RandomAccessFileOrArray:

File newPdfFile = new File("<path...>/converted_file.pdf"); 

RandomAccessFileOrArray rafoa = new RandomAccessFileOrArray("<path...>/original_file.tif"); 

int numberOfPages = TiffImage.getNumberOfPages(rafoa); 

Document document = new Document(); 
PdfWriter.getInstance(document, new FileOutputStream(newPdfFile)); 
document.open(); 

for (int i = 1; i <= numberOfPages; ++i) { 
    Image image = TiffImage.getTiffImage(rafoa, i); 
    Rectangle pageSize = new Rectangle(image.getWidth(), image.getHeight()); 
    document.setPageSize(pageSize); 
    document.newPage(); 
    document.add(image); 
} 
document.close(); 

Leider kann ich keine Beispieldateien zur Verfügung stellen, weil sie vertraulich/klassifiziert sind ...

Was könnte das Problem sein?

S.S .: Ich versuchte mit the same tiff used in the example code I followed und es funktioniert. Was ist los mit meinen Tiffs? In den Dateieigenschaften, die von den Abmessungen und der Auflösung gibt es:

  • Bit-Tiefe: 1
  • Kompression: CCITT T.4
  • Einheit Auflösung: 2
+1

Das Problem ist in der TIFF-Datei. Aber wenn du es nicht liefern kannst, können wir dir nicht helfen. Meine Vorschläge bestehen darin, das tiff vorzuprobieren, indem Sie es in JAI (Java Advanced Imaging) laden und dann das Java-Bild an iText übergeben. –

+0

Wie übermittle ich es genau an iText? Alle Konstruktoren und Methoden, die ich verwende, benötigen entweder eine 'URL', ein' RandomAccessFileOrArray' oder ein 'Byte []'. Was muss ich mit JAI machen, also ist das Byte [], das es mir gibt, anders als das Original? Oder gibt es eine andere Möglichkeit, das Bild an iText zu übergeben? – nonzaprej

+0

JAI gibt ein BufferedImage aus, richtig? Gib das BufferedImage auf ein Byte [] aus und du bist fertig. –

Antwort

1

Ok, dank Michaël Demey Vorschläge konnte ich iText 7.

Importe Hier ist die maven mit dem entsprechenden pdf erhalten:

<dependency> 
    <groupId>com.sun.media</groupId> 
    <artifactId>jai_imageio</artifactId> 
    <version>1.1</version> 
</dependency> 

<dependency> 
    <groupId>com.itextpdf</groupId> 
    <artifactId>layout</artifactId> 
    <version>7.0.3</version> 
</dependency> 

Und hier ist der Code:

import com.itextpdf.io.image.ImageDataFactory; 
import com.itextpdf.kernel.geom.PageSize; 
import com.itextpdf.kernel.pdf.PdfDocument; 
import com.itextpdf.kernel.pdf.PdfWriter; 
import com.itextpdf.layout.Document; 
import com.itextpdf.layout.element.Image; 
import java.io.File; 
import java.io.FileOutputStream; 
import javax.imageio.ImageIO; 
import javax.imageio.ImageReader; 

[...] 

File newPdfFile = new File("<path...>/converted_file.pdf"); 

ImageReader reader = ImageIO.getImageReadersByFormatName("TIFF").next(); 
reader.setInput(ImageIO.createImageInputStream(new File("<path...>/original_file.tif"))); 
int numberOfPages = reader.getNumImages(true); 

PdfDocument pdf = new PdfDocument(new PdfWriter(new FileOutputStream(newPdfFile))); 
Document document = new Document(pdf); 

for(int i = 0; i < numberOfPages; ++i) {// in javax.imageio.ImageReader they start from 0! 
    java.awt.Image img = reader.read(i); 
    Image tempImage = new Image(ImageDataFactory.create(img, null)); 
    pdf.addNewPage(new PageSize(tempImage.getImageWidth(), tempImage.getImageHeight())); 
    tempImage.setFixedPosition(i + 1, 0, 0); 
    document.add(tempImage); 
} 
document.close(); 
pdf.close();