2016-11-11 1 views
0

Ich möchte Text mit iText7 verschieben. Ich habe eine Quell-Bounding-Box, die irgendwo auf der Seite sein kann und ich habe eine Ziel-Bounding-Box, die eine feste Position (inkl. Breite und Höhe) hat. Ich bleibe auf der gleichen Seite. Die Quell- und Zielfelder können sich überlappen. Die Quellenbegrenzungsbox kann auch größer als die Zielbox sein. In diesem Fall muss ich die Schriftgröße reduzieren. Der Text sollte Schriftart, Farbe und so weiter beibehalten.Verschieben von Text auf einer Seite mit iText7 Beibehalten von Schriftart, Farbe, Stil, ... aber Ändern der Größe des Textes

Es gibt eine cut and paste example auf der iText-Website. Aber in der Ergebnis-PDF-Datei können Sie den Text an der neuen und alten Position auswählen (nur mit einem normalen PDF-Reader). Ich möchte nicht, dass der Text an der alten Position auswählbar ist.

Ich dachte, dass ich vielleicht den Text auswählen und ihn einfach an der neuen Position platzieren und von der alten Position entfernen könnte. Für letzteres würde ich pdfSweep brauchen, aber das ist ok. Das Hinzufügen des Textes an der neuen Position sollte kein Problem sein. Auch wenn der Text verschiedene Schriftarten, Größen usw. hat. Es gibt viele Beispiele auf der iText-Website. Der einzige Weg, den ich kenne, um den Text auszuwählen, ist wie in dieser example gezeigt. Das gibt mir nur den Text. Aber um es an der Zielposition mit der gleichen Schriftart, Farbe und so weiter zu platzieren, brauche ich auch all diese Informationen. Ich weiß, dass pdf nicht zur Bearbeitung gedacht ist. Dies wird oft in den Antworten zu StackOverflow erwähnt. Gibt es eine Möglichkeit, dies mit iText7 zu tun?

+0

Können Sie ein typisches Beispiel-PDF mit typischen Quell- und Zielfeldern teilen? – mkl

Antwort

0

Es gibt keine hohen Level-API in iText so dass Sie bewegen Seiteninhalt, insbesondere nicht alle Inhalte von einem Rechteck. Ein Grund mag sein, dass dies im Allgemeinen kein bloßer Umzug ist. PDFs enthalten oft Strukturen, die größere Bereiche beeinflussen, und solche Strukturen müssten nicht einfach verschoben, sondern kopiert werden, und jede Kopie wäre auf ihren Bereich beschränkt.

Es ist in der Tat möglich, aber die cut and paste example den OP mit dem pdfSweep Modul bereits durch die OP zu einer Lösung betrachtet gefunden zu kombinieren, die aus wählbar ist an der alten Position den Text verhindert, z.B. wie folgt aus:

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)); 
    } 
} 

(Von MoveSectionCleanly.java)

Vorsicht: sowohl von der Quelle Aufgrund der Natur von pdfSweep, Text an der Grenze des Quellbereiches wird entfernt und die Kopie davon.

+1

Entschuldigung für meine (sehr) späte Antwort. Vielen Dank. Es ist mir nicht in den Sinn gekommen, eine Kopie des Abschnitts zu erstellen, ihn zu skalieren und auf die Seite zu legen. – Nick

Verwandte Themen