ITEXT-小图片并排显示,大图片按行显示

x33g5p2x  于2021-12-28 转载在 其他  
字(5.0k)|赞(0)|评价(0)|浏览(491)

问题场景

使用itext开发PDF过程中,有这样一个需求:有N个图片,每个图片大小不一,要求小图片每2个并排显示,大图片逐一按行显示。那么问题来了,图片多小算小?由API知image01.getWidth()与image01.getWeight()可以判断图片大小。

代码

需导入的jar包:itext-pdfa-5.5.6.jar、itext-xtra-5.5.6.jar、itext-5.5.6.jar、itext-asian.jar

  1. /** * 添加图片(有并排需求) 图片高度必须一致 * 思路: * 1. 通过图片的宽度是否小于pos值决定是否并排显示,是-> half; 否->all * 2. 新建一个2列的PdfTable * 3. 根据得到的half与all集合判断显示图片 * @param imagesDNA 图片集合 * @param size 样品编号数量 * @param reportCompile 信息载体,应用的时候可根据情况忽略 * @param document * @param writer * @param baseFont1 * @param yahei09 * @param imageLocalAddr 本地图片前缀 * @param pos 图片宽度标准 * @throws DocumentException * @throws MalformedURLException * @throws IOException */
  2. private void addFulu(List<PdfImage> imagesDNA, int size, ReportCompile reportCompile, Document document, PdfWriter writer, BaseFont baseFont1,
  3. Font yahei09, String imageLocalAddr, Float pos) throws DocumentException, MalformedURLException, IOException {
  4. String bigTitle = "";
  5. String completeCheck = reportCompile.getCompleteCheck();
  6. if (completeCheck != null && completeCheck.equals("1") || completeCheck.equals("2")) {
  7. bigTitle = "a";
  8. } else if (completeCheck != null && completeCheck.equals("3")){
  9. bigTitle = "b";
  10. } else if (completeCheck != null && completeCheck.equals("4")){
  11. bigTitle = "c";
  12. }
  13. if (imagesDNA == null) {
  14. System.out.println("在图片库没有查到值.");
  15. PdfPTable table = new PdfPTable(1);
  16. PdfPCell cell0 = new PdfPCell();
  17. Paragraph p = new Paragraph(bigTitle, yahei09);
  18. p.setFirstLineIndent(-14f);
  19. p.setSpacingAfter(20f);
  20. cell0.addElement(p);
  21. String imagePath = imageLocalAddr + "error.png";
  22. Image image01 = Image.getInstance(imagePath);
  23. image01.scaleAbsoluteWidth(250);
  24. image01.scaleAbsoluteHeight(80);
  25. cell0.setBorder(0);
  26. cell0.setPaddingLeft(100f);
  27. cell0.addElement(image01);
  28. table.addCell(cell0);
  29. table.setSplitLate(false);
  30. table.setSplitRows(false);
  31. document.add(table);
  32. } else {
  33. PdfImage[] images = new PdfImage[imagesDNA.size() > size ? size : imagesDNA.size()];
  34. images = imagesDNA.toArray(images);
  35. List<String> flags = this.getFlagRowOrCol(imagesDNA, pos, imageLocalAddr);
  36. PdfPTable table = new PdfPTable(2);
  37. int halfFlagNum = 0;
  38. for (int i = 0; i < images.length; i++) {
  39. if (flags.get(i).equals("half")) {
  40. halfFlagNum++;
  41. }
  42. PdfPCell cell = new PdfPCell();
  43. if (i == 0) {
  44. Paragraph p = new Paragraph(bigTitle, yahei09);
  45. p.setSpacingAfter(14f);
  46. cell.addElement(p);
  47. }
  48. String imagePath = images[i].getImagePath();
  49. if (imagePath == null || imagePath == "") {
  50. imagePath = imageLocalAddr + "error.png";
  51. } else {
  52. imagePath = "http://file.xxx.com" + imagePath;
  53. }
  54. Image image01 = null;
  55. try {
  56. image01 = Image.getInstance(imagePath);
  57. } catch (FileNotFoundException e) {
  58. image01 = Image.getInstance(imageLocalAddr + "error.png");
  59. }
  60. if (flags.get(i).equals("half")) {
  61. image01.scalePercent(75);
  62. //设置对齐方式
  63. if (halfFlagNum % 2 == 1) {
  64. image01.setAlignment(Image.RIGHT);
  65. cell.setPaddingLeft(-21f);
  66. cell.setPaddingRight(15f);
  67. } else {
  68. cell.setPaddingLeft(35f);
  69. }
  70. cell.setRowspan(2);
  71. } else {
  72. if (image01.getWidth() <= pos) {
  73. image01.scalePercent(75);
  74. } else {
  75. image01.scalePercent(45);
  76. }
  77. image01.setAlignment(Image.MIDDLE);
  78. cell.setColspan(2);
  79. if (images.length == 1) {
  80. cell.setPaddingLeft(-21f);
  81. }
  82. }
  83. cell.addElement(image01);
  84. cell.setBorder(0);
  85. if (i > 0) {
  86. cell.setPaddingTop(32f);
  87. }
  88. table.addCell(cell);
  89. table.setSplitLate(false);
  90. table.setSplitRows(false);
  91. }
  92. document.add(table);
  93. }
  94. }
  95. /** * 获取标志位 * 直接通过图片的宽度来判断是否并排显示 * @param imagesDNA * @param pos 图片宽度标准,2个小图片放在一行 * @param imageLocalAddr * @return * @throws IOException * @throws MalformedURLException * @throws BadElementException */
  96. private List<String> getFlagRowOrCol(List<PdfImage> imagesDNA, Float pos, String imageLocalAddr) throws BadElementException, MalformedURLException, IOException {
  97. List<String> res = new ArrayList<String>();
  98. List<Float> list = new ArrayList<Float>();
  99. if (imagesDNA != null && imagesDNA.size() > 0) {
  100. for (int i = 0; i < imagesDNA.size(); i++) {
  101. String imagePath = imagesDNA.get(i).getImagePath();
  102. if (imagePath == null || imagePath == "") {
  103. imagePath = imageLocalAddr + "error.png";
  104. } else {
  105. imagePath = "http://file.xxx.com" + imagePath;
  106. }
  107. Image image01 = null;
  108. try {
  109. image01 = Image.getInstance(imagePath);
  110. } catch (FileNotFoundException e) {
  111. image01 = Image.getInstance(imageLocalAddr + "error.png");
  112. }
  113. list.add(image01.getWidth());
  114. }
  115. }
  116. if (list.size() <= imagesDNA.size()) {
  117. res = this.judgeRowOrCol(list, pos);
  118. }
  119. return res;
  120. }
  121. /** * 此方法用于判断是合并列还是合并行 * @param list 判断依据 * @param pos 连续两个在一起的且小于等于pos值的标志位为half,否则为all * @return */
  122. private List<String> judgeRowOrCol(List<Float> list, Float pos) {
  123. List<String> res = new ArrayList<String>();
  124. String half = "half";
  125. String all = "all";
  126. int couple = 0;
  127. if (list != null && list.size() > 0) {
  128. for (int i = 0; i < list.size(); i++) {
  129. float current = list.get(i);
  130. if (i < list.size() - 1) {
  131. float next = list.get(i + 1);
  132. if (current <= pos) {
  133. couple++;
  134. if (next <= pos && couple != 2) {
  135. res.add(half);
  136. } else {
  137. if (couple == 2) {
  138. res.add(half);
  139. couple = 0;
  140. } else {
  141. res.add(all);
  142. }
  143. }
  144. } else {
  145. res.add(all);
  146. couple = 0;
  147. }
  148. } else {
  149. float previous = list.size() == 1 ? current : list.get(i - 1);
  150. if (previous <= pos && current <= pos) {
  151. if (list.size() == 1) {
  152. res.add(all);
  153. } else {
  154. if (couple == 0) {
  155. res.add(all);
  156. } else {
  157. res.add(half);
  158. }
  159. }
  160. } else {
  161. res.add(all);
  162. }
  163. }
  164. }
  165. }
  166. return res;
  167. }

相关文章