使用java将多个图像添加到使用iText的单个pdf文件中

我有以下代码,但此代码仅将最后一个图像添加到pdf中。

try { filePath = (filePath != null && filePath.endsWith(".pdf")) ? filePath : filePath + ".pdf"; Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filePath)); document.open(); // document.add(new Paragraph("Image Example")); for (String imageIpath : imagePathsList) { // Add Image Image image1 = Image.getInstance(imageIpath); // Fixed Positioning image1.setAbsolutePosition(10f, 10f); // Scale to new height and new width of image image1.scaleAbsolute(600, 800); // image1.scalePercent(0.5f); // Add to document document.add(image1); //document.bottom(); } writer.close(); } catch (Exception e) { LOGGER.error(e.getMessage()); } 

您是否会给我一个关于如何更新代码以便将所有图像添加到导出的pdf中的提示? imagePathsList包含我想要添加到单个pdf中的所有图像路径。

最诚挚的问候,Aurelian

看一下MultipleImages示例,您会发现代码中有两个错误:

  1. 您创建一个大小为595 x 842用户单位的页面,无论图像的尺寸如何,您都将每个图像添加到该页面。
  2. 您声称只添加了一个图像,但事实并非如此。 您将在同一页面上将所有图像添加到彼此之上。 最后一张图片涵盖了之前的所有图像。

看看我的代码:

 public void createPdf(String dest) throws IOException, DocumentException { Image img = Image.getInstance(IMAGES[0]); Document document = new Document(img); PdfWriter.getInstance(document, new FileOutputStream(dest)); document.open(); for (String image : IMAGES) { img = Image.getInstance(image); document.setPageSize(img); document.newPage(); img.setAbsolutePosition(0, 0); document.add(img); } document.close(); } 

我使用第一个图像的大小创建一个Document实例。 然后我循环遍历图像数组, 触发newPage() [*] 之前将下一页的页面大小设置为每个图像的大小。 然后我在坐标0,0处添加图像,因为现在图像的大小将与每个页面的大小相匹配。

[*] newPage()方法仅在将某些内容添加到当前页面时才有效。 第一次进行循环时,尚未添加任何内容,因此没有任何反应。 这就是您在创建Document实例时需要将页面大小设置为第一个图像的大小的原因。

Android具有“PdfDocument”function来实现这一目标,

 class Main2Activity : AppCompatActivity() { private var imgFiles: Array? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2) imgFiles= arrayOfNulls(2) imgFiles!![0] = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + "/doc1.png") imgFiles!![1] = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + "/doc3.png") val file = getOutputFile(File(Environment.getExternalStorageDirectory().absolutePath) , "/output.pdf") val fOut = FileOutputStream(file) val document = PdfDocument() var i = 0 imgFiles?.forEach { i++ val bitmap = BitmapFactory.decodeFile(it?.path) val pageInfo = PdfDocument.PageInfo.Builder(bitmap.width, bitmap.height, i).create() val page = document.startPage(pageInfo) val canvas = page?.canvas val paint = Paint() canvas?.drawPaint(paint) paint.color = Color.BLUE; canvas?.drawBitmap(bitmap, 0f, 0f, null) document.finishPage(page) bitmap.recycle() } document.writeTo(fOut) document.close() } private fun getOutputFile(path: File, fileName: String): File? { if (!path.exists()) { path.mkdirs() } val file = File(path, fileName) try { if (file.exists()) { file.delete() } file.createNewFile() } catch (e: Exception) { e.printStackTrace() } return file } 

}

最后在清单中启用存储权限,这应该有效