2016-11-11 11 views
0

iText7でテキストを移動したいと思います。私はソースバウンディングボックスを持っています。それはページのどこかにあり、ターゲットのバウンディングボックスがあり、その位置は固定幅(幅と高さを含む)です。私は同じページにとどまります。ソースボックスとターゲットボックスは重なり合う可能性があります。ソースバウンディングボックスは、ターゲットボックスより大きくすることもできます。この場合、フォントサイズを小さくする必要があります。テキストはフォント、色などを保持する必要があります。フォント、色、スタイルなどを保持しているiText7のページ上のテキストを移動しますが、テキストのサイズを変更します

iTextのWebサイトにはcut and paste exampleがあります。しかし、結果のpdfファイルでは、新しい位置と古い位置でテキストを選択することができます(通常のpdfリーダーでのみ試みました)。私は、テキストを古い位置で選択可能にしたくありません。

私は、テキストを選択して新しい位置に置き、それを古い位置から削除することができたと考えました。後者の場合、私はpdfSweepが必要ですが、これは大丈夫です。新しい位置にテキストを追加することは問題ありません。テキストのフォントやサイズなどが異なっていても。 iTextのWebサイトにはたくさんの例があります。私がテキストを選択するのを知る唯一の方法は、このexampleに示されているようなものです。これは私にテキストだけを与えます。しかし、それを同じフォント、色などで目標位置に配置するには、これらの情報もすべて必要です。 私は、pdfは編集用ではないことを知っています。これはしばしばStackOverflowの答えに言及しています。 iText7でこれを行う方法はありますか?

+0

典型的なソースとターゲットボックスで典型的なサンプルPDFを共有できますか? – mkl

答えて

0

移動ページのコンテンツにあなたをできるようにiTextのには高レベルAPI、いくつかの長方形から特にないすべてのコンテンツがありません。 1つの理由は、一般に、これは単純な移動ではないということかもしれません。 PDFはしばしばより大きな領域に影響を与える構造を含み、そのような構造は単に移動される代わりにコピーされるだけでなく、各コピーがその領域に制限される。

それはcut and paste exampleに既に古い位置で選択可能であることからテキストを防止溶液にOPによって考慮pdfSweepモジュールを発見OPを組み合わせること、しかし、実際に可能であり、例えば

public void moveCleanSection(PdfReader pdfReader, String targetFile, int page, Rectangle from, Rectangle to) throws IOException 
{ 
    LicenseKey.loadLicenseFile("itextkey-multiple-products.xml"); 

    ByteArrayOutputStream interimMain = new ByteArrayOutputStream(); 
    ByteArrayOutputStream interimPage = new ByteArrayOutputStream(); 
    ByteArrayOutputStream interimSection = new ByteArrayOutputStream(); 

    try ( PdfDocument pdfMainDocument = new PdfDocument(pdfReader); 
      PdfDocument pdfPageDocument = new PdfDocument(new PdfWriter(interimPage))) 
    { 
     pdfMainDocument.setCloseReader(false); 
     pdfMainDocument.copyPagesTo(page, page, pdfPageDocument); 
    } 

    try ( PdfDocument pdfMainDocument = new PdfDocument(pdfReader, new PdfWriter(interimMain)); 
      PdfDocument pdfSectionDocument = new PdfDocument(new PdfReader(new ByteArrayInputStream(interimPage.toByteArray())), 
      new PdfWriter(interimSection)) ) 
    { 

     List<PdfCleanUpLocation> cleanUpLocations = new ArrayList<PdfCleanUpLocation>(); 
     cleanUpLocations.add(new PdfCleanUpLocation(page, from, null)); 
     cleanUpLocations.add(new PdfCleanUpLocation(page, to, null)); 

     PdfCleanUpTool cleaner = new PdfCleanUpTool(pdfMainDocument, cleanUpLocations); 
     cleaner.cleanUp(); 

     cleanUpLocations = new ArrayList<PdfCleanUpLocation>(); 
     Rectangle mediaBox = pdfSectionDocument.getPage(1).getMediaBox(); 

     if (from.getTop() < mediaBox.getTop()) 
      cleanUpLocations.add(new PdfCleanUpLocation(1, new Rectangle(mediaBox.getLeft(), from.getTop(), mediaBox.getWidth(), mediaBox.getTop() - from.getTop()), null)); 
     if (from.getBottom() > mediaBox.getBottom()) 
      cleanUpLocations.add(new PdfCleanUpLocation(1, new Rectangle(mediaBox.getLeft(), mediaBox.getBottom(), mediaBox.getWidth(), from.getBottom() - mediaBox.getBottom()), null)); 
     if (from.getLeft() > mediaBox.getLeft()) 
      cleanUpLocations.add(new PdfCleanUpLocation(1, new Rectangle(mediaBox.getLeft(), mediaBox.getBottom(), from.getLeft() - mediaBox.getLeft(), mediaBox.getHeight()), null)); 
     if (from.getRight() < mediaBox.getRight()) 
      cleanUpLocations.add(new PdfCleanUpLocation(1, new Rectangle(from.getRight(), mediaBox.getBottom(), mediaBox.getRight() - from.getRight(), mediaBox.getHeight()), null)); 

     cleaner = new PdfCleanUpTool(pdfSectionDocument, cleanUpLocations); 
     cleaner.cleanUp(); 
    } 

    try ( PdfDocument pdfSectionDocument = new PdfDocument(new PdfReader(new ByteArrayInputStream(interimSection.toByteArray()))); 
      PdfDocument pdfMainDocument = new PdfDocument(new PdfReader(new ByteArrayInputStream(interimMain.toByteArray())), new PdfWriter(targetFile))) 
    { 
     float scale = Math.min(to.getHeight()/from.getHeight(), to.getWidth()/from.getWidth()); 
     pdfSectionDocument.getPage(1).setMediaBox(from); 
     PdfFormXObject pageXObject = pdfSectionDocument.getFirstPage().copyAsFormXObject(pdfMainDocument); 
     PdfPage pdfPage = pdfMainDocument.getPage(page); 
     PdfCanvas pdfCanvas = new PdfCanvas(pdfPage); 
     pdfCanvas.addXObject(pageXObject, scale, 0, 0, scale, (to.getLeft() - from.getLeft() * scale), (to.getBottom() - from.getBottom() * scale)); 
    } 
} 

MoveSectionCleanly.javaから)

注意してください:このようによりpdfSweepの性質のために、テキストがソース領域の境界上にあるソースとそのコピーの両方から削除されます。

+1

私の(非常に)遅れて返事を申し訳ありません。どうもありがとうございました。セクションのコピーを作成し、それを拡大縮小してページに貼り付けることは私の心には及ばなかった。 – Nick

関連する問題