package gaizhang; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Element; import com.itextpdf.text.Image; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.AcroFields; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfDictionary; import com.itextpdf.text.pdf.PdfName; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import com.itextpdf.text.pdf.parser.ContentByteUtils; import com.itextpdf.text.pdf.parser.ImageRenderInfo; import com.itextpdf.text.pdf.parser.PdfContentStreamProcessor; import com.itextpdf.text.pdf.parser.RenderListener; import com.itextpdf.text.pdf.parser.TextRenderInfo; public class ceshi3 { public static void main(String[] args) throws Exception { File pdfFile = new File("D:\\PdfTable6.pdf"); byte[] pdfData = new byte[(int) pdfFile.length()]; FileInputStream inputStream = null; try { inputStream = new FileInputStream(pdfFile); inputStream.read(pdfData); } catch (IOException e) { throw e; } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { } } } String keyword = "盖章"; List<float[]> positions = findKeywordPostions(pdfData, keyword); System.out.println("total:" + positions.size()); if (positions != null && positions.size() > 0) { for (float[] position : positions) { System.out.print("pageNum: " + (int) position[0]); System.out.print("\tx: " + position[1]); System.out.println("\ty: " + position[2]); gaizhang(pdfFile,new File("d:\\111.pdf"),(int) position[0],position[1],position[2],"d:\\2222.png"); } } } public static void gaizhang(File src,File dest,int page,float x,float y,String imagePath)throws Exception{ // 读取模板文件 InputStream input = new FileInputStream(src); PdfReader reader = new PdfReader(input); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); Rectangle pageSize = reader.getPageSize(1); float height = pageSize.getHeight(); float width = pageSize.getWidth(); x = width*x; y = height-height*y-145; // 读图片 Image image = Image.getInstance(imagePath); // 获取操作的页面 PdfContentByte under = stamper.getOverContent(page); // 添加图片 //调整图片尺寸 image.setAbsolutePosition(x, y); under.addImage(image); stamper.close(); reader.close(); } /** * * 【功能描述:添加图片和文字水印】 【功能详细描述:功能详细描述】 * @param srcFile 待加水印文件 * @param destFile 加水印后存放地址 * @param text 加水印的文本内容 * @param textWidth 文字横坐标 * @param textHeight 文字纵坐标 * @throws Exception */ public void addWaterMark(String srcFile, String destFile, String text, int textWidth, int textHeight) throws Exception { // 待加水印的文件 PdfReader reader = new PdfReader(srcFile); // 加完水印的文件 PdfStamper stamper = new PdfStamper(reader, new FileOutputStream( destFile)); int total = reader.getNumberOfPages() + 1; PdfContentByte content; // 设置字体 BaseFont font = BaseFont.createFont(); // 循环对每页插入水印 for (int i = 1; i < total; i++) { // 水印的起始 content = stamper.getUnderContent(i); // 开始 content.beginText(); // 设置颜色 默认为蓝色 content.setColorFill(BaseColor.BLUE); // content.setColorFill(Color.GRAY); // 设置字体及字号 content.setFontAndSize(font, 38); // 设置起始位置 // content.setTextMatrix(400, 880); content.setTextMatrix(textWidth, textHeight); // 开始写入水印 content.showTextAligned(Element.ALIGN_LEFT, text, textWidth, textHeight, 45); content.endText(); } stamper.close(); } /** * findKeywordPostions * * @param pdfData * @param keyword * @return List<float[]> : float[0]:pageNum float[1]:x float[2]:y * @throws IOException */ public static List<float[]> findKeywordPostions(byte[] pdfData, String keyword) throws IOException { List<float[]> result = new ArrayList<float[]>(); List<PdfPageContentPositions> pdfPageContentPositions = getPdfContentPostionsList(pdfData); for (PdfPageContentPositions pdfPageContentPosition : pdfPageContentPositions) { List<float[]> charPositions = findPositions(keyword, pdfPageContentPosition); if (charPositions == null || charPositions.size() < 1) { continue; } result.addAll(charPositions); } return result; } private static List<PdfPageContentPositions> getPdfContentPostionsList( byte[] pdfData) throws IOException { PdfReader reader = new PdfReader(pdfData); List<PdfPageContentPositions> result = new ArrayList<PdfPageContentPositions>(); int pages = reader.getNumberOfPages(); for (int pageNum = 1; pageNum <= pages; pageNum++) { float width = reader.getPageSize(pageNum).getWidth(); float height = reader.getPageSize(pageNum).getHeight(); PdfRenderListener pdfRenderListener = new PdfRenderListener( pageNum, width, height); // 解析pdf,定位位置 PdfContentStreamProcessor processor = new PdfContentStreamProcessor( pdfRenderListener); PdfDictionary pageDic = reader.getPageN(pageNum); PdfDictionary resourcesDic = pageDic.getAsDict(PdfName.RESOURCES); try { processor.processContent(ContentByteUtils .getContentBytesForPage(reader, pageNum), resourcesDic); } catch (IOException e) { reader.close(); throw e; } String content = pdfRenderListener.getContent(); List<CharPosition> charPositions = pdfRenderListener .getcharPositions(); List<float[]> positionsList = new ArrayList<float[]>(); for (CharPosition charPosition : charPositions) { float[] positions = new float[] { charPosition.getPageNum(), charPosition.getX(), charPosition.getY() }; positionsList.add(positions); } PdfPageContentPositions pdfPageContentPositions = new PdfPageContentPositions(); pdfPageContentPositions.setContent(content); pdfPageContentPositions.setPostions(positionsList); result.add(pdfPageContentPositions); } reader.close(); return result; } private static List<float[]> findPositions(String keyword, PdfPageContentPositions pdfPageContentPositions) { List<float[]> result = new ArrayList<float[]>(); String content = pdfPageContentPositions.getContent(); List<float[]> charPositions = pdfPageContentPositions.getPositions(); for (int pos = 0; pos < content.length();) { int positionIndex = content.indexOf(keyword, pos); if (positionIndex == -1) { break; } float[] postions = charPositions.get(positionIndex); result.add(postions); pos = positionIndex + 1; } return result; } private static class PdfPageContentPositions { private String content; private List<float[]> positions; public String getContent() { return content; } public void setContent(String content) { this.content = content; } public List<float[]> getPositions() { return positions; } public void setPostions(List<float[]> positions) { this.positions = positions; } } private static class PdfRenderListener implements RenderListener { private int pageNum; private float pageWidth; private float pageHeight; private StringBuilder contentBuilder = new StringBuilder(); private List<CharPosition> charPositions = new ArrayList<CharPosition>(); public PdfRenderListener(int pageNum, float pageWidth, float pageHeight) { this.pageNum = pageNum; this.pageWidth = pageWidth; this.pageHeight = pageHeight; } @Override public void beginTextBlock() { } @Override public void renderText(TextRenderInfo renderInfo) { List<TextRenderInfo> characterRenderInfos = renderInfo .getCharacterRenderInfos(); for (TextRenderInfo textRenderInfo : characterRenderInfos) { String word = textRenderInfo.getText(); if (word.length() > 1) { word = word.substring(word.length() - 1, word.length()); } com.itextpdf.awt.geom.Rectangle2D.Float rectangle = textRenderInfo.getAscentLine() .getBoundingRectange(); double x = rectangle.getMinX(); double y = rectangle.getMaxY(); float xPercent = Math.round(x / pageWidth * 10000) / 10000f; float yPercent = Math.round((1 - y / pageHeight) * 10000) / 10000f;// CharPosition charPosition = new CharPosition(pageNum, xPercent, yPercent); charPositions.add(charPosition); contentBuilder.append(word); } } @Override public void endTextBlock() { } @Override public void renderImage(ImageRenderInfo renderInfo) { } public String getContent() { return contentBuilder.toString(); } public List<CharPosition> getcharPositions() { return charPositions; } } private static class CharPosition { private int pageNum = 0; private float x = 0; private float y = 0; public CharPosition(int pageNum, float x, float y) { this.pageNum = pageNum; this.x = x; this.y = y; } public int getPageNum() { return pageNum; } public float getX() { return x; } public float getY() { return y; } @Override public String toString() { return "[pageNum=" + this.pageNum + ",x=" + this.x + ",y=" + this.y + "]"; } } }
相关推荐
Java实现PDF模板指定位置插入图片 Java语言是当今最流行的编程语言之一,对于PDF文档的处理有着非常广泛的应用。本文将详细介绍如何使用Java语言在PDF模板的指定位置插入图片,实现对PDF文档的自定义和编辑。 ...
本文将深入探讨如何使用Java读取PDF文件,查找特定文字的位置,并在此基础上添加悬浮图片,以实现签字或盖章的功能。首先,我们需要理解PDF文档的结构以及如何在Java中操作PDF。 PDF(Portable Document Format)是...
Split & Merge – 使用PDFBox,您可以将单个PDF文件分成多个文件,并将它们合并为一个文件。 Fill Forms – 使用PDFBox,您可以在文档中填写表单数据。 Print – 使用PDFBox,您可以使用标准Java打印API打印PDF文件...
本示例主要探讨如何利用Java技术实现PDF模板套打,包括二维码、文字和表格的插入。PDF作为一种通用的文档格式,具有良好的跨平台性和打印质量,因此广泛应用于各种业务场景。 首先,我们需要一个可靠的PDF库来帮助...
2. **插入图片**:在PDF中插入公章图片,可以使用iText的`Image`类。首先,你需要读取公章的图片文件(通常是.png或.jpg格式),然后将其转换为PDF可接受的格式,最后使用`addImage()`方法将其插入到PDF的指定位置。...
插入图片可以使用`Image`类,支持多种格式如JPEG和PNG: ```java Image image = Image.getInstance("image.jpg"); document.add(image); ``` 创建表格则需要用到` PdfPTable`类,可以设置列宽、单元格样式等: ``...
在Java中,我们可以使用`FontFactory`(iText)或`PDFont`(PDFBox)来加载这种字体,并应用到PDF文档的文字上,以实现特定的中文字体效果。 至于“pdf”文件,这可能是生成的PDF样本,用于参考或测试。你可以使用...
在Java开发中,生成PDF(Portable Document Format)文件是一项常见的任务,这通常涉及到处理文本、字体和布局。PDF是一种广泛使用的格式,它能够保持文档的原始格式,方便跨平台查看和打印。本篇将深入探讨如何在...
本文将深入探讨如何使用Java实现PDF的生成,并特别关注支持中文字符的处理。 首先,我们需要一个库来帮助我们处理PDF的生成。在Java世界中,iText和Apache PDFBox是两个非常流行的库。对于本例,考虑到"JAVA PDF"的...
Text.javalowagie 写入 pdf 中的图片和文字lowagie 写入 pdf 中的图片和文字lowagie 写入 pdf 中的图片和文字lowagie 写入 pdf 中的图片和文字
在IT行业中,定时任务是常见的自动化操作,而本项目的核心在于定时读取PDF文件并将其内容批量插入到数据库。这个任务涉及到多个技术点,包括线程管理、PDF处理、数据库操作以及工具类的设计。以下是对这些知识点的...
是一个自定义方法,用于在指定的段落中插入图片。`width`和`height`表示图片的尺寸,单位为EMU(English Metric Units,英文度量单位)。 6. **创建图片插入的XML结构** 在创建图片时,需要构造一个符合Open XML...
iText提供了`Image`类,你可以通过文件路径或者流加载印章图片,然后使用`setAbsolutePosition(x, y)`方法设定其在PDF中的位置。 下面是一个简单的示例代码片段,展示如何使用Flying Saucer和iText完成这个任务: ...
- 使用`XWPFParagraph`和`XWPFRun`类,你可以找到并替换模板中的占位符文本。占位符通常是特定格式的字符串,如`{{text}}`,在程序中会被实际值所替换。 2. **插入文本**: - 在找到占位符后,可以使用`XWPFRun`...
iText库提供了将图像插入PDF的方法,可以将生成的二维码图片插入到PDF的合适位置。 **水印** 水印通常用于标记PDF的所有权或版权,可以是文本或图像。在iText中,你可以使用ColumnText类在PDF的每个页面上添加透明...
在这个“pdf转文字和图片”的压缩包中,很可能包含了一个使用PDFBox实现的示例程序或工具,帮助用户快速实现PDF到图像和文本的转换。 1. PDF转图片: 使用PDFBox,我们可以将PDF文档的每一页转换为图像文件,如JPG...
在使用OpenPDF时,你需要了解Java编程语言,并熟悉基本的PDF概念。其API设计友好,易于理解和使用。不过,由于PDF格式的复杂性,深入使用时可能会遇到一些挑战,如处理PDF的兼容性和渲染问题。这时,开发者可能需要...
在Java编程环境中,导出PDF(Portable Document Format)文件是一项常见的任务,特别是在生成报告、文档或发票等场景中。PDF格式因其跨平台性和良好的显示一致性而受到广泛应用。本篇文章将详细探讨如何使用Java来...
4. **PDF导出图片demo**:在PDF中插入图片也是常见的需求。iText库提供了`Image`类,可以从URL、文件或字节数组创建图像。需要注意的是,图片的大小和位置调整,以及图片的透明度和质量设置。 5. **Apache PDFBox**...
在文档中插入图片则需要用到`Image`类。你可以通过`Image.getInstance()`方法加载图片资源,然后将图片添加到文档中。注意,图片需要是PDF兼容的格式,如JPEG或PNG。可以调整图片的尺寸和位置以适应文档布局。 至于...