我刚开始使用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();
}
答案 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());
}