2017-04-07 3 views
1

iTextを使用してズームレベルを変更するコードは、で与えられます。iText home pageC#に変換したいと思います。数え切れないほどの時間を経て、私は最終的にコードを書き換えて、リンクを変更していないことを知りました。それは私が間違いをしたに違いないことを意味する。PDF内のすべてのリンク先のズームレベルを変更する

EDIT:

要求としては、simple PDF exampleを見てください。次のように

私のコードは次のとおりです。

using (var reader = new PdfReader(input)) 
{ 
    using (var stamper = new PdfStamper(reader, ms)) 
    { 
     for (int i = 1; i <= reader.NumberOfPages; i++) 
     { 
      // Get a page of a PDF page 
      PdfDictionary page = reader.GetPageN(i); 

      // Get all the annotations of page i 
      PdfArray annotsArray = page.GetAsArray(PdfName.ANNOTS); 

      // If page does not have annotations 
      if (annotsArray == null) 
      { 
       continue; 
      } 

      // For each annotation 
      for (int j = 0; j < annotsArray.Size; j++) 
      { 
       // for current annotation 
       PdfDictionary annotation = annotsArray.GetAsDict(j); 

       // test if it is LINK 
       PdfDictionary annotationAction = annotation.GetAsDict(PdfName.A); 
       if (annotationAction == null || PdfName.LINK.Equals(annotationAction.Get(PdfName.S))) 
       { 
        PdfArray d = annotation.GetAsArray(PdfName.DEST); 
        if (d != null && d.Length == 5 && PdfName.XYZ.Equals(d.GetAsName(1))) 
        { 
         d[4] = new PdfNumber(150); 
        } 
       } 

      } 
     } 
    } 
} 
Javaで

オリジナルのコードは、はるかに短いです:私が思いついたきた@mklする

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
     PdfReader reader = new PdfReader(src); 
     PdfDictionary page = reader.getPageN(11); 
     PdfArray annots = page.getAsArray(PdfName.ANNOTS); 
     for (int i = 0; i < annots.size(); i++) { 
      PdfDictionary annotation = annots.getAsDict(i); 
      if (PdfName.LINK.equals(annotation.getAsName(PdfName.SUBTYPE))) { 
       PdfArray d = annotation.getAsArray(PdfName.DEST); 
       if (d != null && d.size() == 5 && PdfName.XYZ.equals(d.getAsName(1))) 
        d.set(4, new PdfNumber(0)); 
      } 
     } 
     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
     stamper.close(); 
    } 

UPDATED EDIT 2

感謝ソリューションで。あなたが入力として異なるPDFを使用していますが、問題のにリンクされている例えばthe source PDF from the iText web siteを使用している場合

for (int i = 1; i <= reader.NumberOfPages; i++) 
{ 
    PdfDictionary page = reader.GetPageN(i); 

    PdfArray annotsArray = page.GetAsArray(PdfName.ANNOTS); 

    if (annotsArray == null) 
    { 
     continue; 
    } 

    for (int j = 0; j < annotsArray.Size; j++) 
    { 
     PdfDictionary annotation = annotsArray.GetAsDict(j); 

     PdfDictionary annotationAction = annotation.GetAsDict(PdfName.A); 
     if (PdfName.GOTO.Equals(annotationAction.Get(PdfName.S))) 
     { 
      PdfArray d = annotationAction.GetAsArray(PdfName.D); 
      if (d != null) 
      { 
       Console.WriteLine(d[4]); 
       d[4] = new PdfNumber(1.20); 
      } 

     } 

    } 
}  
+0

コードでは、** XYZ **タイプの目的地のみが処理されます。おそらく、あなたのサンプルpdfは、他のタイプの宛先を使用します。したがって、あなたのテストPDFを共有してください。 – mkl

+0

@mklサンプルファイルを追加しました。 – menteith

+0

* 'PdfArray d = annotation.GetAsArray(PdfName.GOTO)' * - これは2つの点で間違っています:** D **という名前の配列を必要とし、** GoTo **という名前の配列ではなく、この配列が含まれています'annotationAction'では、' annotation'には直接ではありません。したがって: 'PdfArray d = annotationAction.GetAsArray(PdfName.D) ' – mkl

答えて

1

あなたは、リンク注釈の仕様を見れば、あなたは

dictionarが表示されますy (オプション、 PDF 1.1)リンク注釈がアクティブになったときに実行されるアクション(12.6「アクション」を参照)。

取引先 配列、名前または バイトストリング(任意; エントリが存在する場合に許可されていない)注釈がアクティブにされたときに表示されなければならない先が(12.3.2を参照して、「 「目的地」)。

(表173 - リンク注釈に固有の追加エントリ - ISO 32000-1)

すなわち、元のJavaコードとポートの両方がのリンクアノテーションの1種類のみを処理します。種類はの宛先です。あなたのサンプルPDFを点検

は、しかし、一つは、例えば、Aエントリでリンク注釈を見つけます

/A << 
    /D [ 1 /XYZ 0.000001 842 0.724 ] 
    /S /GoTo 
>> 

したがって、コードではすべての可能なオプションを考慮する必要があります。特に、あなたが操作するPDFがDestは inationの代わりに定義された ctionを持っている場合、それが適切にDではなく、単に存在しないリンクの ctionの estinationを処理しなければならないDestは ination。

+0

あなたの指示に感謝して、私は「GoTo」アクションを見つけることができました(何度か私はそれを持っていましたが)。 – menteith

+0

実際のソリューションに興味がある人は誰でも私の更新された投稿を見ることができます。 – menteith

1

わからない、これは私のために動作し、文書のズームレベルへのすべてのリンクのためのズームレベルを変更します:

using (reader) 
{ 
    PdfDictionary page = reader.GetPageN(11); 
    PdfArray annots = page.GetAsArray(PdfName.ANNOTS); 
    for (int i = 0; i < annots.Size; i++) 
    { 
     PdfDictionary annotation = annots.GetAsDict(i); 
     if (PdfName.LINK.Equals(annotation.GetAsName(PdfName.SUBTYPE))) 
     { 
      PdfArray d = annotation.GetAsArray(PdfName.DEST); 
      if (d != null && d.Size == 5 && PdfName.XYZ.Equals(d.GetAsName(1))) 
       d.Set(4, new PdfNumber(0)); 
     } 
    } 
    using (var stream = new MemoryStream()) 
    { 
     using (var stamper = new PdfStamper(reader, stream)) { } 
     File.WriteAllBytes(outputFile, stream.ToArray()); 
    } 
} 
+0

多くのご協力いただきありがとうございます!残念ながら、あなたのコードは私のテストファイルに対して動作しません。私は確信していませんが、私は次のページにジャンプするテクニックとして** XYZ **を使うと思います。 – menteith

関連する問題