【问题标题】:Converting Tiff to PDF: PDF is corrupted将 Tiff 转换为 PDF:PDF 已损坏
【发布时间】:2017-06-28 08:49:42
【问题描述】:

我按照 iText 7 的 this example 将多页 Tiff 转换为多页 PDF,但是当我打开 PDF 时它已损坏。 Adobe Reader 显示错误,Chrome 显示如下:

(每个页面看起来都是这样,但它们并不完全相同)。

这是我使用的代码:

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

这是我在 iText 5.5.11 中使用的代码,可以工作,但使用了已弃用的 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();

很遗憾,我无法提供示例文件,因为它们是机密/机密文件...

可能是什么问题?

P.S.:我试过 the same tiff used in the example code I followed 并且它有效。我的 tiff 怎么了?在文件属性中,除了尺寸和分辨率之外还有:

  • 位深:1
  • 压缩:CCITT T.4
  • 分辨率单位:2

【问题讨论】:

  • 问题出在 tiff 文件中。但是,如果您不能提供,那么我们将无法帮助您。我的建议是尝试通过将 tiff 加载到 JAI(Java 高级成像)中来预处理 tiff,然后将 Java 图像传递给 iText。
  • 我如何将它传递给 iText,究竟是什么?我使用的所有构造函数和方法都需要URLRandomAccessFileOrArraybyte[]。我需要用 JAI 做什么,所以它给我的 byte[] 与原来的不同?还是有其他方法可以将图像传递给 iText?
  • JAI 输出一个 BufferedImage,对吧?将 BufferedImage 输出到 byte[] 就可以了。
  • 我是这么认为的,但我不确定……好吧,现在我得让 Maven 找到那个该死的 jai_imageio 库……谢谢。

标签: java pdf tiff itext7


【解决方案1】:

我也遇到过同样的问题。我能够转换扩展名为“TIFF”的文件,而扩展名为“TIF”的文件我无法正确转换。然后我尝试了一些能够做吧。尝试如下更改并检查

Image image = new Image(ImageDataFactory.createTiff(tiffUrl, true, i, true));

Image image = new Image(ImageDataFactory.createTiff(tiffUrl, true, i, false));

这使我的转换工作。希望它也适用于你

【讨论】:

  • 我在 .net 版本的 IText 中遇到了同样的问题。变真为假对我有用。谢谢你。想知道那个参数到底是什么。它只是被命名为“直接”并且没有它的文档
【解决方案2】:

好的,感谢 Michaël Demey 的建议,我设法使用 iText 7 获得了正确的 pdf。

这是 Maven 导入:

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

这是代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多