2013-07-16 29 views
6

どのように私はすでにピクセルで知っている特定の位置に書き込むことで、pdfページをjavaとpdfboxで編集できますか?pdfページを使用してpdfページを編集する

私はこれを試してみましたが、それは上書きされます:

PDDocument document = null; 
try { 
    document = PDDocument.load(new File("/x/x/x/mypdf.pdf")); 
    PDPage page = (PDPage) document.getDocumentCatalog().getAllPages().get(0); 
    PDFont font = PDType1Font.HELVETICA_BOLD; 
    PDPageContentStream contentStream = new PDPageContentStream(document, page); 
    page.getContents().getStream(); 
    contentStream.beginText(); 
    contentStream.setFont(font, 12); 
    contentStream.moveTextPositionByAmount(100, 100); 
    contentStream.drawString("Hello"); 
    contentStream.endText(); 
    contentStream.close(); 
    document.save("/x/x/x/mypdf.pdf"); 
    document.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (COSVisitorException e) { 
    e.printStackTrace(); 
} 

ありがとうございました。

答えて

2

私は、これは私が使用したJavaコードで、代わりにpdfboxを使用しての私はiTextpdfを使用し、それを行うにはどのようにそれを見つけ出す:

package ma; 

import java.io.*; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.pdf.*; 

public class editPdf { 

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

    PdfReader reader = new PdfReader("/Users/Monssef/Desktop/mypdf.pdf"); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
      "/Users/Leonidas/Desktop/mypdfmodified.pdf")); 
    BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, 
      BaseFont.NOT_EMBEDDED); 

     PdfContentByte over = stamper.getOverContent(1); 

     over.beginText(); 
     over.setFontAndSize(bf, 10); 
     over.setTextMatrix(107, 107); 
     over.showText("page updated"); 
     over.endText(); 

    stamper.close(); 
} 

} 
+1

投稿された質問に対する正解ではありません。 –

14

あなたが不足しているすべてがに追加され、PDFBoxを使用することもできましたページ。

PDPageContentStream contentStream = new PDPageContentStream(document, page); 

:ちょうどこの行を変更

:PDFBox 2.0から始まっ

PDPageContentStream contentStream = new PDPageContentStream(document, page, true, true); 

booleanappendContentは、前のコードと同等のが今あるようなAppendModeAPPENDに置き換えられました

PDPageContentStream contentStream = new PDPageContentStream(
    document, page, PDPageContentStream.AppendMode.APPEND, true 
); 
1

アニタが正しいです。実際にはかなりうまく動作します。私はライン

page.getContents().getStream(); 

はおそらく無関係のである、とPDPageは新しいリリースでPDPageableの賛成で償却されている(と印刷のために主に使用されている)が、コードはに行かなくてもあなたの目的のために動作することを追加しますiTextの費用(そして結局のところ、あなたはもともとPDFBoxについて尋ねました)。

アニタはcontentstreamの作成に余分なビットを作成するために与えた修正を含めることを忘れないでください:

PDPageContentStream contentStream = new PDPageContentStream(
     document, page, true, true); 

また、あなたはおそらく、印刷の各セクションのためのストリームを作成し、クローズされることを覚えておいてくださいあなたはPDF上にテキストを重ねて配置します。ストリームとドキュメントの両方を閉じてバッファが書き込まれるようにする必要があります。そうしないと、変更内容が表示されません。

また、これを試してみる人には、pdfbox用のapacheからライブラリをダウンロードするいくつかのオプションがあります。使用するのが最も簡単なのは、という名前のもの(現在)です(私のJSFアプリケーションでも現在使用しています)pdfbox-app-1.8.10.jarです。すでにpdfboxに配線されている他のライブラリも含まれており、意味のあることをするためにダウンロードする必要があります。

+0

3つのブール型パラメータを持つ 'PDPageContentStream'コンストラクタは、さらに良い選択です。新しいストリームの開始時にグラフィックス状態がデフォルト状態になっていることを確認しようとします。 – mkl

+0

私はそれに同意するでしょう。必須ではありませんが、あなたがする必要があるそれぞれのことを行うときにグラフィックがどのような状態にあるのかを知ることは良いことです。 OPが彼が書いた部分を無視して自分自身の疑問に答えたのはあまりにも悪いことです。 Anitaは彼に答えを与え、問題に合った答えを出しました。 – FreedomRings

関連する問題