Kapitel 3. Funktionsumfang

3.1. Überblick

Syntaktischer Einstieg

Alle Tests benötigen die use-Anweisung use PDF::PDFUnit. Funktionen aus Test::Exception und Test::More werden in den Beispielen benutzt, gehören jedoch nicht zu PDFUnit.

use PDF::PDFUnit;
use Test::Exception;
use Test::More;

Tests auf ein einzelnes PDF-Dokument beginnen mit der Benennung der zu testenden Datei über die Methode AssertThat->document(..). Von dort aus verzweigen die Tests in unterschiedliche Testbereiche, wie z.B. Inhalt, Schriften, Layout etc.:

Unter Verkürzung des Listungs um die notwendigen use-Anweisungen wird die Art der API im folgenden Beispiel deutlich:

my $resources_dir = ...;              # the base folder of your test data
my $pdfUnderTest = "$resources_dir/doc-under-test.pdf";    1

lives_ok {                             # function from Test::Exception 
  my $expectedText = "John Doe";       # 
                                       #
  AssertThat->document($pdfUnderTest)  # document under test
            ->restrictedTo($page2)     # page selection
            ->hasText()                # test scope
            ->...                      # further validation methods
  ;                                    #
} "name of the test";                  # name of the test


#
# Comparing a single document with a reference:
#
lives_ok {                             # 
  my $expectedText = "John Doe";       # 
                                       #
  AssertThat->document($pdfUnderTest)  # the document under test
            ->and($reference)          # the reference document for the comparison
            ->restrictedTo($page2)     # 
            ->hasText()                # 
            ->...                      # 
  ;                                    #
} "comparing a PDF with a reference";  #

1

Das PDF-Dokument kann als Datentyp String, File, InputStream, URL oder byte-Array an die Funktion übergeben werden.

Wenn mehrere PDF-Dokumente in einen Test einfließen, beginnt er mit der Methode AssertThat->eachDocument(..):

# Instantiation of PDFUnit for multiple documents:
...
my $pdfArray = [$pdfUnderTest1, $pdfUnderTest2];
AssertThat->eachDocument($pdfArray)    1  5: „Mehrere Dokumente und Verzeichnisse“ 
          ->hasFormat(A4_PORTRAIT)
;
...

1

Die PDF-Dokumente können als String[], File[], InputStream[], oder URL[] an die Funktion übergeben werden.

Tests können sich auch auf alle PDF-Dokumente in einem Verzeichnis beziehen. Solche Tests beginnen mit der Methode AssertThat->eachDocument()->inFolder(..):

# Instantiation of PDFUnit for a folder:
...
AssertThat->eachDocument()
          ->inFolder($folder)              1  5.3: „Verzeichnis testen“ 
          ->passedFilter($allPdfunitFiles)
          -> ...
;
...

1

Alle PDF-Dokumente in diesem Verzeichnis werden validiert. PDF-Dokumente in Unterverzeichnisse werden nicht geprüft.

Testbereiche

Die folgende Liste gibt einen vollständigen Überblick über die Testgebiete von PDFUnit. Die Kapitel sind aber nicht in diesem Handbuch beschreiben, sondern im Handbuch von PDFUnit-Java, letztendlich um Redundanzen zu vermeiden, die über kurz oder lang zu einer fehlerhaften Dokumentation führen würden. Hier der Link zum PDFUnit-Java Handbuch: http://www.pdfunit.com/de/documentation/java/.

# Every one of the following methods opens a new test scope:
# 
# The detailed descriptions can be found in the manual of PDFUnit-Java (to avoid redundancy).
# The names of the methods are exactly the same.
#
# see  http://www.pdfunit.com/de/documentation/java/  
#  
->asRenderedPage()               

->containsImage(..)              
->containsOneImageOf(..)         

->hasAuthor()                    
->hasBookmark()                  
->hasBookmarks()                 
->hasCreationDate()              
->hasCreator()                   
->hasEmbeddedFile(..)            
->hasEncryptionLength(..)        
->hasField(..)                   
->hasFields(..)                  
->hasFont()                      
->hasFonts()                     
->hasFormat(..)                  
->hasImage(..)                   
->hasJavaScript()                
->hasJavaScriptAction()          
->hasKeywords()                  
->hasLanguageInfo(..)            
->hasLayer()                     
->hasLayers()                    
->hasLessPagesThan()             
->hasLocalGotoAction()           
->hasModificationDate()          
->hasMorePagesThan()             
->hasNamedDestination()          

->hasNoAuthor()                  
->hasNoCreationDate()            
->hasNoCreator()                 
->hasNoImage()                   
->hasNoKeywords()                
->hasNoLanguageInfo()            
->hasNoModificationDate()        
->hasNoProducer()                
->hasNoProperty(..)              
->hasNoSubject()                 
->hasNoText()                    
->hasNoTitle()                   
->hasNoXFAData()                 
->hasNoXMPData()                 

->..  continued
... continuation:

->hasNumberOf...()               

->hasOCG()                       
->hasOCGs()                      
->hasOwnerPassword(..)           
->hasPermission()                
->hasProducer()                  
->hasProperty(..)                
->hasSignatureField(..)          
->hasSignatureFields()           
->hasSubject()                   
->hasText()                      
->hasTitle()                     
->hasUserPassword(..)            
->hasVersion()                   
->hasXFAData()                   
->hasXMPData()                   
->hasZugferdData()               

->haveSame...()                  

->isCertified()                  
->isCertifiedFor(..)             
->isLinearizedForFastWebView()   
->isSigned()                     
->isSignedBy(..)                 
->isTagged()                     

->restrictedTo(..)               

Manche Testbereiche erreicht man erst nach einem weiteren Methodenaufruf:

# Validation of bar code and QR code:
->hasImage()->withBarcode()                
->hasImage()->withQRcode()                 

# Validation based on Excel files:
->compliesWith()->constraints(excelRules)  

# Validation of DIN5008 constraints:
->compliesWith()->din5008FormA()           
->compliesWith()->din5008FormB()           
->compliesWith()->pdfStandard()            

# Validation around ZUGFeRD:
->compliesWith()->zugferdSpecification(..) 

Hier noch einmal der Link zum PDFUnit-Java Handbuch: http://www.pdfunit.com/de/documentation/java/.

PDFUnit wird ständig weiterentwickelt und die Dokumentation aktuell gehalten. Sollten Sie Tests vermissen, schicken Sie Ihre Wünsche und Vorschläge an info[at]pdfunit.com.