Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PDFBox image size issues

Tags:

image

pdfbox

I'm new to working with PdfBox and I'm having a small issue when displaying images. I'm able to import the image, which is sized at 800*900 pixels, and looks fine when viewed in an existing pdf at 100%. However when the resulting PDF is generated using the below code, the image becomes blurry, and the image extends beyond the boundaries of the A4 page.

Is there a different way of sizing/saving images so that they display correctly in pdfbox?

public class PDFtest {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws IOException, COSVisitorException {
    // TODO code application logic here
    // Create a document and add a page to it
    PDDocument document = new PDDocument();
    PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
    document.addPage(page);

    // Create a new font object selecting one of the PDF base fonts
    PDFont font = PDType1Font.HELVETICA_BOLD;
    InputStream in = new FileInputStream(new File("img.jpg"));
    PDJpeg img = new PDJpeg(document, in);
    // Start a new content stream which will "hold" the to be created content
    PDPageContentStream contentStream = new PDPageContentStream(document, page);

    // Define a text content stream using the selected font, moving the cursor and drawing the text "Hello World"

    contentStream.drawImage(img, 10, 700);
    contentStream.beginText();        
    contentStream.setFont(font, 12);
    contentStream.moveTextPositionByAmount(10, 650);
    contentStream.drawString("Hello World");
    contentStream.endText();

    // Make sure that the content stream is closed:
    contentStream.close();

    // Save the results and ensure that the document is properly closed:
    document.save("Hello World.pdf");
    document.close();
    }
like image 443
Paddy Mallam Avatar asked Jul 27 '13 06:07

Paddy Mallam


3 Answers

I'd like to point out that as of 2.0 the contentStream.drawXObject function call in Victor's answer is deprecated. If you want to specify a width and height you should use contentStream.drawImage(image, x, y, width, height)

like image 188
Taelsin Avatar answered Sep 28 '22 01:09

Taelsin


I had the same problem asked in this question, but the given answer is not right.

After some research I found a solution.

Instead of using the function drawImage use the function drawXObject

contentStream.drawXObject( img, 10, 700, 100, 100 );

Where the last two numbers specify the size of the image to be drawn.

like image 24
Victor Avatar answered Sep 28 '22 00:09

Victor


For similar situation, for me, with PDF 2.0.11 and a tiff file of dimensions - 1600 x 2100 the following code perfectly fit the image in A4 (portrait) size. Not sure if PDFRectangle is okay with you.

I got this example straight from PDFBOX - Example

The only thing I tweaked/introduced is:

PDRectangle.A4.getWidth(), PDRectangle.A4.getHeight()

Here is the full sample:

public static void main(String[] args) throws IOException
{
//        if (args.length != 2)
//        {
//            System.err.println("usage: " + ImageToPDF.class.getName() + " <image> <output-file>");
//            System.exit(1);
//        }

    String imagePath = "C:/FAX/sample.tiff";
    String pdfPath = "C:/FAX/sample.pdf";

    if (!pdfPath.endsWith(".pdf"))
    {
        System.err.println("Last argument must be the destination .pdf file");
        System.exit(1);
    }

    try (PDDocument doc = new PDDocument())
    {
        PDPage page = new PDPage();
        doc.addPage(page);

        // createFromFile is the easiest way with an image file
        // if you already have the image in a BufferedImage, 
        // call LosslessFactory.createFromImage() instead
        PDImageXObject pdImage = PDImageXObject.createFromFile(imagePath, doc);

        // draw the image at full size at (x=20, y=20)
        try (PDPageContentStream contents = new PDPageContentStream(doc, page))
        {
            // draw the image at full size at (x=20, y=20)
            contents.drawImage(pdImage, 0, 0, PDRectangle.A4.getWidth(), PDRectangle.A4.getHeight());

            // to draw the image at half size at (x=20, y=20) use
            // contents.drawImage(pdImage, 20, 20, pdImage.getWidth() / 2, pdImage.getHeight() / 2); 
        }
        doc.save(pdfPath);
        System.out.println("Tiff converted to PDF succussfully..!");
    }
}

Hope it helps.

like image 28
Ajay Kumar Avatar answered Sep 28 '22 01:09

Ajay Kumar