PDF(многостраничный) в TIFF с правильным разрешением на дюйм
Мой английский может быть не очень хорошим, но этот сайт, кажется, является лучшим местом для того, чтобы задавать вопросы... поэтому я попробую.
Я пытаюсь конвертировать PDF в TIFF файл с помощью Java, и на этом сайте,
http://www.jcgonzalez.com/java-tiff-pdf-example
Я использовал PDF для Tiff for Fax (пример ICEPDF Apache), и, похоже, он работает нормально. Но я не знаю, почему конвертированный TIFF-файл имеет разрешение 1 dpi, а изображение из PDF не было конвертировано должным образом (его трудно увидеть в созданном TIFF-файле).
Есть ли способы изменить или настроить dpis, ссылаясь на пример? Есть ли какой-то шаг, который я должен сделать, чтобы конвертировать изображение в PDF в TIFF, чтобы увидеть?
Заранее спасибо, и, надеюсь, кто-то даст хороший совет:) Удачного дня.
Обновлено:
import java.awt.Graphics;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.IndexColorModel;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.icepdf.core.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.pobjects.PDimension;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRXmlDataSource;
public class JasperTesting2{
public static void main(String[] args) throws Exception{
String sourceFileName = "C:\\Users\\abcd\\Desktop\\bill.jrxml";
HashMap<String, Object> params = new HashMap<String, Object>();
String result = "<?xml version='1.0' encoding='utf-8'?> with some data";
Document doc = convertStringToDocument(result);
JRXmlDataSource xmlDataSource = new JRXmlDataSource(doc, "/result/data/tax_receipt_list");
JasperReport jasperReport = JasperCompileManager.compileReport(sourceFileName);
System.out.println(jasperReport);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), xmlDataSource);
System.out.println(jasperPrint.getPages().size());
JasperExportManager.exportReportToPdfFile(jasperPrint, "C:\\Users\\abcd\\Desktop\\bill.pdf");
converToTIF("C:\\Users\\abcd\\Desktop\\bill.pdf", "C:\\Users\\abcd\\Desktop\\bill.tif");
}
private static Document convertStringToDocument(String xmlStr) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xmlStr)));
return doc;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static void converToTIF(String pdfFilePath, String tifFilePath){
Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("tiff");
if(!iterator.hasNext()){
System.out.println("포맷의 문제가 있습니다.");
}
boolean foundCompressionType = false;
for(String type : iterator.next().getDefaultWriteParam().getCompressionTypes()){ // 이미 compression이 되있는지 확인
if("CCITT T.6".equals(type)){
foundCompressionType = true;
break;
}
}
if(!foundCompressionType){
System.out.println("TIFF ImageIo does not support Group 4 Fax");
}
org.icepdf.core.pobjects.Document document = new org.icepdf.core.pobjects.Document();
try{
document.setFile(pdfFilePath);
File pdfFile = new File(pdfFilePath);
pdfFile.delete();
}catch(PDFException ex){
System.out.println("Error parsing PDF document"+ex);
}catch(PDFSecurityException ex){
System.out.println("Error encryption not supported" + ex);
}catch(FileNotFoundException ex){
System.out.println("Error file not found " + ex);
}catch(IOException ex){
System.out.println("Error handling PDF document"+ex);
}
try{
File file = new File(tifFilePath);
ImageOutputStream ios = ImageIO.createImageOutputStream(file);
ImageWriter writer = ImageIO.getImageWritersByFormatName("tif").next();
writer.setOutput(ios);
for(int i=0; i<document.getNumberOfPages();i++){
final double targetDPI = 200.0;
float scale = 1.0f;
float rotation = 0f;
PDimension size = document.getPageDimension(i, rotation, scale);
double dpi = Math.sqrt((size.getWidth()*size.getWidth())+
(size.getHeight()*size.getHeight()))/
Math.sqrt((8.5*8.5)+(11*11));
if(dpi<(targetDPI-0.1)){
scale = (float)(targetDPI/dpi);
size = document.getPageDimension(i, rotation, scale);
}
int pageWidth = (int) size.getWidth();
int pageHeight = (int) size.getHeight();
int[] cmap = new int[] {0xFF000000, 0xFFFFFFFF};
IndexColorModel cm = new IndexColorModel(1, cmap.length, cmap, 0, false, Transparency.BITMASK,DataBuffer.TYPE_BYTE);
BufferedImage image = new BufferedImage(pageWidth, pageHeight, BufferedImage.TYPE_BYTE_BINARY, cm);
Graphics g = image.createGraphics();
document.paintPage(i, g, GraphicsRenderingHints.PRINT, Page.BOUNDARY_CROPBOX, rotation, scale);
g.dispose();
IIOImage img = new IIOImage(image, null, null);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(param.MODE_EXPLICIT);
param.setCompressionType("CCITT T.6");
ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
IIOMetadata metadata = ImageIO.getImageWritersByFormatName("tif").next().getDefaultImageMetadata(typeSpecifier, param);
if(i==0){
writer.write(null, img, param);
}else{
writer.writeInsert(-1, img, param);
}
image.flush();
}
ios.flush();
ios.close();
writer.dispose();
}catch (Exception e){
System.out.println("Error saving file" + e);
e.printStackTrace();
}
}
}
То, что я пытаюсь сделать, это использовать файл jrxml для получения PDF с моими данными, и попытаться преобразовать его в файл TIF с некоторым надлежащим разрешением, и полученный файл TIF дает мне 1 dpi, как я упоминал выше. Пожалуйста, дайте мне совет, если у вас есть. Спасибо:) Я прикреплю свойства изображения TIF, которые я получаю на всякий случай.