java操作pdf文件,能否找到某个关键词所在的页码? 谢谢!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java操作pdf文件,能否找到某个关键词所在的页码? 谢谢!相关的知识,希望对你有一定的参考价值。

我刚刚做得一个PDF输出的一个小功能 发给你不知道对你有没有帮助
public static void getPDFDocument(ArrayList<UserTbl> list) throws DocumentException, IOException, BadElementException

// ドキュメントの初期化
Document document = new Document(PageSize.A4);
// システム时间を取得する
Date date = new Date();
SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH'时'mm'分'ss'秒'");
SimpleDateFormat formatter2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString=formatter.format(date);
String dateString2=formatter2.format(date);
// ドキュメントURLの设定
String filePath = "e://"+dateString+".pdf";
PdfWriter.getInstance(document, new FileOutputStream(filePath));
// ドキュメントをオープンする
document.open();
// 文字様式を设定
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font f11 = new Font(bfChinese, 11, Font.NORMAL);
Font f8 = new Font(bfChinese, 8, Font.NORMAL);
Font f12 = new Font(bfChinese, 12, Font.BOLD);
// タイトルを作成する

Paragraph p1 = new Paragraph("利用者情报一覧\n", f12);
p1.setAlignment(Element.ALIGN_CENTER);
document.add(p1);
Paragraph p2 = new Paragraph("时间:"+dateString2+"\n\n", f11);
p2.setAlignment(Element.ALIGN_RIGHT);
document.add(p2);

// テーブルを作成する
PdfPTable table = new PdfPTable(7);
PdfPCell cell = new PdfPCell();
cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell.setPhrase(new Paragraph("PCログインID", f8));
table.addCell(cell);
cell.setPhrase(new Paragraph("お名前我", f8));
table.addCell(cell);
cell.setPhrase(new Paragraph("メールアドレス", f8));
table.addCell(cell);
cell.setPhrase(new Paragraph("携帯ログインID", f8));
table.addCell(cell);
cell.setPhrase(new Paragraph("所属", f8));
table.addCell(cell);
cell.setPhrase(new Paragraph("属性", f8));
table.addCell(cell);
cell.setPhrase(new Paragraph("データ种别", f8));
table.addCell(cell);
document.add(table);
table.setWidthPercentage(100);
// テーブルの中の内容
for(UserTbl bean : list)

document.add(getPdfHeader(bean,list));


document.close();


public static PdfPTable getPdfHeader(UserTbl bean,ArrayList<UserTbl> list) throws DocumentException, IOException
PdfPTable table = new PdfPTable(7);
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font f8 = new Font(bfChinese, 8, Font.NORMAL);
// PCログインID
String userId = StringUtils.trim(bean.getUser_id());
// お名前
String userName = StringUtils.trim(bean.getUser_name());
// メールアドレス
String mobileMail = StringUtils.trim(bean.getMobile_mail());
// 携帯ログインID
String mobileId = StringUtils.trim(bean.getMobile_id());
// 所属
String MobilePass = StringUtils.trim(bean.getMobile_pass());
// 属性
String attr = StringUtils.trim(bean.getAttr());
// データ种别
String secName = StringUtils.trim(bean.getSec_name());
//写入table
PdfPCell cell = new PdfPCell();
cell.setPhrase(new Paragraph(userId, f8));
table.addCell(cell);
cell.setPhrase(new Paragraph(userName, f8));
table.addCell(cell);
cell.setPhrase(new Paragraph(mobileMail, f8));
table.addCell(cell);
cell.setPhrase(new Paragraph(mobileId, f8));
table.addCell(cell);
cell.setPhrase(new Paragraph(MobilePass, f8));
table.addCell(cell);
cell.setPhrase(new Paragraph(attr, f8));
table.addCell(cell);
cell.setPhrase(new Paragraph(secName, f8));
table.addCell(cell);
return table;


参考技术A 这个一般不行!

Java操作PDF,在PDF文件指定位置输出水印

需要参考我的上一篇博客,定位PDF中的关键字,找出需要打印水印的坐标位置。

先说测试结果(PDF原件也是上一篇中的图片所示):

新生成的带有水印的PDF文件如下所示:

 

 

 

 junit测试代码及输出:

 

 

 

maven配置文件

<!-- 引入pdf -->
    <dependency>
      <groupId>com.itextpdf</groupId>
      <artifactId>itextpdf</artifactId>
      <version>5.5.13</version>
    </dependency>

打印水印java文件PDFDocHelper.java

package com.alphajuns.util;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @Author AlphaJunS
 * @Date 19:25 2020/3/7
 * @Description 文档帮助类
 */
public class PDFDocHelper {
    private static BaseFont base = null;
    // 获取基础文字
    public static BaseFont getBaseFont() throws DocumentException, IOException {
        if (base == null) {
            try {
                base = BaseFont.createFont("/u01/config/simsun.ttc,1",  BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            } catch (Throwable th) {
                base = BaseFont.createFont("C:\\\\WINDOWS\\\\Fonts\\\\SIMSUN.TTC,1",  BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }
        }
        return base;
    }

    //psw文件签名
    public static String signPsw(String oldPswFilePath, List<Map<String, ?>> reviews) throws IOException, DocumentException {
        int pos = oldPswFilePath.lastIndexOf(\'.\');
        // 获取文件后缀
        String suffix = oldPswFilePath.substring(pos + 1);
        // 判断是否为pdf文件
        if (!"pdf".equals(suffix.toLowerCase())) {
            throw new RuntimeException("Not supported PSW file");
        }
        return signSinglePsw(oldPswFilePath, reviews);
    }

    //单个psw文件签名
    private static String signSinglePsw(String oldPswFilePath,List<Map<String, ?>> reviews) throws IOException, DocumentException {
        String newPswPath = oldPswFilePath;
        int pos = oldPswFilePath.lastIndexOf(\'.\');
        // 获取文件后缀名
        String suffix = oldPswFilePath.substring(pos + 1);
        // 生成新的文件路径
        newPswPath = oldPswFilePath.substring(0, pos) + ".PSW." + suffix;
        System.out.println("单个psw文件签名生成的新路径:" + newPswPath);

        PdfReader reader = new PdfReader(oldPswFilePath);
        FileOutputStream fout = new FileOutputStream(newPswPath);
        PdfStamper stp = new PdfStamper(reader, fout);

        // 总页数
        System.out.println("PDF总页数:" + reader.getNumberOfPages());

        for (int i = 0; i < reader.getNumberOfPages(); ) {
            // 需要从第一页开始,i放在循环中会报空指针异常
            i++;
            PdfContentByte content = stp.getOverContent(i);
            content.beginText();

            // 设置字体及字号
            content.setFontAndSize(getBaseFont(), 10);

            Map<String, Object> review = (Map<String, Object>) reviews.get(reviews.size() - 1);
            addDeptReview(content, review);
            content.endText();
        }

        stp.close();
        // 将输出流关闭
        fout.close();
        reader.close();
        // 文件读写结束
        System.out.println("PSW文件读写完毕");

        return newPswPath;
    }

    /**
     * @Author AlphaJunS
     * @Date 18:48 2020/3/7
     * @Description 添加水印
     * @param content
     * @param review
     * @return void
     */
    private static void addDeptReview(PdfContentByte content, Map<String, Object> review) {
        if (Integer.parseInt(String.valueOf(review.get("type"))) == 1) {
            content.setColorFill(BaseColor.BLUE);
        } else {
            content.setColorFill(BaseColor.RED);
        }
        // 设置水印位置和内容
        String result = (String) review.get("result");
        System.out.println("水印内容:" + result);
        System.out.println("打印位置坐标:" + pswX[0] + "," + pswY[0]);
        content.showTextAligned(Element.ALIGN_LEFT, result, pswX[0], pswY[0], 0);
    }

    // 打印水印坐标
    private static float[] pswY = {128};
    private static float[] pswX = {337};

}

 

以上是关于java操作pdf文件,能否找到某个关键词所在的页码? 谢谢!的主要内容,如果未能解决你的问题,请参考以下文章

java itextpdf找到重复的关键字

java如何取得linux某个文件夹所在的分区大小

[API 开发管理] 分享几个 eoLinker 实用操作技巧

记:解决itext5使用html模板生成PDF时,中文不显示的问题。

[pdf在线合并]pdf文件合并在线

Java操作PDF,在PDF文件指定位置输出水印