我可以在现有的pdf文档中插入一个Image,但问题是,
我正在使用以下代码。
List<PDPage> pages = pdDoc.getDocumentCatalog().getAllPages();
if(pages.size() > 0){
PDJpeg img = new PDJpeg(pdDoc, in);
PDPageContentStream stream = new PDPageContentStream(pdDoc,pages.get(0));
stream.drawImage(img, 60, 60);
stream.close();
}
我希望第一页上有图片。
答案 0 :(得分:8)
PDFBox是一个用于处理PDF文件的低级库。您负责更多高级功能。因此,在此示例中,您将图像从文档的左下角开始放在(60, 60)
处。这就是stream.drawImage(img, 60, 60);
的作用。
如果您想将图片移动到其他位置,则必须计算并提供所需位置(可能来自使用page.findCropBox()
获得的尺寸,或手动输入您的位置)。
对于文本,PDF文档元素是绝对定位的。重新流动文本,浮动或类似的东西没有低级功能。如果您在图片顶部写下文字,将写在图片顶部。
最后,为了让您的网页变白 - 您正在创建新的内容流,因此会覆盖您网页的原始内容。您应将附加到已有的流中。
相关的一行是:
PDPageContentStream stream = new PDPageContentStream( pdDoc, pages.get(0));
你应该做的是这样称呼:
PDPageContentStream stream = new PDPageContentStream( pdDoc, pages.get(0), true, true);
第一个true
是追加内容,最后true
(此处不重要)是压缩流。
查看AddImageToPDF提供的PDFBox sources样本。
答案 1 :(得分:1)
试试这个
doc = PDDocument.load( inputFileName );
PDXObjectImage ximage = null;
ximage = new PDJpeg(doc, new FileInputStream( image )
PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get(0);
PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true);
contentStream.drawImage( ximage, 425, 675 );
contentStream.close();
这将在第一页打印图像。如果你想在所有页面中打印,只需要以页数为条件的for循环进行打印。 这对我很有用!
答案 2 :(得分:1)
这么晚的答案,但这是给谁在2020年与Kotlin一起工作的:drawImage()自身内部正在获取浮点值,所以请尝试以下方法:
val file = File(getPdfFile(FILE_NAME))
val document = PDDocument.load(file)
val page = document.getPage(0)
val contentStream: PDPageContentStream
contentStream = PDPageContentStream(document, page, true, true)
// Define a content stream for adding to the PDF
val bitmap: Bitmap? = ImageSaver(this).setFileName("sign.png").setDirectoryName("signature").load()
val mediaBox: PDRectangle = page.mediaBox
val ximage: PDImageXObject = JPEGFactory.createFromImage(document, bitmap)
contentStream.drawImage(ximage, mediaBox.width - 4 * 65, 26f)
// Make sure that the content stream is closed:
contentStream.close()
// Save the final pdf document to a file
pdfSaveLocation = "$directoryPDF/$UPDATED_FILE_NAME"
val pathSave = pdfSaveLocation
document.save(pathSave)
document.close()
答案 3 :(得分:0)
此link为您提供有关 类PrintImageLocations 的详细信息。 此PrintImageLocations将为您提供图像的x和y坐标。
用法:java org.apache.pdfbox.examples.util.PrintImageLocations input-pdf
答案 4 :(得分:0)
我正在创建一个新的PDF并在循环中的代码下面运行 - 每页添加一个图像,下面的坐标和高度和宽度值对我来说很有用。
其中 out 是BufferedImage引用变量
PDPage page = new PDPage();
outputdocument.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(outputdocument, page, AppendMode.APPEND, true);
PDImageXObject pdImageXObject = JPEGFactory.createFromImage(outputdocument, out);
contentStream.drawImage(pdImageXObject, 5, 2, 600, 750);
contentStream.close();