2016-06-01 6 views
0

Ich hatte ein Problem mit podofo, um PDF-Dokument zu ändern, wenn Sie Zeit hatten, bitte helfen Sie mir, es zu lösen!Ausgabe Text vertikal umgedreht, wenn zu ändern pdf

Ich fand podofo Quelle auf http://podofo.sourceforge.net/download.html, kompilierte ich es auf Windows 7 x86, und ich fand podofo die Funktion ist sehr mächtig.

Aber wenn ich etwas im Beispiel "helloworld.cpp" ändern, nur ein wenig Code ändern, um PDF-Dokument zu ändern und speichern Sie es mit anderen Dateinamen!

Wenn ich eine lokale PDF-Dokumentdatei (das lokale PDF-Dokument wird aus einem Word-Dokument, das Windows COM-Schnittstelle auf Office Word 2007 verwenden) in Funktion übergeben, wird die neue Datei erfolgreich ausgegeben, aber der Ausgabetext ist vertikal umgedreht und die Y-Position der Ausgabetexte wird vertikal umgedreht.

(manche Leute sagten, in einer solchen Situation muss man sich damit auseinandersetzen, dass der vorhandene Inhalt den Grafikzustand verändert haben mag, zB die aktuelle Transformationsmatrix geändert, vielleicht hat er recht, aber ich finde die Funktionen nicht auf den Grafikzustand verändert und verändert die aktuelle Transformationsmatrix)

Dies ist das Bild Screenshot, ich weiß nicht, warum die Ausgabe Text vertikal gespiegelt wird:

screenshot

die ungerade ist es gut funktionieren als ich das Dokument "output.pdf", das mit dem Beispiel erstellt wurde, "helloworl" übergeben habe d ".

Wenn Sie Zeit hatten, bitte helfen Sie mir, es zu lösen, vielen Dank!

Mein geänderten Code sieht wie folgt aus:

#define MEMDOCUMENT 1 // macro switch 
void HelloWorld(const char* pszFilename) 
{ 
    /* 
    * PdfStreamedDocument is the class that can actually write a PDF file. 
    * PdfStreamedDocument is much faster than PdfDocument, but it is only 
    * suitable for creating/drawing PDF files and cannot modify existing 
    * PDF documents. 
    * 
    * The document is written directly to pszFilename while being created. 
    */ 
#if MEMDOCUMENT 
    PdfMemDocument document(pszFilename); //open local pdf documet 
#else 
    PdfStreamedDocument document(pszFilename); //create a new pdf documet 
#endif 
    /* 
    * PdfPainter is the class which is able to draw text and graphics 
    * directly on a PdfPage object. 
    */ 
    PdfPainter painter; 

    /* 
    * This pointer will hold the page object later. 
    * PdfSimpleWriter can write several PdfPage's to a PDF file. 
    */ 
    PdfPage* pPage; 

    /* 
    * A PdfFont object is required to draw text on a PdfPage using a PdfPainter. 
    * PoDoFo will find the font using fontconfig on your system and embedd truetype 
    * fonts automatically in the PDF file. 
    */  
    PdfFont* pFont; 

    try { 
     /* 
     * The PdfDocument object can be used to create new PdfPage objects. 
     * The PdfPage object is owned by the PdfDocument will also be deleted automatically 
     * by the PdfDocument object. 
     * 
     * You have to pass only one argument, i.e. the page size of the page to create. 
     * There are predefined enums for some common page sizes. 
     */ 
#if MEMDOCUMENT 
     pPage = document.GetPage(0); //get the first page and modify it 
#else 
     pPage = document.CreatePage(PdfPage::CreateStandardPageSize(ePdfPageSize_A4)); 
#endif 
     /* 
     * If the page cannot be created because of an error (e.g. ePdfError_OutOfMemory) 
     * a NULL pointer is returned. 
     * We check for a NULL pointer here and throw an exception using the RAISE_ERROR macro. 
     * The raise error macro initializes a PdfError object with a given error code and 
     * the location in the file in which the error ocurred and throws it as an exception. 
     */ 
     if(!pPage) 
     { 
      PODOFO_RAISE_ERROR(ePdfError_InvalidHandle); 
     } 

     /* 
     * Set the page as drawing target for the PdfPainter. 
     * Before the painter can draw, a page has to be set first. 
     */ 
     painter.SetPage(pPage); 

     /* 
     * Create a PdfFont object using the font "Arial". 
     * The font is found on the system using fontconfig and embedded into the 
     * PDF file. If Arial is not available, a default font will be used. 
     * 
     * The created PdfFont will be deleted by the PdfDocument. 
     */ 
     pFont = document.CreateFont("Arial"); 

     /* 
     * If the PdfFont object cannot be allocated return an error. 
     */ 
     if(!pFont) 
     { 
      PODOFO_RAISE_ERROR(ePdfError_InvalidHandle); 
     } 

     /* 
     * Set the font size 
     */ 
     pFont->SetFontSize(18.0); 

     /* 
     * Set the font as default font for drawing. 
     * A font has to be set before you can draw text on 
     * a PdfPainter. 
     */ 
     painter.SetFont(pFont); 

     /* 
     * You could set a different color than black to draw 
     * the text. 
     * 
     * SAFE_OP(painter.SetColor(1.0, 0.0, 0.0)); 
     */ 

     /* 
     * Actually draw the line "Hello World!" on to the PdfPage at 
     * the position 2cm,2cm from the top left corner. 
     * Please remember that PDF files have their origin at the 
     * bottom left corner. Therefore we substract the y coordinate 
     * from the page height. 
     * 
     * The position specifies the start of the baseline of the text. 
     * 
     * All coordinates in PoDoFo are in PDF units. 
     * You can also use PdfPainterMM which takes coordinates in 1/1000th mm. 
     * 
     */ 

     painter.SetTransformationMatrix(1,0,0,-1,0,pPage->GetPageSize().GetHeight()); 

     painter.DrawText(56.69, pPage->GetPageSize().GetHeight() - 56.69, "Hello World!"); 

     painter.DrawText(56.69, pPage->GetPageSize().GetHeight() - 96.69, "Hello World!"); 

     /* 
     * Tell PoDoFo that the page has been drawn completely. 
     * This required to optimize drawing operations inside in PoDoFo 
     * and has to be done whenever you are done with drawing a page. 
     */ 
     painter.FinishPage(); 

     /* 
     * Set some additional information on the PDF file. 
     */ 
     document.GetInfo()->SetCreator (PdfString("examplahelloworld - A PoDoFo test application")); 
     document.GetInfo()->SetAuthor (PdfString("Dominik Seichter")); 
     document.GetInfo()->SetTitle (PdfString("Hello World")); 
     document.GetInfo()->SetSubject (PdfString("Testing the PoDoFo PDF Library")); 
     document.GetInfo()->SetKeywords(PdfString("Test;PDF;Hello World;")); 

     /* 
     * The last step is to close the document. 
     */ 

#if MEMDOCUMENT 
     document.Write("outputex.pdf"); //save page change 
#else 
     document.Close(); 
#endif 


    } catch (const PdfError & e) { 
     /* 
     * All PoDoFo methods may throw exceptions 
     * make sure that painter.FinishPage() is called 
     * or who will get an assert in its destructor 
     */ 
     try { 
      painter.FinishPage(); 
     } catch(...) { 
      /* 
      * Ignore errors this time 
      */ 
     } 

     throw e; 
    } 
} 
+0

Sie uns mit mehr Informationen über das eigentliche Problem und was erwartet Sie zur Verfügung stellen sollte. Und was genau hast du geändert? – DomTomCat

+0

Soweit ich sehen kann, besteht der Hauptunterschied zum ursprünglichen Beispiel darin, dass Ihr Code (mit '#define MEMDOCUMENT 1') ein bestehendes PDF bearbeitet, indem er an den vorhandenen Inhalt der ersten Seite anfügt, anstatt ein neues PDF zu erstellen und den Inhalt zu erstellen eine neue Seite. In einer solchen Situation müssen Sie mit der Tatsache umgehen, dass der vorhandene Inhalt den Grafikzustand, z. änderte die aktuelle Transformationsmatrix, um Dinge auf den Kopf zu stellen, und diese Änderungen wirken sich auf Ihre Aktionen aus, z. Ihr Text wird auch umgedreht. – mkl

+0

@mkl Ich denke, etwas ist anders. aber ich weiß nicht, wie man den Graphikzustand ändert und die gegenwärtige Umwandlungsmatrix ändert, um Sachen umzudrehen ... –

Antwort

1

danken für mkl, mit Hilfe von mkl hatte die Frage gelöst.

das Problem ist, weil Reflexion effect.podofo Quellcode die Transformationsmatrix hat, können Sie es vor dem Hinzufügen von Texten oder Zeile auf PDF-Dokument ändern.

einige Code wie folgt hinzu: //

 painter.SetTransformationMatrix(1,0,0,-1,0,pPage->GetPageSize().GetHeight()); // set Reflection effect 
     painter.Save(); 

     painter.DrawText(56.69, pPage->GetPageSize().GetHeight() - 56.69, "Hello World!"); 

     painter.DrawText(56.69, pPage->GetPageSize().GetHeight() - 96.69, "Hello World!"