PDFBox图像大小问题

时间:2013-07-27 06:31:37

标签: image pdfbox

我刚开始使用PdfBox而且在显示图像时遇到了一个小问题。我能够导入大小为800 * 900像素的图像,并且在现有pdf中以100%查看时看起来很好。但是,使用以下代码生成生成的PDF时,图像会变得模糊,图像会超出A4页面的边界。

是否有不同的尺寸调整/保存方式,以便在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();
    }

5 个答案:

答案 0 :(得分:6)

我在这个问题上遇到了同样的问题,但给出的答案是不正确的。

经过一番研究,我找到了解决方案。

使用函数drawXObject

而不是使用drawImage函数
contentStream.drawXObject( img, 10, 700, 100, 100 );

最后两个数字指定要绘制的图像的大小。

答案 1 :(得分:3)

我想指出,从2.0开始,Victor的答案中的contentStream.drawXObject函数调用已被弃用。如果您想指定宽度和高度,使用contentStream.drawImage(image, x, y, width, height)

答案 2 :(得分:1)

如果您的意图是PDF上的A4尺寸照片,那么我猜您会找到典型A4的实际尺寸(以像素为单位)。

另外你应该知道你要查看的图片的扩展名,如jpg,gif或bmp ......

从我在你的代码中看到的,图片的尺寸是10 X 700,我相信它的尺寸非常小。

contentStream.drawImage(img, 10, 700);

图片的扩展名为:jpg

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

检查并返回以获取更多信息。

就是这样。  祝你好运'''

答案 3 :(得分:0)

对于类似的情况,对于我来说,对于PDF 2.0.11和尺寸为1600 x 2100的tiff文件,以下代码完全适合A4(纵向)尺寸的图像。不确定PDFRectangle是否适合您。

我直接从PDFBOX中获得了这个示例-Example

我唯一调整/介绍的是:

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

这是完整的示例:

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..!");
    }
}

希望有帮助。

答案 4 :(得分:-1)

根据新的API 2.0.x,人们可以使用PDRectangle来获取Pdf页面的宽度和高度。可以使用PDPageContentStream根据PDF页面绘制图像。 供参考:

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