2017-08-22 23 views
0

私はpdfファイルを作成しています。既存のpdfファイルにウォーターマークを追加する必要があります。だから、私は次のコードを書いた。 FileOutputStreamを使用すると完全に動作しますが、データがデータベースから来てバイト配列として保存する必要があるため、ByteArrayOutputStreamを使用する必要があります。問題はここから始まります。 ByteArrayOutputStreamを使用すると、PdfStamperのgetOvercontentメソッドはnullを返します。これをどうすれば処理できますか?前もって感謝します。 Itext PdfStamper getOverContentは、ByteArrayOutputStreamを使用するとnullを返します。

byte[] bytes = getAsByteArray(); 
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length); 
PdfReader reader = new PdfReader(bytes); 
int numberOfPages= reader.getNumberOfPages(); 
outputStream.write(bytes, 0, bytes.length); 
PdfStamper stamper = new PdfStamper(reader, outputStream); 
Font font = font(Font.NORMAL, 135, Color.RED); 
for (int i = 0; i < numberOfPages; i++) { 
    //over Content is null 
    PdfContentByte over = stamper.getOverContent(i); 
    Phrase p = new Phrase("WATERMARK", font); 
    PdfGState gs = new PdfGState(); 
    gs.setFillOpacity(0.5f); 
    over.setGState(gs); 
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45); 
    over.saveState(); 
} 

これは古いバージョンのコードです。

byte[] bytes = FileUtils.readFileToByteArray(new File("myPdf.pdf")); 
PdfReader reader = new PdfReader(bytes); 
int numberOfPages= reader.getNumberOfPages(); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("MyPdfOut.pdf")); 
Font f = font(Font.NORMAL, 135, Color.RED); 
for (int i = 1; i <= numberOfPages; i++) { 
    PdfContentByte over = stamper.getOverContent(i); 
    Phrase p = new Phrase("WATERMARK", f); 
    PdfGState gs = new PdfGState(); 
    gs.setFillOpacity(0.5f); 
    over.setGState(gs); 
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45); 
    over.saveState(); 
} 

答えて

1

これはを禁じ次のとおりです。

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length); 
outputStream.write(bytes, 0, bytes.length); 
PdfStamper stamper = new PdfStamper(reader, outputStream); 

あなたはoutputStreamという名前OutputStreamを作成し、あなたが(write()を使用して)そのOutputStreamに本格既存のPDFファイルをコピーしているようです。次に、同じOutputStreamPdfStamperインスタンスに渡すことによって、OutputStreamに別の本格的なPDFを追加しようとしているようです。 PDFファイルが破損しているはずです。

これも違法PDF構文になります:

PdfContentByte over = stamper.getOverContent(i); 
Phrase p = new Phrase("WATERMARK"); 
PdfGState gs = new PdfGState(); 
gs.setFillOpacity(0.5f); 
over.setGState(gs); 
ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45); 
over.saveState(); 

をあなたはsaveState()演算子を持っていますが、あなたはrestoreState()を使用することはありません。 saveState()ごとにrestoreState()が必要です。あなたのsaveState()は間違った位置にあります!それはあなたがsaveState()restoreState()が何であるか分からないかのようです。

最後に0をカウントし始めますが、最初のページはページ0ではなくページ1です。したがって、for (int i = 0; i < numberOfPages; i++)は間違っています。それはfor (int i = 1; i <= numberOfPages; i++)でなければなりません。このエラーは、となる原因となります。

// create a Phrase with a certain font 
Font font = font(Font.NORMAL, 135, Color.RED); 
Phrase p = new Phrase("WATERMARK", font); 
// Create a reader and a stamper 
PdfReader reader = new PdfReader(getAsByteArray()); 
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
PdfStamper stamper = new PdfStamper(reader, outputStream); 
int numberOfPages= reader.getNumberOfPages(); 
for (int i = 1; i <= numberOfPages; i++) { 
    PdfContentByte over = stamper.getOverContent(i); 
    over.saveState(); 
    PdfGState gs = new PdfGState(); 
    gs.setFillOpacity(0.5f); 
    over.setGState(gs); 
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45); 
    over.restoreState(); 
} 
+0

感謝あなたの助けのために:

これはあなたのコードを修正しようとする試みです。それは非常に痛い5時間だった。 –

関連する問題