Как эффективно захватить изображение и сделать его в формате pdf с помощью java, чтобы это не заняло слишком много времени?
Я хочу захватить веб-страницы и сделать PDF с этими захваченными изображениями, используя java. Как я могу достичь этой логики очень эффективным способом? Мне нужно захватить почти 50 страниц с минимум 10 пересечениями каждой страницы и объединить их в pdf. Каков наилучший способ добиться этого? Можно ли это сделать с помощью многопоточности? Или любой инструмент, который может мне помочь.
Текущая ситуация. Я просто делаю снимок экрана и объединяю их в pdf на несколько страниц.
1 ответ
Сначала используйте java для сохранения сетевых скриншотов в виде изображений, затем преобразуйте изображения в PDF и объедините PDF.
Код ссылки:
1. Используйте java для сохранения сетевых скриншотов в виде картинок:
import java.awt.AWTException;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import javax.imageio.ImageIO;
public class CutPicture {
public static void main(String[] args) throws Exception,
IOException, URISyntaxException, AWTException {
Desktop.getDesktop().browse(new URL("http://java.662p.com/").toURI());
Robot robot = new Robot();
robot.delay(10000);
Dimension d = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
int width = (int) d.getWidth();
int height = (int) d.getHeight();
robot.keyRelease(KeyEvent.VK_F11);
robot.delay(2000);
Image image = robot.createScreenCapture(new Rectangle(0, 0, width,height));
BufferedImage bi = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = bi.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
ImageIO.write(bi, "jpg", new File("c:/open.jpg"));
}
2. конвертировать изображения в PDF:
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
// Method of converting pictures to PDF
public static void ImgChangePDF(List<String> source, String target) {
Document doc = new Document();
try {
PdfWriter.getInstance(doc, new FileOutputStream(target));
doc.open();
for (String url : source) {
if(url == null) {
continue;
}
Image img = Image.getInstance(url);
Float h = img.getHeight();
Float w = img.getWidth();
Integer percent = getPercent(h, w);
img.setAlignment(Image.MIDDLE);
img.scalePercent(percent);
doc.add(img);
}
if(doc != null){
doc.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (BadElementException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
/**
* compress
* @param h
* @param w
* @return
*/
public static Integer getPercent(Float h,Float w) {
Integer g=0;
Float g2=0.0f;
g2=480/w*100;
g=Math.round(g2);
return g;
}
public static void main(String[] args) {
List<String> source = new ArrayList<String>();
source.add("http://127.0.0.1:8080/img/22.png");
source.add("http://127.0.0.1:8080/img/333.png");
ImgChangePDF(source, "D:/attachment/PDF/test.pdf");
}
// merge PDF
public static boolean mergePdfFiles(List<String> files, String newfile) {
boolean retValue = false;
Document document = null;
PdfCopy copy = null;
PdfReader reader = null;
try {
document = new Document(new PdfReader(files.get(0)).getPageSize(1));
copy = new PdfCopy(document, new FileOutputStream(newfile));
document.open();
for (int i = 0; i < files.size(); i++) {
reader = new PdfReader(files.get(i));
int n = reader.getNumberOfPages();
for (int j = 1; j <= n; j++) {
document.newPage();
PdfImportedPage page = copy.getImportedPage(reader, j);
copy.addPage(page);
}
}
retValue = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
if (copy != null) {
copy.close();
}
if (document != null) {
document.close();
}
}
return retValue;
}
И вы можете использовать многопоточность для обработки