Java PDFBox-从图像生成PDF的问题

Java PDFBox-从图像生成PDF的问题,java,pdfbox,Java,Pdfbox,我正在尝试从JPEG、BMP类型的图像生成PDF,但我得到的右侧图像的一部分总是被切断。我正在使用默认的windows picture Sunset.jpg之一 代码如下: import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.imageio.strea

我正在尝试从JPEG、BMP类型的图像生成PDF,但我得到的右侧图像的一部分总是被切断。我正在使用默认的windows picture Sunset.jpg之一

代码如下:

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

    import javax.imageio.ImageIO;
    import javax.imageio.stream.FileImageInputStream;
    import org.apache.pdfbox.exceptions.COSVisitorException;
    import org.apache.pdfbox.io.RandomAccessFile;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.pdmodel.PDPage;
    import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
    import org.apache.pdfbox.pdmodel.graphics.xobject.PDCcitt;
    import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg;
    import org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap;
    import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;

    public class ImageToPDF 
    {
        public void createPDFFromImage( String file, String image) throws IOException, COSVisitorException
        {
            PDDocument doc = null;
            try
            {
                doc = new PDDocument();
                PDPage page = new PDPage();
                doc.addPage( page );
                PDXObjectImage ximage = null;
                if( image.toLowerCase().endsWith( ".jpg" ) || image.toLowerCase().endsWith( ".jpeg" ))
                {        
                    BufferedImage awtImage = ImageIO.read( new File( image ) );             
            ximage = new PDJpeg(doc, awtImage, 0 );
                }
                else if (image.toLowerCase().endsWith(".tif") || image.toLowerCase().endsWith(".tiff"))
                {
                     ximage = new PDCcitt(doc, new RandomAccessFile(new File(image),"r"));
                }
                else
                {
                         BufferedImage awtImage = new BufferedImage(1000, 800, BufferedImage.TYPE_INT_RGB);             
                     awtImage = ImageIO.read(new FileImageInputStream(new File( image )));                              
                     ximage = new PDPixelMap(doc, awtImage);
                }
                System.out.println(" Width of the image.... "+ximage.getWidth());
                PDPageContentStream contentStream = new PDPageContentStream(doc, page);            
                contentStream.drawImage( ximage, 20, 20 );
                contentStream.close();
                doc.save( file );
           }
           finally
           {
                if( doc != null )
                {
                    doc.close();
                }
           }
       }

       public static void main(String[] args)
       {
            ImageToPDF app = new ImageToPDF();
            try
            {
                 app.createPDFFromImage( "C:\\test1.pdf", "C:\\Sunset.jpg");                        
            }
            catch (Exception e)
            {
                 e.printStackTrace();
            }
       }
}


请帮我纠正我做错的地方。

你考虑过裁剪你的图像以防止它被切断吗

contentStream.drawImage( ximage, 20, 20, croppedWidth, croppedHeight );

请尝试修改drawImage语句,如下所示:

content.drawImage(ximage,0 /*or your preferred indent*/,(700-ximage.getHeight()));

这些代码可能对您有所帮助,它是有效的

    public void createPDFFromImage(String pdfFile, 
        List<String> imgList,int x, int y, float scale) throws IOException, COSVisitorException {
    // the document
    PDDocument doc = null;
    try {
        doc = new PDDocument();
        Iterator iter = imgList.iterator();
        int imgIndex=0;
        while(iter.hasNext()) {
            PDPage page = new PDPage();
            doc.addPage(page);

            BufferedImage tmp_image = ImageIO.read(new File(iter.next().toString()));
            BufferedImage image = new BufferedImage(tmp_image.getWidth(), tmp_image.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);        
            image.createGraphics().drawRenderedImage(tmp_image, null);

            PDXObjectImage ximage = new PDPixelMap(doc, image);

            imgIndex++;


            PDPageContentStream contentStream = new PDPageContentStream(
                    doc, page,true,true);

            contentStream.drawXObject(ximage, x, y, ximage.getWidth()*scale, ximage.getHeight()*scale);

            contentStream.close();
        }
        doc.save(pdfFile);
    } finally {
        if (doc != null) {
            doc.close();
        }
    }
}
public void createPDFFromImage(字符串Pdfile,
列出imgList、int x、int y、float scale)抛出IOException、COSVisitorException{
//文件
PDDocument=null;
试一试{
doc=新的PDDocument();
迭代器iter=imgList.Iterator();
int imgIndex=0;
while(iter.hasNext()){
PDPage page=新PDPage();
文件添加页(第页);
buffereImage tmp_image=ImageIO.read(新文件(iter.next().toString());
BuffereImage=新的BuffereImage(tmp_image.getWidth()、tmp_image.getHeight()、BuffereImage.TYPE_4BYTE_ABGR);
image.createGraphics().DrawRenderImage(tmp_图像,null);
PDXObjectImage ximage=新的PDPixelMap(文档、图像);
imgIndex++;
PDPageContentStream contentStream=新的PDPageContentStream(
doc,page,true,true);
contentStream.drawXObject(ximage,x,y,ximage.getWidth()*比例,ximage.getHeight()*比例);
contentStream.close();
}
文件保存(pdfFile);
}最后{
如果(doc!=null){
doc.close();
}
}
}

请添加以下代码片段并重试:

需要导入:

import org.apache.pdfbox.pdmodel.common.PDRectangle;
PDXObjectImage image = new PDJpeg(pdfDoc, filePath));

float w = image.getWidth();
float h = image.getHeight();

PDPage page = new PDPage(new PDRectangle (w,h));
代码添加:

import org.apache.pdfbox.pdmodel.common.PDRectangle;
PDXObjectImage image = new PDJpeg(pdfDoc, filePath));

float w = image.getWidth();
float h = image.getHeight();

PDPage page = new PDPage(new PDRectangle (w,h));
下面是一个工作例程(PDFBox版本为2.0.x),它将BuffereImage(例如签名)添加到以字节数组形式给出的PDF文档中。结果又是一个字节数组

    public static byte[] addBufferedImageIntoPdfPage(byte[] pdfDocumentData, BufferedImage imageToAdd, int pageNumber, int posX, int posY, float scaleImage) throws IOException
{
    PDDocument originalDocument = PDDocument.load(new ByteArrayInputStream(pdfDocumentData));
    PDImageXObject pdImage = LosslessFactory.createFromImage(originalDocument, imageToAdd);
    PDPage page = originalDocument.getPage(pageNumber);
    PDPageContentStream contentStream = new PDPageContentStream(originalDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);

    // better method inspired by http://stackoverflow.com/a/22318681/535646
    contentStream.drawImage(pdImage, posX, posY, pdImage.getWidth() * scaleImage, pdImage.getHeight() * scaleImage);
    contentStream.close();
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    originalDocument.save(outputStream);
    return outputStream.toByteArray();
}

希望这有帮助。干杯

你曾经在这里找到你问题的答案吗?如果是,请分享,因为我面临着同样的问题。你试过最新的吗?您是否已将所有库usch作为jemp和tempbox包含在代码中???+10对于此代码,我在PDFBox.v2.0.0:drawXObject-“@不推荐使用drawImage或drawForm”的代码示例中包含了“contentStream.drawXObject”行