问题 
我需要将图像(主要是 JPEG)直接转换为 PDF 文档的 PDF 页面。 
 
可能是图像大小不同。 
 
每个 PDF 页面都应具有与图像相同的精确尺寸。 
 
所以每个页面只包含全分辨率图像。 
 
我怎样才能做到这一点,即页面设置为图像/内容的尺寸? 
 
因为我看到 PDF 文件具有不同的页面大小和方向,但是如何使用 PDFBox 实现这一点? 
 
回答 
我已经用以下代码解决了这个问题: 
- PDDocument document = new PDDocument();
 
 - InputStream in = new FileInputStream(someImage);
 
 - BufferedImage bimg = ImageIO.read(in);
 
 - float width = bimg.getWidth();
 
 - float height = bimg.getHeight();
 
 - PDPage page = new PDPage(new PDRectangle(width, height));
 
 - document.addPage(page); 
 
 - PDXObjectImage img = new PDJpeg(document, new FileInputStream(someImage));
 
 - PDPageContentStream contentStream = new PDPageContentStream(document, page);
 
 - contentStream.drawImage(img, 0, 0);
 
 - contentStream.close();
 
 - in.close();
 
  
- document.save("test.pdf");
 
 - document.close();
 
  复制代码 
为了完整起见,PDFBox 2+ API 的当前 PDFBox 示例中的代码 
- /*
 
 -  * Licensed to the Apache Software Foundation (ASF) under one or more
 
 -  * contributor license agreements.  See the NOTICE file distributed with
 
 -  * this work for additional information regarding copyright ownership.
 
 -  * The ASF licenses this file to You under the Apache License, Version 2.0
 
 -  * (the "License"); you may not use this file except in compliance with
 
 -  * the License.  You may obtain a copy of the License at
 
 -  *
 
 -  *      http://www.apache.org/licenses/LICENSE-2.0
 
 -  *
 
 -  * Unless required by applicable law or agreed to in writing, software
 
 -  * distributed under the License is distributed on an "AS IS" BASIS,
 
 -  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
 -  * See the License for the specific language governing permissions and
 
 -  * limitations under the License.
 
 -  */
 
 - package org.apache.pdfbox.examples.pdmodel;
 
  
- import java.io.File;
 
 - import java.io.IOException;
 
 - import org.apache.pdfbox.pdmodel.PDDocument;
 
 - import org.apache.pdfbox.pdmodel.PDPage;
 
 - import org.apache.pdfbox.pdmodel.PDPageContentStream;
 
 - import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
 
 - import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 
  
- /**
 
 -  * This is an example that creates a reads a document and adds an image to it..
 
 -  *
 
 -  * The example is taken from the pdf file format specification.
 
 -  *
 
 -  * @author Ben Litchfield
 
 -  */
 
 - public class AddImageToPDF
 
 - {
 
 -     /**
 
 -      * Add an image to an existing PDF document.
 
 -      *
 
 -      * @param inputFile The input PDF to add the image to.
 
 -      * @param imagePath The filename of the image to put in the PDF.
 
 -      * @param outputFile The file to write to the pdf to.
 
 -      *
 
 -      * @throws IOException If there is an error writing the data.
 
 -      */
 
 -     public void createPDFFromImage( String inputFile, String imagePath, String outputFile )
 
 -             throws IOException
 
 -     {
 
 -         try (PDDocument doc = PDDocument.load(new File(inputFile)))
 
 -         {
 
 -             //we will add the image to the first page.
 
 -             PDPage page = doc.getPage(0);
 
  
-             // 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);
 
  
-             try (PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, true, true))
 
 -             {
 
 -                 // contentStream.drawImage(ximage, 20, 20 );
 
 -                 // better method inspired by http://stackoverflow.com/a/22318681/535646
 
 -                 // reduce this value if the image is too large
 
 -                 float scale = 1f;
 
 -                 contentStream.drawImage(pdImage, 20, 20, pdImage.getWidth() * scale, pdImage.getHeight() * scale);
 
 -             }
 
 -             doc.save(outputFile);
 
 -         }
 
 -     }
 
  
-     /**
 
 -      * This will load a PDF document and add a single image on it.
 
 -      * <br>
 
 -      * see usage() for commandline
 
 -      *
 
 -      * @param args Command line arguments.
 
 -      */
 
 -     public static void main(String[] args) throws IOException
 
 -     {
 
 -         AddImageToPDF app = new AddImageToPDF();
 
 -         if( args.length != 3 )
 
 -         {
 
 -             app.usage();
 
 -         }
 
 -         else
 
 -         {
 
 -             app.createPDFFromImage( args[0], args[1], args[2] );
 
 -         }
 
 -     }
 
  
-     /**
 
 -      * This will print out a message telling how to use this example.
 
 -      */
 
 -     private void usage()
 
 -     {
 
 -         System.err.println( "usage: " + this.getClass().getName() + " <input-pdf> <image> <output-pdf>" );
 
 -     }
 
 - }
 
  复制代码 
 
 
 
 |