在pdf中展平矢量图形并使用java提取

在pdf中展平矢量图形并使用java提取,java,image,extract,pdfbox,Java,Image,Extract,Pdfbox,我试图获得嵌入在PDF文件中的图像的大小(宽度和深度)。PDF中的图像都是高分辨率矢量图像 我试着用PDFBox。PDFBox库可以完美地为普通图形提取图像。但是,当它得到矢量图像时,它会提取不同的层作为不同的图像 我也读过关于iText的文章。但iText可以将整个页面转换为光栅化图像。然而,我的PDF页面实际上由多个图像组成,我需要以不同的方式提取/获取所有图像的大小 我在这里附上我的PDFBox图像提取代码。请让我知道,我如何才能得到一个矢量图像作为一个图像,而不是作为层 我的代码如下

我试图获得嵌入在PDF文件中的图像的大小(宽度和深度)。PDF中的图像都是高分辨率矢量图像

  • 我试着用PDFBox。PDFBox库可以完美地为普通图形提取图像。但是,当它得到矢量图像时,它会提取不同的层作为不同的图像
  • 我也读过关于iText的文章。但iText可以将整个页面转换为光栅化图像。然而,我的PDF页面实际上由多个图像组成,我需要以不同的方式提取/获取所有图像的大小
我在这里附上我的PDFBox图像提取代码。请让我知道,我如何才能得到一个矢量图像作为一个图像,而不是作为层

我的代码如下:

package com.abp.pdf.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;

public class ExtractImages {

    private int imageCounter = 1;


    private ExtractImages() {
    }
    public static void main(String[] args) throws Exception {
        ExtractImages extractor = new ExtractImages();
        extractor.extractImages(args);
    }

    private void extractImages(String[] args) throws Exception {
        String pdfFile = null;
        String password = "";
        String prefix = null;
        boolean addKey = false;
        boolean useNonSeqParser = true;

        pdfFile = "/home/suvankar/Resources/myfile.pdf";
        if (prefix == null && pdfFile.length() > 4) {
            prefix = pdfFile.substring(0, pdfFile.lastIndexOf("/") + 1)
                    + "extracted/images"
                    + pdfFile.substring(pdfFile.lastIndexOf("/"),
                            pdfFile.length() - 4);
        }
        PDDocument document = null;

        try {
            if (useNonSeqParser) {
                document = PDDocument.loadNonSeq(new File(pdfFile), null,
                        password);
            } else {
                document = PDDocument.load(pdfFile);

                if (document.isEncrypted()) {
                    StandardDecryptionMaterial spm = new StandardDecryptionMaterial(
                            password);
                    document.openProtection(spm);
                }
            }
            AccessPermission ap = document.getCurrentAccessPermission();
            if (!ap.canExtractContent()) {
                throw new IOException(
                        "Error: You do not have permission to extract images.");
            }

            List pages = document.getDocumentCatalog().getAllPages();
            Iterator iter = pages.iterator();
            while (iter.hasNext()) {
                PDPage page = (PDPage) iter.next();
                PDResources resources = page.getResources();
                processResources(resources, prefix, addKey);
            }
        } finally {
            if (document != null) {
                document.close();
            }
        }
    }


    private void processResources(PDResources resources, String prefix,
            boolean addKey) throws IOException {
        if (resources == null) {
            return;
        }
        Map<String, PDXObject> xobjects = resources.getXObjects();
        if (xobjects != null) {
            Iterator<String> xobjectIter = xobjects.keySet().iterator();
            while (xobjectIter.hasNext()) {
                String key = xobjectIter.next();
                PDXObject xobject = xobjects.get(key);
                // write the images
                if (xobject instanceof PDXObjectImage) {
                    PDXObjectImage image = (PDXObjectImage) xobject;
                    String name = null;

                    if (addKey) {
                        name = getUniqueFileName(prefix + "_" + key,
                                image.getSuffix());
                    } else {
                        name = getUniqueFileName(prefix, image.getSuffix());
                    }
                    System.out.println("Writing image:" + name + "\nHeight - "+ image.getHeight() + "\nWidth - " + image.getWidth());
                    // name="extracted/images/" + name;
                    /*BufferedImage ib= image.getRGBImage();
                    File outputfile = new File(name + "-buffered.jpg");
                    ImageIO.write(ib, "jpeg", outputfile);*/ 
                    image.write2file(name);
                }
                // maybe there are more images embedded in a form object
                else if (xobject instanceof PDXObjectForm) {
                    PDXObjectForm xObjectForm = (PDXObjectForm) xobject;
                    PDResources formResources = xObjectForm.getResources();
                    processResources(formResources, prefix, addKey);
                }
            }
        }
    }

    private String getUniqueFileName(String prefix, String suffix) {
        String uniqueName = null;
        File f = null;
        while (f == null || f.exists()) {
            uniqueName = prefix + "-" + imageCounter;
            f = new File(uniqueName + "." + suffix);
            imageCounter++;
        }
        return uniqueName;
    }

    /**
     * This will print the usage requirements and exit.
     */
    private static void usage() {
        System.err
                .println("Usage: java org.apache.pdfbox.ExtractImages [OPTIONS] <PDF file>\n"
                        + "  -password  <password>        Password to decrypt document\n"
                        + "  -prefix  <image-prefix>      Image prefix(default to pdf name)\n"
                        + "  -addkey                      add the internal image key to the file name\n"
                        + "  -nonSeq                      Enables the new non-sequential parser\n"
                        + "  <PDF file>                   The PDF document to use\n");
        System.exit(1);
    }

}
package com.abp.pdf.util;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.Iterator;
导入java.util.List;
导入java.util.Map;
导入javax.imageio.imageio;
导入org.apache.pdfbox.pdmodel.PDDocument;
导入org.apache.pdfbox.pdmodel.PDPage;
导入org.apache.pdfbox.pdmodel.PDResources;
导入org.apache.pdfbox.pdmodel.encryption.AccessPermission;
导入org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial;
导入org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject;
导入org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
导入org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
公共类图像提取{
专用int imageCounter=1;
私有图像(){
}
公共静态void main(字符串[]args)引发异常{
ExtractImages extractor=新的ExtractImages();
提取器。提取器图像(args);
}
私有void extractImages(字符串[]args)引发异常{
字符串pdfFile=null;
字符串密码=”;
字符串前缀=null;
布尔addKey=false;
布尔值useNonSeqParser=true;
pdfFile=“/home/suvankar/Resources/myfile.pdf”;
if(前缀==null&&pdfFile.length()>4){
前缀=pdfFile.substring(0,pdfFile.lastIndexOf(“/”)+1)
+“提取/图像”
+pdfFile.substring(pdfFile.lastIndexOf(“/”),
pdfFile.length()-4);
}
PDDocument文件=null;
试一试{
如果(使用非设备转换器){
document=PDDocument.loadNonSeq(新文件(pdfFile),null,
密码);
}否则{
document=PDDocument.load(pdfFile);
if(document.isEncrypted()){
StandardDecryptionMaterial spm=新的StandardDecryptionMaterial(
密码);
文件保护(spm);
}
}
AccessPermission ap=document.getCurrentAccessPermission();
如果(!ap.canExtractContent()){
抛出新IOException(
“错误:您没有提取图像的权限。”);
}
列表页面=document.getDocumentCatalog().getAllPages();
迭代器iter=pages.Iterator();
while(iter.hasNext()){
PDPage=(PDPage)iter.next();
PDResources=page.getResources();
processResources(资源、前缀、addKey);
}
}最后{
如果(文档!=null){
document.close();
}
}
}
私有void processResources(PDResources、字符串前缀、,
布尔addKey)抛出IOException{
if(资源==null){
返回;
}
Map xobjects=resources.getXObjects();
if(xObject!=null){
迭代器XObjecter=xobjects.keySet().Iterator();
while(xObjecter.hasNext()){
String key=xObjecter.next();
PDXObject xobject=xobjects.get(键);
//写下图片
if(PDXObjectImage的xobject实例){
PDXObjectImage=(PDXObjectImage)xobject;
字符串名称=null;
如果(addKey){
name=getUniqueFileName(前缀+“”+键,
image.getSuffix());
}否则{
name=getUniqueFileName(前缀,image.getSuffix());
}
System.out.println(“写入图像:“+name+”\nHeight-“+image.getHeight()+”\nWidth-“+image.getWidth());
//name=“extracted/images/”+name;
/*BuffereImage ib=image.getRGBImage();
File outputfile=新文件(名称+“-buffered.jpg”);
ImageIO.write(ib,“jpeg”,输出文件);*/
image.write2文件(名称);
}
//可能表单对象中嵌入了更多图像
else if(PDXObject窗体的xobject实例){
PDXObjectForm xObjectForm=(PDXObjectForm)xobject;
PDResources formResources=xObjectForm.getResources();
processResources(formResources、前缀、addKey);
}
}
}
}
私有字符串getUniqueFileName(字符串前缀、字符串后缀){
字符串uniqueName=null;
文件f=null;
而(f==null | | f.exists()){
uniqueName=前缀+“-”+图像计数器;
f=新文件(uniqueName+“+后缀);
imageCounter++;
}
返回唯一名称;
}
/**
*这将打印使用要求并退出。
*/
私有静态void用法(){
System.err
.println(“用法:java org.apache.pdfbox.ExtractImages[OPTIONS]\n”
+“-解密文档的密码\n”