2011-02-03 83 views
3

埋め込みフォントを含むいくつかのpdf/aドキュメントがあります。これらのドキュメントをiTextで後処理してウォーターマークを追加する必要があります。埋め込みフォントを使用してiTextを使用してウォーターマークを追加する方法

私はそれがiTextのにフォントを埋め込むことが可能だということを知っている:

BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED); 

が、私は、テキストの透かし(「サンプルコピー」のようなものを追加するために、既に文書に埋め込まれたフォントを使用したいです)。

どうすればいいですか?

答えて

0

プレーンjPod(BSD、SourceForge)を使用すると、「ウォーターマーク」の例に基づくことができます。あなたが欲しい...

+0

お返事ありがとうございます! iTextソリューションには何かありますか? – alexyz78

+0

申し訳ありません - 私はiTextに精通していません。 ; '民間PRIndirectReference getFontIndirectRef(PdfReader pdfReader、文字列desiredFontName){ PRIndirectReferenceフォント= NULL:iTextの5.0.2を使用して – mtraut

2

PDFontTools.getFonts(doc) 

を使用すると、フォントを列挙することができ、その後、「CreateFormの」方法でそれらのいずれかを使用DocumentFontです。それらを直接作成することはできません。コンストラクタはパッケージプライベートですが、BaseFont.createFont(PRIndirectReference)がそのトリックを行います。

だから、あなたが望むフォントにPRIndirectReferenceを取得する必要があります。 "PR"はPdfReaderから来ました。

1)/Type /Fontでないものをすべて削除してから、PRStreamでないものすべてを除外して、すべてのオブジェクトをPdfReaderで列挙します。正しい名前のフォントを探しています。

public PRIndirectReference findNamedFont(PdfReader myReader, String desiredFontName) { 
    int objNum = 0; 
    PdfObject curObj; 
    do { 
    //The "Release" version doesn't keep a reference 
    //to the object so it can be GC'd later. Quite Handy 
    //when dealing with Really Big PDFs. 
    curObj = myReader.getPdfObjectRelease(objNum++); 
    if (curObj instanceof PRStream) { 
     PRStream stream = (PRStream)curObj; 
     PdfName type = stream.getAsName(PdfName.TYPE); 
     if (PdfName.FONT.equals(type)) { 
     PdfString fontName = stream.getAsString(PdfName.BASEFONT); 
     if (desiredFontName.equals(fontName.toString())) { 
      return curObj.getIndRef(); 
     } 
     } 
    } 
    } while (curObj != null); 
return null; 
} 

2)が正しい名前を持つフォントを探して、あなたのページのリソースディクショナリに/Font <<>> dictsを調べます。 XObjectフォームリソースはあなたがチェックする必要があります自分自身のリソースを持っていることに留意してください:

public PRIndirectReference findFontInPage(PdfReader reader, String desiredName, int i) { 

    PdfDictionary page = reader.getPageN(i); 
    return findFontInResources(page.getAsDict(PdfName.RESOURCES), desiredName); 
} 

public PRIndirectReference findFontInResources(PdfDictionary resources, String desiredName) { 
    if (resources != null) { 
    PdfDictionary fonts = resources.getAsDict(PdfName.FONTS); 
    if (fonts != null) { 
     for (PdfName curFontName : fonts.keySet()) { 
     PRStream curFont (PRStream)= fonts.getAsStream(curFontName); 
     if (desiredName.equals(curFont.getAsString(PdfName.BASEFONT).toString()) { 
      return (PRIndirectReference) curFont.getIndirectReference(); 
     } 
     } 
    } 
    PdfDictionary xobjs = resources.getAsDict(PdfName.XOBJECTS); 
    if (xobjs != null) { 
     for (PdfName curXObjName : xobjs.keySet()) { 
     PRStream curXObj = (PRStream)xobjs.getAsStream(curXObjName); 
     if (curXObj != null && PdfName.FORM.equals(curXObj.getAsName(PdfName.SUBTYPE)) { 
      PdfDictionary resources = curXObj.getAsDict(PdfName.RESOURCES); 
      PRIndirectReference ref = findFontInResources(resources, desiredName); 
      if (ref != null) { 
      return ref; 
      } 
     } 
     } 
    } 
    } 
    return null; 
} 

それらのいずれかは、あなたのPRIndirectReferenceあなたは後にしているを取得します。その後、BaseFont.createFont(myPRRef)に電話すると、DocumentFontが必要になります。最初の方法はPDF内の任意のフォントを検索し、2番目の方法は実際に使用されるフォントのみを検索します。

また、サブセット化されたフォントは、フォント名の前に「6-random-letters-plus-sign」タグが付加されています。フォントサブセットを使用しないでください。使用している文字がサブセットにない場合があり、「arry ole」という問題につながります。それは素晴らしく、汚れているように聞こえますが、それは実際に私たちの販売員の名前でした: "Harry Vole"は大文字を欠いていました。

PS:フォームフィールドで使用する予定のフォントのサブセットを埋め込むことはありません。いいえブエノ。

通常、「ここの回答ボックスにすべてのコードを書いています」という免責事項が適用されますが、この種のコードはたくさん書かれていますので、そのまま使えます。あなたの指を渡す。 ;)

+0

私はこの解決策を見つけました用 (オブジェクト[] OBJ:BaseFont.getDocumentFonts(pdfReader)){ ストリングたfontName =(文字列)、OBJ [0]。 IF(fontName.equals(desiredFontName)){ フォント=(PRIndirectReference)、OBJ [1]。 } } 戻りフォント; } BaseFont bf = BaseFont.createFont(getFontIndirectRef(pdfReader、 "Helvetica")); ' – alexyz78

+0

+1サブセットフォントを使用しないようにするためのアドバイス。 – alexyz78

1

全く異なるアプローチ:テキストの代わりにラインアートを使用します。

ページのoverContentから「ラインアートのみ」のPdfGraphics2Dオブジェクトを作成すると、AWTフォントを使用でき、埋め込みについて何も心配する必要はありません。比較的短い文字列では、PDFのサイズが爆発することを心配する必要はありません。

PdfContentByte overcontent = stamper.getOverContent(1); 
Graphics2D g2d = overcontent.createGraphicsShapes(pageWid, pageHei); 

drawStuffToTheGraphic(g2d); 

g2d.dispose(); 

これは実際には「テキスト」という結果になります。選択、検索などはできません。あなたが何をしているかによって、それは良いか悪いかが分かります。

関連する問題