Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以减少代码中pdfbox内存的使用,还是应该扩展Java堆空间 我的pdf是20MB和四页 当我的程序崩溃时,我有1 GB的可用RAM 我已尝试将setupTempFileOnly添加到load方法中,没有任何更改 已用内存第一个循环217MB,已用内存第二个循环220MB 我有两个jpg文件,但我的程序在第3页的第三个循环中崩溃了 我想将所有页面导出为具有最高jpg质量(低jpg压缩)的jpg 我使用最新的Java版本和PDFBOX2.0.20_Java_Pdfbox_Heap Memory - Fatal编程技术网

我可以减少代码中pdfbox内存的使用,还是应该扩展Java堆空间 我的pdf是20MB和四页 当我的程序崩溃时,我有1 GB的可用RAM 我已尝试将setupTempFileOnly添加到load方法中,没有任何更改 已用内存第一个循环217MB,已用内存第二个循环220MB 我有两个jpg文件,但我的程序在第3页的第三个循环中崩溃了 我想将所有页面导出为具有最高jpg质量(低jpg压缩)的jpg 我使用最新的Java版本和PDFBOX2.0.20

我可以减少代码中pdfbox内存的使用,还是应该扩展Java堆空间 我的pdf是20MB和四页 当我的程序崩溃时,我有1 GB的可用RAM 我已尝试将setupTempFileOnly添加到load方法中,没有任何更改 已用内存第一个循环217MB,已用内存第二个循环220MB 我有两个jpg文件,但我的程序在第3页的第三个循环中崩溃了 我想将所有页面导出为具有最高jpg质量(低jpg压缩)的jpg 我使用最新的Java版本和PDFBOX2.0.20,java,pdfbox,heap-memory,Java,Pdfbox,Heap Memory,我的pdf不是很大,只有四页。我可以优化我的代码以使用更少的内存吗?每次循环后我可以请人清洁吗 我的代码 import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import java

我的pdf不是很大,只有四页。我可以优化我的代码以使用更少的内存吗?每次循环后我可以请人清洁吗

我的代码

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.FileImageOutputStream;

import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;

import net.coobird.thumbnailator.Thumbnails;

public class PdfToImage {
       public static void main (String args[]) throws IOException {
           File file = new File("C:/myPath/printfile.pdf");
            PDDocument document = PDDocument.load(file, MemoryUsageSetting.setupTempFileOnly());
            PDFRenderer renderer = new PDFRenderer(document);
           
           try {
               int pageNumber = 0;
               for( PDPage page : document.getPages() )
                {
        
        float trimboxWidth = page.getTrimBox().getWidth();
        float trimboxHeight = page.getTrimBox().getHeight();
        
        float mediaboxWidth = page.getMediaBox().getWidth();
        float mediaboxHeight = page.getMediaBox().getHeight();
        
        float getY = (mediaboxHeight - trimboxHeight) / 2;
        float getX = (mediaboxWidth - trimboxWidth) / 2;
        
        PDRectangle rectangle = new PDRectangle(getX, getY, trimboxWidth, trimboxHeight);
        
        //Crop the page
        page.setCropBox(rectangle);
        
        //Rendering an image from the PDF document
        BufferedImage image = renderer.renderImageWithDPI(pageNumber, 96, ImageType.RGB);
                
        //Resize the image
        BufferedImage thumbnail = 
                Thumbnails.of(image)
                    .height(700)
                    .asBufferedImage();

        //Writing the image to a file
        JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null);
        jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            jpegParams.setCompressionQuality(1f);
        
        final ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
        // specifies where the jpg image has to be written
        writer.setOutput(new FileImageOutputStream(
          new File("C:/myPath/myimage" + pageNumber + ".jpg")));
        
        writer.write(null, new IIOImage(thumbnail, null, null), jpegParams);

            System.out.println("Used Memory: " +  (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
       pageNumber++; 
            
                }
           }
           finally
            {
                if( document != null )
                {
                    document.close();
                }

            } 
       }
}
错误消息第三个循环

线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间 位于java.util.HashMap.replacementTreeNode(未知源代码) java.util.HashMap.treeifyBin(未知源代码)位于 java.util.HashMap.putVal(未知源代码)位于 java.util.HashMap.put(未知源代码)位于 org.apache.pdfbox.pdmodel.graphics.shading.TriangleBasedShadingContext.calcPixelTable(TriangleBasedShadingContext.java:121) 在 org.apache.pdfbox.pdmodel.graphics.shading.PatchMeshesShadingContext.calcPixelTable(PatchMeshesShadingContext.java:280) 在 org.apache.pdfbox.pdmodel.graphics.shading.TriangleBasedShadingContext.createPixelTable(TriangleBasedShadingContext.java:80) 在 org.apache.pdfbox.pdmodel.graphics.shading.PatchMeshesShadingContext.(PatchMeshesShadingContext.java:71) 在 org.apache.pdfbox.pdmodel.graphics.shading.Type7ShadingContext.(Type7ShadingContext.java:46) 在 org.apache.pdfbox.pdmodel.graphics.shading.Type7ShadingPaint.createContext(Type7ShadingPaint.java:63) 位于的sun.java2d.pipe.AlphaPaintPipe.startSequence(未知源) 位于的sun.java2d.pipe.aashapepie.renderTiles(未知源) 位于的sun.java2d.pipe.aashapepie.renderPath(未知源) sun.java2d.pipe.aashapepie.fill(未知源)位于 PixelToParallelogramConverter.fill(未知源)位于 sun.java2d.pipe.validatePie.fill(未知源)位于 sun.java2d.SunGraphics2D.fill(未知源)位于 org.apache.pdfbox.rendering.PageDrawer.shadingFill(PageDrawer.java:1388) 在 org.apache.pdfbox.contentstream.operator.graphics.ShadingFill.process(ShadingFill.java:42) 在 org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:932) 在 org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:510) 在 org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:484) 在 org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:156) 在 org.apache.pdfbox.rendering.PageDrawer.drawPage(PageDrawer.java:271) 在 org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:321) 在 org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:243) 在 org.apache.pdfbox.rendering.PDFRenderer.renderImageWithDPI(PDFRenderer.java:229) 位于PdfToImage.main(PdfToImage.java:47)

编辑 我发现我变了

//Rendering an image from the PDF document
BufferedImage image = renderer.renderImageWithDPI(pageNumber, 96, ImageType.RGB);


工作正常,没有碰撞。但是这并不是一个解决方案,或者说是一个降低分辨率的糟糕解决方案。

@tilmahausher你能在你的链接中看到我在代码中除了增加-Xmx值之外没有做的任何事情吗?我有setupTempFileOnly(),我没有使用列表,我正在关闭文档,我用dpi()降低了rendermagewithdpi(),但是50 dpi有点太低了(96 dpi就可以了)。但是,您正在使用临时文件,因此这可能没有帮助。列表中未提及但值得一试的是通过调用setSubsamplingAllowed(true)在PDFRenderer中启用子采样。
//Rendering an image from the PDF document
BufferedImage image = renderer.renderImageWithDPI(pageNumber, 50, ImageType.RGB);