Как вставить текст в отсканированный документ PDF, используя Java - PullRequest
0 голосов
/ 10 февраля 2012

Мне нужно добавить текст в документы PDF, где есть много отсканированных документов PDF, чтобы вставленный текст вставлялся обратно в отсканированное изображение, а не поверх изображения. Как добавить текст поверх отсканированного изображения внутри PDF.

package editExistingPDF;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

import org.apache.commons.io.FilenameUtils;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;

public class AddPragraphToPdf {



    public static void main(String[] args) throws IOException, DocumentException, BiffException {

        String tan = "no tan";
        File inputWorkbook = new File("lars.xls");
        Workbook w;

            w = Workbook.getWorkbook(inputWorkbook);
            // Get the first sheet
            Sheet sheet = w.getSheet(0);

            Cell[] tnas =sheet.getColumn(0);


        File ArticleFolder = new File("C:\\Documents and Settings\\sathishkumarkk\\My Documents\\article");
        File[] listOfArticles = ArticleFolder.listFiles();

        for (int ArticleInList = 0; ArticleInList < listOfArticles.length; ArticleInList++)  
        { 
            Document document = new Document(PageSize.A4);

      //  System.out.println(listOfArticles[ArticleInList].toString());
        PdfReader pdfArticle = new PdfReader(listOfArticles[ArticleInList].toString());
        if(listOfArticles[ArticleInList].getName().contains(".si."))
        {continue;}
        int noPgs=pdfArticle.getNumberOfPages();
        String ArticleNoWithOutExt = FilenameUtils.removeExtension(listOfArticles[ArticleInList].getName());
        String TanNo=ArticleNoWithOutExt.substring(0,ArticleNoWithOutExt.indexOf('.'));

     // Create output PDF
        PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("C:\\Documents and Settings\\sathishkumarkk\\My Documents\\toPrint\\"+ArticleNoWithOutExt+".pdf"));
        document.open();
        PdfContentByte cb = writer.getDirectContent();
        //get tan form excel sheet
        System.out.println(TanNo);
        for(Cell content : tnas){
            if(content.getContents().contains(TanNo)){
                tan=content.getContents();
                System.out.println(tan);
            }else{
                continue;
            }
        }
        // Load existing PDF
        //PdfReader reader = new PdfReader(new FileInputStream("1.pdf"));

          for (int i = 1; i <= noPgs; i++) {
        PdfImportedPage page = writer.getImportedPage(pdfArticle, i); 

        // Copy first page of existing PDF into output PDF
        document.newPage();
        cb.addTemplate(page, 0, 0);
        // Add your TAN here
        Paragraph p= new Paragraph(tan);
        Font font = new Font();
        font.setSize(1.0f);
        p.setLeading(12.0f, 1.0f);
        p.setFont(font);

        document.add(p); 
          }
        document.close();
        }
    }

}

ПРИМЕЧАНИЕ. Проблема заключается в том, что при создании файла PDF только с текстом у меня нет проблем, кроме случаев, когда файл PDF заполнен отсканированным документом и когда я пытаюсь добавить текст; он добавляется в конец отсканированного документа. поэтому, пока я печатаю эти PDF, я не получу добавленный текст.

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

С этого примера iText (что противоположно тому, что вы хотите, но переключитесь getUnderContent с getOverContent, и все будет в порядке):

BlockquoteКаждая страница PDF имеет два дополнительных слоя;тот, который находится сверху всего текста / графики, и тот, который идет внизу.Весь добавленный пользователем контент попадает между этими двумя.Если мы попадем в этот самый нижний контент, мы можем написать все, что захотим.Чтобы попасть в этот самый нижний слой, мы можем использовать метод getUnderContent объекта PdfStamper.
Это задокументировано в Справочнике по iText API, как показано ниже:

public PdfContentByte getUnderContent(int pageNum)
    Gets a PdfContentByte to write under the page of the original document.
    Parameters:
       pageNum - the page number where the extra content is written
    Returns:
         a PdfContentByte to write under the page of the original document
0 голосов
/ 10 февраля 2012

Для этого вам необходимо сначала прочитать документ PDF, извлечь элементы, а затем добавить текст в документ и сохранить его как документ PDF.Это, конечно, предполагает, что вы в первую очередь можете прочитать документ PDF.

Я бы порекомендовал iText (см. Пример кода iText ), чтобы помочь вам сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...