2011-08-31 66 views
1
我目前使用PDFBox的和a.pdf内读取

这是在文件夹1我想添加一行到使用Java

我首先列出所有的文件夹中找到的PDF文件下发现了一个PDF文档。 然后我检查每个文件的页数。 现在我想在页脚下面的文件的最后添加一个可以被打印机识别的图像,以便装订页面,因为它会意识到它已到达文件结尾。

我已经到达,直到获取文件列表和页数。

我用什么命令去到最后一页的末尾并写在那里。

我应该变换.pdf文件转换为文本或 我应该能够使用PDPageContentStream

这是我目前使用的我试图测试,看看是否AAA字符串将insterted到我的代码pdf文件的最后一页。该项目正在执行没有错误,但由于某种原因,它没有被插入到PDF中。

package pdfviewer; 

import java.io.*; 
import java.util.*; 
import java.util.List; 
import java.io.IOException; 

import org.apache.pdfbox.PDFReader; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.common.PDRectangle; 
import org.apache.pdfbox.pdmodel.font.PDFont; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 





public class Main { 

    /** 
    * @param args the command line arguments 
    */ 

     public static List flist() 
     { 
     List listfile = new ArrayList(); 
     String path = "C:/1"; 
     String files; 
     File folder = new File(path); 
     File[] listOfFiles = folder.listFiles(); 

     for (int i = 0; i < listOfFiles.length; i++) 
     { 
      if (listOfFiles[i].isFile()) 
      { 
       files = listOfFiles[i].getName(); 
       if (files.endsWith(".pdf") || files.endsWith(".PDF")) 
       { 
        listfile.add(listOfFiles[i]); 


       } 
      } 
     } 
     System.out.println(listfile); 
     return listfile; 

    } 

public static void CheckPages(List a) 
    { 
     String dir = null; 

     Object[] arraydir = a.toArray(new Object[0]); 

     for (int i=0; i< arraydir.length; i++) 
     { 
      int pages = 0; 
      PDFont font = PDType1Font.HELVETICA_BOLD; 
      float fontSize = 12.0f; 
      dir = arraydir[i].toString(); 
      System.out.println(dir); 

      try { 

        PDDocument pdoc = PDDocument.load(dir); 
        List allPages = pdoc.getDocumentCatalog().getAllPages(); 

        pages = pdoc.getNumberOfPages(); 
        System.out.println(allPages); 
        int f = pages; 
        System.out.println(pages); 

        PDPage page = (PDPage) allPages.get(i); 
        //System.out.println(page); 
        PDRectangle pageSize = page.findMediaBox(); 
        float stringWidth = font.getStringWidth("AAA"); 
        float centeredPosition = (pageSize.getWidth() - (stringWidth*fontSize)/1000f)/2f; 

        PDPageContentStream contentStream = new PDPageContentStream(pdoc,page,true,true); 
        //System.out.println(contentStream); 

        contentStream.beginText(); 
        contentStream.setFont(font, fontSize); 
        contentStream.moveTextPositionByAmount(centeredPosition, 30); 
        contentStream.drawString("AAA"); 
        contentStream.endText(); 
        contentStream.close(); 


        pdoc.close(); 

        } 
      catch (Exception e) 
        { 
         System.err.println("An exception occured in parsing the PDF Document."+ e.getMessage()); 
        } 
     } 

} 
    public static void main(String[] args) 
    { 
     List l = new ArrayList(); 
     l = pdfviewer.Main.flist(); 
     pdfviewer.Main.CheckPages(l); 


    } 

} 

感谢您的关注


我用上面的代码是正确的。 问题是,正在生成的PDF文件是版本1.2,这就是为什么我不被允许编辑pdf文档的原因。

有谁知道我应该怎么做,如果我使用1.2版本,因为我不能真正升级它。

+0

备份一下。打印机是否在每次打印作业结束时都装订好? – Wivani

+0

它不需要仅仅是为了启动其中的另一个过程而已。我需要在文件的末尾插入文本行。 – CRL88

回答

1

你可以看看库提供的例子。 有两个文件是您感兴趣的:

1- AddImageToPDF.java AddImageToPDF.java on google code search

2- AddMessageToEachPage.java AddMessageToEachPage.java on google code search

的第二个增加了一条消息,每一页,但你可以修改它只与最后一页一起工作。根据PDFBox用户指南文档,它们应该在以下文件夹下找到:src/main/java/org/apache/pdfbox/examples 如果您在查找文件时遇到问题,我在google代码搜索中添加了链接。

我还没有与图书馆合作过,或者尝试过这些例子,我相当肯定您需要稍微修改代码以适应您对添加的行/图像位置的需求。 在任何情况下,如果这对您有帮助并且您获得了可行的解决方案,则可以添加该解决方案,以便其他人可以从中受益。

编辑: 看到问题作者发布的代码后,我添加了一个修改,使其工作。 为了清晰起见,我允许我自己也做一些修改。

import java.io.File; 
import java.io.FileFilter; 
import java.util.List; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.common.PDRectangle; 
import org.apache.pdfbox.pdmodel.font.PDFont; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 

public class Main { 

    /** 
    * @param args the command line arguments 
    */ 
    public static final FileFilter pdfFileFilter = new FileFilter() { 

     public boolean accept(File file) { 
      return file.isFile() && file.getName().toLowerCase().endsWith(".pdf"); 
     } 
    }; 

    public static void closeQuietly(PDDocument doc) { 
     if (doc != null) { 
      try { 
       doc.close(); 
      } catch (Exception exception) { 
       //do something here if you wish like logging 
      } 
     } 
    } 

    public static void CheckPages(File[] sourcePdfFiles,String textToInsert, String prefix) { 

     for (File sourcePdfFile : sourcePdfFiles) { 
      PDFont font = PDType1Font.HELVETICA_BOLD; 
      float fontSize = 12.0f; 
      PDDocument pdoc = null; 
      try { 

       pdoc = PDDocument.load(sourcePdfFile); 
       List allPages = pdoc.getDocumentCatalog().getAllPages(); 
       PDPage lastPage = (PDPage) allPages.get(allPages.size() - 1); 
       PDRectangle pageSize = lastPage.findMediaBox(); 
       float stringWidth = font.getStringWidth(textToInsert); 
       float centeredPosition = (pageSize.getWidth() - (stringWidth * fontSize)/1000f)/2f; 

       PDPageContentStream contentStream = new PDPageContentStream(pdoc, lastPage, true, true); 

       contentStream.beginText(); 
       contentStream.setFont(font, fontSize); 
       contentStream.moveTextPositionByAmount(centeredPosition, 30); 
       contentStream.drawString(textToInsert); 
       contentStream.endText(); 
       contentStream.close(); 

       File resultFile = new File(sourcePdfFile.getParentFile(), prefix + sourcePdfFile.getName()); 
       pdoc.save(resultFile.getAbsolutePath()); 


      } catch (Exception e) { 
       System.err.println("An exception occured in parsing the PDF Document." + e.getMessage()); 
      } finally { 
       closeQuietly(pdoc); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     File pdfFilesFolder = new File("C:\\1"); 
     File[] pdfFiles = pdfFilesFolder.listFiles(pdfFileFilter); 
     //when a file is processed, the result will be saved in a new file having the location of the source file 
     //and the same name of source file prefixed with this 
     String modifiedFilePrefix = "modified-"; 
     CheckPages(pdfFiles,"AAA", modifiedFilePrefix); 
    } 
} 
+0

嗨,我已经将代码添加到我的原始邮件,但仍然有一个问题,它目前正在编译没有错误,但它没有添加到我的PDF文件的AAA有一个问题与插入的消息。 – CRL88

+0

我也添加了contentStream.sava(dir)来覆盖现有的文件 – CRL88

+0

您错过了不是来自contentStream而是来自doc的保存。在使用pdoc.close()关闭文档之前,尝试使用pdoc.save(outfile)保存该文档。 –