Этот класс создает PDF и конвертирует его в PNG-файл.
Функция print () должна печатать PNG на системном принтере по умолчанию (Canon Shelby CP1300). К сожалению, изображение напечатано очень маленьким (0,5x1 см).
Если я печатаю PNG-файл в проводнике Windows, все работает хорошо.
На самом деле я создаю файл PNG с разрешением 300, но в конце он имеет только 92 точек на дюйм.
Нужно ли мне дополнительные "PrintRequestAttributes", чтобы решить эту проблему? Или я могу подогнать файл png под нужный размер страницы?
public PrintableImage(Photos photos) {
this.setPageSize(PageSize.ID_1.rotate());
createPdfWith(photos);
convertToPNG();
}
private void createPdfWith(Photos photos) {
try {
Image img;
PdfWriter.getInstance(this, new FileOutputStream(Constants.TEMP_PRINTFOLDER + Constants.TMP_PRINT_PDF));
this.open();
int offsetPhotos = 0;
for (int i = photos.size() - 1; i >= 0; i--) {
String image = photos.get(i).getPath();
img = Image.getInstance(image);
img.scaleToFit(Constants.SIZE_IMAGE);
img.setAbsolutePosition(getPositionForCentering(img), offsetPhotos + 40);
this.add(img);
offsetPhotos = 95;
}
img = Image.getInstance(Constants.PATH_LOGO);
img.scaleToFit(Constants.SIZE_LOGO);
img.setAbsolutePosition(getPositionForCentering(img) + 4, 14);
this.add(img);
this.close();
} catch (Exception e) {
}
}
private float getPositionForCentering(Image image) {
return (getPageSize().getWidth() - image.getScaledWidth()) / 2;
}
private void convertToPNG() {
try {
PDDocument doc = PDDocument.load(new File(Constants.TEMP_PRINTFOLDER + Constants.TMP_PRINT_PDF), "");
PDFRenderer pdfRenderer = new PDFRenderer(doc);
BufferedImage image = pdfRenderer.renderImageWithDPI(0, 300, ImageType.RGB);
File pngFile = new File(Constants.TEMP_PRINTFOLDER + Constants.TMP_PRINT_PNG);
ImageIO.write(image, "png",pngFile);
} catch (IOException e) {
}
}
/**
* Prints the last created PNG-Image
*/
public static void print() {
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(OrientationRequested.PORTRAIT);
try {
FileInputStream pngFile = new FileInputStream(Constants.TEMP_PRINTFOLDER + Constants.TMP_PRINT_PNG);
Doc pngDoc = new SimpleDoc(pngFile, DocFlavor.INPUT_STREAM.PNG, null);
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob printJob = printService.createPrintJob();
printJob.print(pngDoc, attributes);
pngFile.close();
} catch (Exception e) {
}
}
}
Заранее большое спасибо!