Как эффективно захватить изображение и сделать его в формате 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;
    }

И вы можете использовать многопоточность для обработки

Другие вопросы по тегам