pdfbox开发包下载地址:http://pdfbox.apache.org/
程序实现了PDF文档的创建,读入,与修改PDF内容并保存。
可能有个前提,PDF文档不是加密的,如果加密怎么办,我没研究过!
源代码如下:
package com.gloomyfish.ups.pdf.reader; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.List; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSString; import org.apache.pdfbox.exceptions.COSVisitorException; import org.apache.pdfbox.pdfparser.PDFStreamParser; import org.apache.pdfbox.pdfwriter.ContentStreamWriter; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDStream; import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType1Font; import org.apache.pdfbox.util.PDFOperator; import org.apache.pdfbox.util.PDFTextStripper; /** * http://pdfbox.apache.org/ * * @author fish * */ public class PDFReader { public PDFReader() { createHelloPDF(); readPDF(); editPDF(); } public void createHelloPDF() { PDDocument doc = null; PDPage page = null; try { doc = new PDDocument(); page = new PDPage(); doc.addPage(page); PDFont font = PDType1Font.HELVETICA_BOLD; PDPageContentStream content = new PDPageContentStream(doc, page); content.beginText(); content.setFont(font, 12); content.moveTextPositionByAmount(100, 700); content.drawString("Hello"); content.endText(); content.close(); doc.save("D:\\gloomyfish\\pdfwithText.pdf"); doc.close(); } catch (Exception e) { System.out.println(e); } } public void readPDF() { PDDocument helloDocument; try { helloDocument = PDDocument.load(new File( "D:\\gloomyfish\\pdfwithText.pdf")); PDFTextStripper textStripper = new PDFTextStripper(); System.out.println(textStripper.getText(helloDocument)); helloDocument.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void editPDF() { try { // pdfwithText PDDocument helloDocument = PDDocument.load(new File("D:\\gloomyfish\\pdfwithText.pdf")); // PDDocument helloDocument = PDDocument.load(new File("D:\\gloomyfish\\hello.pdf")); // int pageCount = helloDocument.getNumberOfPages(); PDPage firstPage = (PDPage)helloDocument.getDocumentCatalog().getAllPages().get(0); // PDPageContentStream content = new PDPageContentStream(helloDocument, firstPage); PDStream contents = firstPage.getContents(); PDFStreamParser parser = new PDFStreamParser(contents.getStream()); parser.parse(); List tokens = parser.getTokens(); for (int j = 0; j < tokens.size(); j++) { Object next = tokens.get(j); if (next instanceof PDFOperator) { PDFOperator op = (PDFOperator) next; // Tj and TJ are the two operators that display strings in a PDF if (op.getOperation().equals("Tj")) { // Tj takes one operator and that is the string // to display so lets update that operator COSString previous = (COSString) tokens.get(j - 1); String string = previous.getString(); string = string.replaceFirst("Hello", "Hello World, fish"); //Word you want to change. Currently this code changes word "Solr" to "Solr123" previous.reset(); previous.append(string.getBytes("ISO-8859-1")); } else if (op.getOperation().equals("TJ")) { COSArray previous = (COSArray) tokens.get(j - 1); for (int k = 0; k < previous.size(); k++) { Object arrElement = previous.getObject(k); if (arrElement instanceof COSString) { COSString cosString = (COSString) arrElement; String string = cosString.getString(); string = string.replaceFirst("Hello", "Hello World, fish"); // Currently this code changes word "Solr" to "Solr123" cosString.reset(); cosString.append(string.getBytes("ISO-8859-1")); } } } } } // now that the tokens are updated we will replace the page content stream. PDStream updatedStream = new PDStream(helloDocument); OutputStream out = updatedStream.createOutputStream(); ContentStreamWriter tokenWriter = new ContentStreamWriter(out); tokenWriter.writeTokens(tokens); firstPage.setContents(updatedStream); helloDocument.save("D:\\gloomyfish\\helloworld.pdf"); //Output file name helloDocument.close(); // PDFTextStripper textStripper = new PDFTextStripper(); // System.out.println(textStripper.getText(helloDocument)); // helloDocument.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (COSVisitorException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { new PDFReader(); } }