如何使用 java 将多个多页 tiff 文件合并为单个 pdf?



我使用以下代码将多个多页 tif 文件转换为 pdf。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.apache.log4j.Logger;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
public class TifToPdf {
public static void  main(String args[])
{
String src = "/input/";//path of the folder containing multiple tif files where each tif has multiple pages"
File folder = new File(src);
try
{
// Creating a new pdf 
OutputStream file = new FileOutputStream(new File("output.pdf"));
//Adding images in PDF
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, file);
document.open();
PdfPTable table = new PdfPTable(1); 
table.setWidthPercentage(100); //Width 100%
table.setSpacingBefore(10f); //Space before table
table.setSpacingAfter(10f); //Space after table
//Set Column widths
float[] columnWidths = {10f};
table.setWidths(columnWidths);
for (final File fileEntry : folder.listFiles())
{
Image image = Image.getInstance(src + "/" + fileEntry.getName());
PdfPCell cell1 = new PdfPCell(image,true);
cell1.setBorderColor(BaseColor.WHITE);
cell1.setPaddingBottom(100);
cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
table.addCell(cell1);
}

document.add(table);
document.close();
writer.close();
} catch(FileNotFoundException ex){
System.out.println("Error in locating folder in local to import files "+ex.getMessage());
}catch (Exception e){
System.out.println("Error in merging tiff files to pdfs "+e.getMessage());
}
}
}

"输出.pdf"包含所有合并的 tif 文件。但只有每个 tif 文件的第一页被合并到 pdf 中。其余页面将被忽略。例如,如果"/input/"包含 1.tif,2.tif,3.tif 和 1.tif 包含 3 页,2.tif 包含 2 页,3.tif conatins 1 页,则只有所有这些 tif 文件的第一页合并到 pdf 中。 我不想使用"jai"罐子。请让我知道问题是什么。

即使我尝试了以下内容,

Image images = Image.getInstance(src + "/" + fileEntry.getName());
for (Image image : images) {
PdfPCell cell1 = new PdfPCell(image,true);
cell1.setBorderColor(BaseColor.WHITE);
cell1.setPaddingBottom(100);
cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
table.addCell(cell1);
}

但是我无法遍历图像实例。

TIFF图像由页面组成,您只查看"第一页"。您需要遍历所有页面。请参阅为"iText in Action - 第二版"编写的示例:PagedImages

public static void addTif(Document document, String path)
throws DocumentException, IOException {
RandomAccessFileOrArray ra = new RandomAccessFileOrArray(path);
int n = TiffImage.getNumberOfPages(ra);
Image img;
for (int i = 1; i <= n; i++) {
img = TiffImage.getTiffImage(ra, i);
img.scaleToFit(523, 350);
document.add(img);
}
}

我看到您仍在使用iText 5。您可能希望切换到 iText 7,因为 iText 5 已进入"维护模式"(这意味着:只有错误修复,没有新的开发(。对于 iText 7,代码是不同的。请参阅本教程的第 3 章:

IRandomAccessSource ras3 =
new RandomAccessSourceFactory().createSource(url3);
RandomAccessFileOrArray raf3 = new RandomAccessFileOrArray(ras3);
int pages3 = TiffImageData.getNumberOfPages(raf3);
for (int i = 1; i <= pages3; i++) {
img = new Image(
ImageDataFactory.createTiff(url3, true, i, true));
document.add(img);
}
document.close();

最新更新