Paddy Mallam
Paddy Mallam

Reputation: 243

PDFBox image size issues

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();
    }

Upvotes: 7

Views: 23578

Answers (5)

Gunjan Aggarwal
Gunjan Aggarwal

Reputation: 11

As per the new API 2.0.x, one can use the PDRectangle to fetch Pdf page width and height. One can use PDPageContentStream to draw the image in accordance with PDF page. For reference:

try (PDPageContentStream contents = new PDPageContentStream(pdDocument, pdPage)) {
                final PDRectangle mediaBox = pdPage.getMediaBox();
                final PDImageXObject pdImage = PDImageXObject.createFromFile(image, pdDocument);
                contents.drawImage(pdImage, 0, 0, mediaBox.getWidth(), mediaBox.getHeight());
            }

Upvotes: 0

Ajay Kumar
Ajay Kumar

Reputation: 3250

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.

Upvotes: 1

Taelsin
Taelsin

Reputation: 1080

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)

Upvotes: 8

Victor
Victor

Reputation: 1003

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.

Upvotes: 6

user2624929
user2624929

Reputation: 50

If your intention is an A4 sized pic on a PDF, then i guess you find the actual size of typical A4 in pixels.

Also you should be aware of the extension of the picture that you want to view like jpg, gif, or bmp ...

from what I saw in your code, the dimensions of the picture are 10 X 700 which I believe is pretty small size.

contentStream.drawImage(img, 10, 700);

And the extension of the picture is : jpg

InputStream in = new FileInputStream(new File("img.jpg"));

check those and return for more info.

that's all. good luck'''

Upvotes: 0

Related Questions