2016-03-24 14 views
0

私はpdfの書式設定に問題があります。私はすでにpdfファイルにテキストを追加していますが、問題があります - 私はpdfがどのように見えるかわかりません。つまり、1つのテンプレートに複数のテンプレートがあり、1つのpdfには良い場所に追加されますが、別のテキストには重要な情報が含まれています。JavaでのPDFの書式設定

/** 
* metoda dodaje podpis do pdf 
* @param fileDokument 
* @throws DocumentException 
* @throws IOException 
* @throws SQLException 
*/ 
private void addSignatureToPdf(FileDokument fileDokument) throws DocumentException, IOException, SQLException { 
    java.util.Date dateToFind = Calendar.getInstance().getTime(); 
    DecimalFormat df = new DecimalFormat("00"); 
    DateTime dt = new DateTime(); 
    int year = dt.getYear(); 
    int month = dt.getMonthOfYear(); 
    int day = dt.getDayOfMonth(); 

    File f = new File(fileDokument.getFileNazwa()); 

    String operator = produkt.getOperatorProwadzacyForRolaAndDate(dateToFind, 5).toString(); 
    operator = operator.replaceAll("\\(.*\\)", "").trim(); 

    PdfReader reader = new PdfReader(""+fileDokument.getFileNazwaFile()); 
    int height = (int) reader.getPageSize(1).getHeight(); 
    int width = (int) reader.getPageSize(1).getWidth(); 
    int fontSize = getFontSizeAdjustingToScreenSize(height); 
    int marginCompatibility = getMarginCompatibilityAdjustingToScreenSize(width); 
    int heightBelow = getHeightBelowAdjustingToScreenSize(width); 

    File outFile = File.createTempFile("pismo_", ".pdf", MainApp.tmpDir); 

    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outFile)); 
    BaseFont bf = BaseFont.createFont(BaseFont.TIMES_ITALIC, codingType, false); 
    PdfContentByte over; 

    int total = reader.getNumberOfPages() + 1; 
    for (int a = 1; a < total; a++) { 
     stamper.setRotateContents(false); 
     over = stamper.getOverContent(a); 
     over.beginText(); 
     over.setFontAndSize(bf,fontSize); 
     over.setTextMatrix(marginCompatibility, heightBelow); 
     over.showText("Za zgodność z oryginałem Radca Prawny " + operator + ", Wrocław, dnia " + df.format(day) + "-" + df.format(month) + "-" + year + "r. .................. (podpis)"); 
     over.endText(); 
    } 
    stamper.close(); 
    MainApp.openFile(outFile); 

} 

私の考えでは、それが少し小さくし、常に空になり、任意のテキストをカバーしませんTextFieldを追加してPDFを拡張することです。助けたり、他のアイデアを教えてもらえますか?

+1

ページ上の空き領域を見つけるために、スケーリングせず試してみたい場合は、[この回答](HTTP、それを呼び出す方法は次のとおりです。// stackoverflow.com/a/26503289/1729265)あなたに興味があるかもしれません。 – mkl

+0

私はページの下部にテキストを追加することに興味があります。私はこのコードを修正して、テキストの下の空のフィールドを見つけようとしましたが、私の最初のアイデアよりも複雑に思えます。とにかくありがとう! – Michu93

+1

その場合、[この回答](http://stackoverflow.com/a/34419296/1729265)をご覧ください。それはiTextSharpとC#用ですが、翻訳が容易でなければなりません。翻訳の助けが必要な場合は、そう言いなさい。 – mkl

答えて

2

@mklと@Bruno Lowagieに本当に感謝します!

最終的な答え:

/** 
* method to shrink pdf file 
* @param writer 
* @param stamper 
* @param reader 
* @param page 
* @param factor 
* @throws IOException 
*/ 
private void shrink(com.itextpdf.text.pdf.PdfStamper stamper, int page, float factor) throws IOException 
{ 
    com.itextpdf.text.Rectangle crop = stamper.getReader().getCropBox(page); 
    float diffX = crop.getRight() * (1 - factor); 
    float diffY = crop.getTop() * (1 - factor); 
    com.itextpdf.text.pdf.PdfDictionary pageN = stamper.getReader().getPageN(page); 
    stamper.markUsed(pageN); 
    com.itextpdf.text.pdf.PdfArray ar = null; 
    com.itextpdf.text.pdf.PdfObject content = com.itextpdf.text.pdf.PdfReader.getPdfObject(pageN.get(com.itextpdf.text.pdf.PdfName.CONTENTS), pageN); 
    if(content == null) 
     return; 
    if(content.isArray()) 
    { 
     ar = new com.itextpdf.text.pdf.PdfArray((com.itextpdf.text.pdf.PdfArray)content); 
     pageN.put(com.itextpdf.text.pdf.PdfName.CONTENTS, ar); 
    } 
    else if(content.isStream()) 
    { 
     ar = new com.itextpdf.text.pdf.PdfArray(); 
     ar.add(pageN.get(com.itextpdf.text.pdf.PdfName.CONTENTS)); 
     pageN.put(com.itextpdf.text.pdf.PdfName.CONTENTS, ar); 
    } 
    else 
     return; 
    com.itextpdf.text.pdf.ByteBuffer out_p = new com.itextpdf.text.pdf.ByteBuffer(); 
    out_p.append(factor).append(" 0 0 ").append(factor).append(' ').append(diffX).append(" ").append(diffY).append(" cm "); 
    com.itextpdf.text.pdf.PdfStream stream = new com.itextpdf.text.pdf.PdfStream(out_p.toByteArray()); 
    ar.addFirst(stamper.getWriter().addToBody(stream).getIndirectReference()); 
    out_p.reset(); 
} 

/* 
* method adding box with "Za zgodnosc..." on the bottom of the page 
*/ 
private void addBoxToPage(com.itextpdf.text.pdf.PdfReader reader, int page, float factor, com.itextpdf.text.pdf.PdfStamper stamper, String operator) throws com.itextpdf.text.DocumentException { 
    DecimalFormat df = new DecimalFormat("00"); 
    DateTime dt = new DateTime(); 
    int year = dt.getYear(); 
    int month = dt.getMonthOfYear(); 
    int day = dt.getDayOfMonth(); 
    com.itextpdf.text.Rectangle box = reader.getCropBox(page); 
    box.setTop(box.getTop() - factor * box.getHeight()); 
    com.itextpdf.text.pdf.PdfContentByte cb = stamper.getOverContent(page); 
    cb.setColorFill(BaseColor.YELLOW); 
    cb.setColorStroke(BaseColor.RED); 
    cb.rectangle(box.getLeft(), box.getBottom(), box.getWidth(), box.getHeight()); 
    cb.fillStroke(); 
    cb.setColorFill(BaseColor.BLACK); 
    ColumnText ct = new ColumnText(cb); 
    ct.addElement(new Paragraph("Za zgodność z oryginałem Radca Prawny " + operator + ", Wrocław, dnia " + df.format(day) + "-" + df.format(month) + "-" + year + "r. .................. (podpis)")); 
    ct.setSimpleColumn(box); 
    ct.go(); 
} 

と、それは私が

int total = reader.getNumberOfPages() + 1; 
    for (int a = 1; a < total; a++) { 
     shrink(stamper, a, factor); 
     addBoxToPage(reader, a, factor, stamper, operator); 
    } 
+1

実際には、[ソースの回答](http://stackoverflow.com/a/34419296/1729265)のC#/ iTextSharpメソッドのように、追加のパラメータ 'PdfWriter writer'を用意する必要はありません。 'stamper.getWriter()'を使って 'stamper'から' writer'を呼び出します。 – mkl

+0

リーダーと同じですか?私はstamper.getReader()を使用することができます追加のパラメータリーダーの代わりに意味ですか? – Michu93

+1

少なくとも2つの間違いを修正しました:あなたは 'CONTENTS'の代わりに' CONTENT'を使い、 'diffX'と' diffY'の間にスペース文字を追加するのを忘れました。 'cm'演算子は6つのオペランドを必要とし、' diffX'と 'diffY'の間のスペースを忘れた場合、5つのオペランドしか持たない。これは無効なPDF構文です。また、「作物」がゼロの場合、あなたは何をするつもりですか?ページに注釈が含まれている場合はどうしますか?あなたはそれについて考えましたか? –