java操作pdf>>pdfBox使用体験
36536 ワード
pdfBoxは中国語に対してとても友好的ではありません.もし皆さんがpdfに文字を挿入する操作をしたいなら、itextを使うことを勧めます.もし操作したpdfに中国語がないなら、或いはpdfファイルに画像を挿入し、ページを削除するだけで、引き続き見てください.
前言:
先日、会社で手配した仕事を完成しました.暇な時間を利用して、javaの操作pdfの機能を使い始めました.ネットでpdfBoxを見つけました.pdfBoxはapphが提供した無料で、オープンソースのpdf操作ツールです.使いやすいです.githubもダウンロードできます.私もアップロードしました.
1まず、jarを導入します
これは全部のpdfboxを含んでいます.これを導入すればいいです.(ツール類を探している時に、他の博がpdfboxの多くの種類を主導しているのを見ました.そして、頭の中にも入ってきました.結局、jarパッケージが衝突しました.一つだけ導入しました.それは公式が統合されているものです.十分です.)
2.1この類の名前は自由です.私はpdfUtilを取ったのです.
2.2もちろん、もしあなたが操作をデータベースに記録したいなら、pdfの実体類という実体類を作成してもいいです.皆さんの自由に作成しないでください.私は私の実体類の属性を貼ります.参考にしてください.
PS:私はpdf DomainVO本体類に役に立つと思います.上に貼った属性を参考にしてください.
みんなはpdfbox-1.8.90.zipフォルダの中でexamplesフォルダを見つけることができます.
いろいろな事例があります.例えば:
1 pdfファイルを作成します.
2 pdfの全ての文字情報を読み出す(Stringで受信可能)
3 pdfの文字を置換します.(中国語はまだ解決していません.すみません.)
4 pdfに画像を挿入する
などの操作が……
PS:コードを貼ります.
—1複数の空白ページを作成します.
PS:残念なことに、私はちゃんと処理していません.文字を置き換える時や文字を挿入する時、中国語の文字化け問題があります.処理が上手な学生はブロガーと話してください.みんなで進歩します.
これには一文がありますhttp://blog.csdn.net/undergrowth/article/details/39136673pdfboxのそれぞれの方法に対して、属性の解析の比較的に良い文で、みんなは下を見に行くことができます.
前言:
先日、会社で手配した仕事を完成しました.暇な時間を利用して、javaの操作pdfの機能を使い始めました.ネットでpdfBoxを見つけました.pdfBoxはapphが提供した無料で、オープンソースのpdf操作ツールです.使いやすいです.githubもダウンロードできます.私もアップロードしました.
1まず、jarを導入します
これは全部のpdfboxを含んでいます.これを導入すればいいです.(ツール類を探している時に、他の博がpdfboxの多くの種類を主導しているのを見ました.そして、頭の中にも入ってきました.結局、jarパッケージが衝突しました.一つだけ導入しました.それは公式が統合されているものです.十分です.)
<dependency>
<groupId>org.apache.pdfboxgroupId>
<artifactId>pdfbox-appartifactId>
<version>1.8.10version>
dependency>
2.あなたのプロジェクトでツールクラスを作成します.2.1この類の名前は自由です.私はpdfUtilを取ったのです.
2.2もちろん、もしあなたが操作をデータベースに記録したいなら、pdfの実体類という実体類を作成してもいいです.皆さんの自由に作成しないでください.私は私の実体類の属性を貼ります.参考にしてください.
// :pdfDomainVO
private Integer id;//id
private Date time;//
private String filename;//
private String filesize;//
private String filetype;//
private String details;//
private String content;//pdf
private String outputfile;// ( )
private String inputfile;// pdf
private String strtofind;//
private String message;//
private String imagefile;//
private String imagelist;//
private Integer pageno;//
private Integer pages;//
private Integer rid;//...
private Integer pageoperation;//
private Integer pagestart;//
private Integer pageend;//
private String position;// :X,Y
private String fileSizeAfter;//
private Integer status;//
private Integer afterPages;//
private Integer imgSize;//
3.コードをpdfUtilで書くPS:私はpdf DomainVO本体類に役に立つと思います.上に貼った属性を参考にしてください.
みんなはpdfbox-1.8.90.zipフォルダの中でexamplesフォルダを見つけることができます.
いろいろな事例があります.例えば:
1 pdfファイルを作成します.
2 pdfの全ての文字情報を読み出す(Stringで受信可能)
3 pdfの文字を置換します.(中国語はまだ解決していません.すみません.)
4 pdfに画像を挿入する
などの操作が……
PS:コードを貼ります.
—1複数の空白ページを作成します.
/***
* 1
* @param file
* @throws IOException
* @throws COSVisitorException
*/
public static void createBlank( String outputFile ) throws IOException, COSVisitorException
{
// pdf
PDDocument document = null;
try
{
document = new PDDocument();
// pdf
PDPage blankPage = new PDPage();
PDPage blankPage1 = new PDPage();
PDPage blankPage2 = new PDPage();
//
document.addPage( blankPage );
document.addPage( blankPage1 );
document.addPage( blankPage2 );
// , "H:\\text.pdf"
document.save( outputFile );
System.out.println("over");
}
finally
{
if( document != null )
{
document.close();
}
}
}
—2 pdfの文字情報を読み出す(全部) /**
* pdf ( )
*/
public static void READPDF(String inputFile){
//
PDDocument doc =null;
String content="";
try {
// pdf
doc =PDDocument.load(new File(inputFile));
// PDFTextStripper
PDFTextStripper textStripper =new PDFTextStripper("GBK");
content=textStripper.getText(doc);
vo.setContent(content);
System.out.println(" :"+content);
System.out.println(" "+doc.getNumberOfPages());
//
doc.close();
} catch (Exception e) {
// TODO: handle exception
}
}
—3 pdfでテキスト情報を読み出す(指定ページ) /**
* pdf ( )
*/
public static pdfDomainVO readPageNO(pdfDomainVO vo){
String content="";
try{
PDDocument document = PDDocument.load(vo.getInputfile());
//
int pages = document.getNumberOfPages();
//
PDFTextStripper stripper=new PDFTextStripper();
//
stripper.setSortByPosition(true);
stripper.setStartPage(vo.getPageno());
stripper.setEndPage(vo.getPageno());
//
content = stripper.getText(document);
vo.setContent(content);
System.out.println("function : readPageNO over");
} catch (Exception e) {
e.printStackTrace();
}
return vo;
}
—4指定されたpdfファイルの文字の内容を置き換える(これは複雑です.アプリを見て長い間見ました.そして一つずつのコメントを添付しました.)/**
* pdf
* @param args
*/
public static pdfDomainVO replaceContent(pdfDomainVO vo)
throws IOException,COSVisitorException{
//
PDDocument doc =null;
try {
//
doc =PDDocument.load(vo.getInputfile());
//
List pages= doc.getDocumentCatalog().getAllPages();
// i
PDPage page = (PDPage)pages.get( vo.getPageno() );
// page
PDStream contents = page.getContents();
//PDF ( PDF , )
PDFStreamParser parser =new PDFStreamParser(contents.getStream());
//
parser.parse();
// list
List tokens =parser.getTokens();
for (int j = 0; j < tokens.size(); j++) {
// object
Object next = tokens.get( j );
//instanceof
if(next instanceof PDFOperator ) {
//pdf
PDFOperator op =(PDFOperator)next;
//TJ TJ 。
//PDF
if(op.getOperation().equals("Tj")){
//COSString >> java 。
COSString previous = (COSString)tokens.get( j-1 );
// PDF 。
String string=previous.getString();
//replaceFirst>>
string = string.replaceFirst( vo.getStrtofind(), vo.getMessage() );
System.out.println(string);
System.out.println(string.getBytes("GBK"));
// COSString
previous.reset();
//
previous.append(string.getBytes("GBK") );
}else if(op.getOperation().equals("TJ")){
//COSArray pdfbase , PDF
COSArray previous =(COSArray)tokens.get( j-1 );
// previous
for (int k = 0; k < previous.size(); k++) {
// ,
// cosnull, null
Object arrElement = previous.getObject( k );
if( arrElement instanceof COSString ){
//COSString >> java 。
COSString cosString =(COSString)arrElement;
// PDF 。
String string =cosString.getString();
//
string = string.replaceFirst( vo.getStrtofind(), vo.getMessage());
// COSString
cosString.reset();
//
cosString.append(string.getBytes("GBK") );
}
}
}
}
}
// PDStream
PDStream updatedStream = new PDStream(doc);
// updatedStream
OutputStream out =updatedStream.createOutputStream();
// 。
ContentStreamWriter tokenWriter =new ContentStreamWriter(out);
// ,
tokenWriter.writeTokens(tokens);
//
page.setContents( updatedStream );
//
doc.save(vo.getOutputfile());
//
vo.setAfterPages(doc.getNumberOfPages());
} catch (Exception e) {
e.printStackTrace();
}finally{
if( doc != null ){
//
doc.close();
}
}
return vo;
}
—5 pdfに画像を挿入する(指定ページ数で挿入)/**
* pdf
* @param inputFile
* @param image
* @param outputFile
* @throws IOException
* @throws COSVisitorException
*/
public static pdfDomainVO insertImage( pdfDomainVO vo )
throws IOException, COSVisitorException{
//
String[] position =vo.getPosition().split(",");
int x =Integer.valueOf(position[0]);
int y =Integer.valueOf(position[position.length-1]);
//
PDDocument doc =null;
try {
//
doc = PDDocument.load(vo.getInputfile());
// pdf
PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get( vo.getPageno() );
//pdfbox
PDXObjectImage ximage = null;
// .jpg
if( vo.getImagefile().toLowerCase().endsWith( ".jpg" ) ){
//
ximage = new PDJpeg(doc, new FileInputStream( vo.getImagefile() ) );
}// tif tiff
else if (vo.getImagefile().toLowerCase().endsWith(".tif") || vo.getImagefile().toLowerCase().endsWith(".tiff")){
ximage = new PDCcitt(doc, new RandomAccessFile(new File(vo.getImagefile()),"r"));
}else{
//Image BufferedImage
BufferedImage awtImage = ImageIO.read( new File( vo.getImagefile() ) );
ximage = new PDPixelMap(doc, awtImage);
}
// : 、
PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true);
//
float scale = vo.getImgSize();
scale = scale/10;//( 0.1~1,0.5 )
//ximage.setHeight(ximage.getHeight()/5);
//ximage.setWidth(ximage.getWidth()/5);
System.out.println(ximage.getHeight());
System.out.println(ximage.getWidth());
//
contentStream.drawXObject(ximage, x, y, ximage.getWidth()*scale, ximage.getHeight()*scale);
//
contentStream.close();
//
doc.save( vo.getOutputfile() );
//
vo.setAfterPages(doc.getNumberOfPages());
} catch (Exception e) {
e.printStackTrace();
}finally{
if( doc != null ){
//
doc.close();
}
}
return vo;
}
—6ページ数を指定するPDFファイルを画像に変換する/***
* PDF :
* @param inputFile
* @param outputFile
*/
public static pdfDomainVO toImage( pdfDomainVO vo ) {
try {
//
PDDocument doc = PDDocument.load(vo.getInputfile());
//
//int pageCount = doc.getPageCount();
////
// pdf
List pages = doc.getDocumentCatalog().getAllPages();
if(vo.getPageno()!=null){
String count=(int)(Math.random()*1000)+"-"+(int)(Math.random()*1000);
//
PDPage page = (PDPage) pages.get(vo.getPageno());
//
BufferedImage image = page.convertToImage();
//
Iterator iter = ImageIO.getImageWritersBySuffix("jpg");
//
ImageWriter writer = (ImageWriter) iter.next();
//
File outFile = new File(vo.getOutputfile()+vo.getFilename()+"-"+(vo.getPageno()+1)+".jpg");
//
FileOutputStream out = new FileOutputStream(outFile);
//ImageIO ImageOutputStream
ImageOutputStream outImage = ImageIO.createImageOutputStream(out);
writer.setOutput(outImage);
writer.write(new IIOImage(image, null, null));
}else{
//
for (int i = 0; i < pages.size(); i++) {
//
PDPage page = (PDPage) pages.get(i);
//
BufferedImage image = page.convertToImage();
//
Iterator iter = ImageIO.getImageWritersBySuffix("jpg");
//
ImageWriter writer = (ImageWriter) iter.next();
//
File outFile = new File(vo.getOutputfile()+i+".jpg");
//
FileOutputStream out = new FileOutputStream(outFile);
//ImageIO ImageOutputStream
ImageOutputStream outImage = ImageIO.createImageOutputStream(out);
writer.setOutput(outImage);
writer.write(new IIOImage(image, null, null));
}
}
//
doc.close();
//
vo.setAfterPages(doc.getNumberOfPages());
System.out.println("over");
} catch (Exception e) {
e.printStackTrace();
}
return vo;
}
——–7指定ページにテキストを挿入します./***
*
* @param inputFile
* @param message
* @param outputFile
* @throws IOException
* @throws COSVisitorException
*/
public static pdfDomainVO InsertPageContent (pdfDomainVO vo ) throws IOException, COSVisitorException
{
// the document
PDDocument doc = null;
try
{
doc = PDDocument.load( vo.getInputfile() );
List allPages = doc.getDocumentCatalog().getAllPages();
PDFont font = PDType1Font.HELVETICA_BOLD;
//
float fontSize = 36.0f;
PDPage page = (PDPage)allPages.get( vo.getPageno() );
PDRectangle pageSize = page.findMediaBox();
float stringWidth = font.getStringWidth( vo.getMessage() )*fontSize/1000f;
// calculate to center of the page
int rotation = page.findRotation();
boolean rotate = rotation == 90 || rotation == 270;
float pageWidth = rotate ? pageSize.getHeight() : pageSize.getWidth();
float pageHeight = rotate ? pageSize.getWidth() : pageSize.getHeight();
double centeredXPosition = rotate ? pageHeight/2f : (pageWidth - stringWidth)/2f;
double centeredYPosition = rotate ? (pageWidth - stringWidth)/2f : pageHeight/2f;
// append the content to the existing stream
PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true,true);
contentStream.beginText();
// set font and font size
contentStream.setFont( font, fontSize );
// set text color to red
contentStream.setNonStrokingColor(255, 0, 0);
if (rotate)
{
// rotate the text according to the page rotation
contentStream.setTextRotation(Math.PI/2, centeredXPosition, centeredYPosition);
}
else
{
contentStream.setTextTranslation(centeredXPosition, centeredYPosition);
}
contentStream.drawString( vo.getMessage() );
contentStream.endText();
contentStream.close();
vo.setAfterPages(doc.getNumberOfPages());
doc.save( vo.getOutputfile() );
System.out.println("over");
}
finally
{
if( doc != null )
{
doc.close();
}
}
return vo;
}
—8画像を抽出して保存します./**
*
* @param pdfDomainVO
* @throws IOException
*
*/
public static pdfDomainVO extractImage(pdfDomainVO vo ) throws IOException{
//
PDDocument doc=null;
try{
// pdf , PDDocument
doc=PDDocument.load(vo.getInputfile());
/** **/
// PDDocumentCatalog
PDDocumentCatalog catalog = doc.getDocumentCatalog();
// PDPage
List pages = catalog.getAllPages();
int pageNum=pages.size(); //
PDPage page = null;
if(vo.getPageno()!=null){
page = ( PDPage ) pages.get( vo.getPageno() );
if( null != page ){
PDResources resource = page.findResources();
//
Map imgs = resource.getImages();
for(Map.Entry me: imgs.entrySet()){
//System.out.println(me.getKey());
PDXObjectImage img = me.getValue();
// ,
img.write2file( vo.getOutputfile() + vo.getFilename()+"-"+(vo.getPageno()+1) );
}
}
}else{
//
for( int i = 0; i < pageNum; i++ ){
// i
page = ( PDPage ) pages.get( i );
if( null != page ){
PDResources resource = page.findResources();
//
Map imgs = resource.getImages();
for(Map.Entry me: imgs.entrySet()){
String count=(int)(Math.random()*1000)+"-"+(int)(Math.random()*1000);
//System.out.println(me.getKey());
PDXObjectImage img = me.getValue();
// ,
img.write2file( vo.getOutputfile() + count );
}
}
}
}
//
vo.setAfterPages(doc.getNumberOfPages());
System.out.println("extractImage:over");
} finally
{
if( doc != null )
{
doc.close();
}
}
return vo;
}
—9 PDFドキュメントからページを削除する(最後のページは削除できません!) /***
* PDF
* PDF , !
* @param inputFile
* @param outputFile
* @throws Exception
*/
public static pdfDomainVO removePage(pdfDomainVO vo) throws Exception
{
vo.setStatus(Details.FailStatus);
PDDocument document = null;
try
{
document = PDDocument.load(vo.getInputfile() );
if( document.isEncrypted() )
{
throw new IOException( "Encrypted documents are not supported for this example" );
}
if( document.getNumberOfPages() <= 1 )
{
throw new IOException( "Error: A PDF document must have at least one page, " +
"cannot remove the last page!");
}
document.removePage( vo.getPageno() );
document.save(vo.getOutputfile() );
//
vo.setAfterPages(document.getNumberOfPages());
//
vo.setStatus(Details.SuccessStatus);
System.out.println("over");
}
finally
{
if( document != null )
{
document.close();
}
}
return vo;
}
pdfboxは強大で、主にオープンソースです.(TMDは中国語に対応していません.)以上は一部の機能だけです.また拡大したいなら、公式の事例とアプリを参考にしてください.PS:残念なことに、私はちゃんと処理していません.文字を置き換える時や文字を挿入する時、中国語の文字化け問題があります.処理が上手な学生はブロガーと話してください.みんなで進歩します.
これには一文がありますhttp://blog.csdn.net/undergrowth/article/details/39136673pdfboxのそれぞれの方法に対して、属性の解析の比較的に良い文で、みんなは下を見に行くことができます.