[ 
https://issues.apache.org/jira/browse/PDFBOX-5686?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17767065#comment-17767065
 ] 

Břetislav Černík edited comment on PDFBOX-5686 at 9/20/23 10:00 AM:
--------------------------------------------------------------------

I add the PDF acroform example with xfdf files.

ZK_OK.XFDF use the only ascii characters and the pdfbox works ok with following 
command line on Windows with installed czech fonts
java -jar pdfbox-app-3.0.0.jar import:xfdf --data ZK_OK.XFDF -i ZK.pdf -o 
out.pdf
ZK_BAD.XFDF use the czech characters and generate errorwith following command 
line on Windows with installed czech fonts
java -jar pdfbox-app-3.0.0.jar import:xfdf --data ZK_BAD.XFDF -i ZK.pdf -o 
out.pdf

Zß° 20, 2023 10:09:15 DOP. org.apache.pdfbox.pdmodel.PDAbstractContentStream 
close
WARNING: You did not call endText(), some viewers won't display your text
java.lang.IllegalArgumentException: U+010D is not available in this font's 
encoding: WinAnsiEncoding
at org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.encode(PDTrueTypeFont.java:404)
 at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:337)
 at org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:368)
 at 
org.apache.pdfbox.pdmodel.interactive.form.PlainTextFormatter.format(PlainTextFormatter.java:195)
 at 
org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.insertGeneratedAppearance(AppearanceGeneratorHelper.java:609)
 at 
org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceContent(AppearanceGeneratorHelper.java:443)
 at 
org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceValue(AppearanceGeneratorHelper.java:259)
 at 
org.apache.pdfbox.pdmodel.interactive.form.PDTextField.constructAppearances(PDTextField.java:262)
 at 
org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField.applyChange(PDTerminalField.java:209)
 at 
org.apache.pdfbox.pdmodel.interactive.form.PDTextField.setValue(PDTextField.java:218)
 at 
org.apache.pdfbox.pdmodel.interactive.form.PDField.importFDF(PDField.java:250) 
at 
org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField.importFDF(PDTerminalField.java:101)
 at 
org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm.importFDF(PDAcroForm.java:139)
 at org.apache.pdfbox.tools.ImportFDF.importFDF(ImportFDF.java:73)
 at org.apache.pdfbox.tools.ImportXFDF.call(ImportXFDF.java:96)
 at org.apache.pdfbox.tools.ImportXFDF.call(ImportXFDF.java:41)
 at picocli.CommandLine.executeUserObject(CommandLine.java:2041)
at picocli.CommandLine.access$1500(CommandLine.java:148)
 at 
picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2461)
 at picocli.CommandLine$RunLast.handle(CommandLine.java:2453)
 at picocli.CommandLine$RunLast.handle(CommandLine.java:2415)
 at 
picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2273)
 at picocli.CommandLine$RunLast.execute(CommandLine.java:2417)
 at picocli.CommandLine.execute(CommandLine.java:2170)
 at org.apache.pdfbox.tools.PDFBox.main(PDFBox.java:77)
 

 


was (Author: JIRAUSER302290):
I add the PDF acroform example with xfdf files.

ZK_OK.XFDF use the only ascii characters and the pdfbox works ok with following 
command line on Windows with installed czech fonts
java -jar pdfbox-app-3.0.0.jar import:xfdf --data ZK_OK.XFDF -i ZK.pdf -o 
out.pdf
ZK_BAD.XFDF use the czech characters and generate errorwith following command 
line on Windows with installed czech fonts
java -jar pdfbox-app-3.0.0.jar import:xfdf --data ZK_BAD.XFDF -i ZK.pdf -o 
out.pdf

 

ß° 20, 2023 10:09:15 DOP. org.apache.pdfbox.pdmodel.PDAbstractContentStream 
close                                                                           
                                                                                
                                                                                
                                                                                
                           WARNING: You did not call endText(), some viewers 
won't display your text                                                         
                                                                                
                                                                                
                                                                                
                                                      
java.lang.IllegalArgumentException: U+010D is not available in this font's 
encoding: WinAnsiEncoding                                                       
                                                                                
                                                                                
                                                                                
                                     at 
org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.encode(PDTrueTypeFont.java:404)   
                                                                                
                                                                                
                                                                                
                                                                                
                     at 
org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:337)                   
                                                                                
                                                                                
                                                                                
                                                                                
                     at 
org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:368)           
                                                                                
                                                                                
                                                                                
                                                                                
                     at 
org.apache.pdfbox.pdmodel.interactive.form.PlainTextFormatter.format(PlainTextFormatter.java:195)
                                                                                
                                                                                
                                                                                
                                                                                
    at 
org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.insertGeneratedAppearance(AppearanceGeneratorHelper.java:609)
                                                                                
                                                                                
                                                                                
                                                   at 
org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceContent(AppearanceGeneratorHelper.java:443)
                                                                                
                                                                                
                                                                                
                                                        at 
org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceValue(AppearanceGeneratorHelper.java:259)
                                                                                
                                                                                
                                                                                
                                                          at 
org.apache.pdfbox.pdmodel.interactive.form.PDTextField.constructAppearances(PDTextField.java:262)
                                                                                
                                                                                
                                                                                
                                                                                
    at 
org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField.applyChange(PDTerminalField.java:209)
                                                                                
                                                                                
                                                                                
                                                                                
     at 
org.apache.pdfbox.pdmodel.interactive.form.PDTextField.setValue(PDTextField.java:218)
                                                                                
                                                                                
                                                                                
                                                                                
                at 
org.apache.pdfbox.pdmodel.interactive.form.PDField.importFDF(PDField.java:250)  
                                                                                
                                                                                
                                                                                
                                                                                
                     at 
org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField.importFDF(PDTerminalField.java:101)
                                                                                
                                                                                
                                                                                
                                                                                
       at 
org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm.importFDF(PDAcroForm.java:139)
                                                                                
                                                                                
                                                                                
                                                                                
                 at 
org.apache.pdfbox.tools.ImportFDF.importFDF(ImportFDF.java:73)                  
                                                                                
                                                                                
                                                                                
                                                                                
                     at 
org.apache.pdfbox.tools.ImportXFDF.call(ImportXFDF.java:96)                     
                                                                                
                                                                                
                                                                                
                                                                                
                     at 
org.apache.pdfbox.tools.ImportXFDF.call(ImportXFDF.java:41)                     
                                                                                
                                                                                
                                                                                
                                                                                
                     at 
picocli.CommandLine.executeUserObject(CommandLine.java:2041)                    
                                                                                
                                                                                
                                                                                
                                                                                
                     at picocli.CommandLine.access$1500(CommandLine.java:148)   
                                                                                
                                                                                
                                                                                
                                                                                
                                             at 
picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2461)
                                                                                
                                                                                
                                                                                
                                                                                
   at picocli.CommandLine$RunLast.handle(CommandLine.java:2453)                 
                                                                                
                                                                                
                                                                                
                                                                                
                           at 
picocli.CommandLine$RunLast.handle(CommandLine.java:2415)                       
                                                                                
                                                                                
                                                                                
                                                                                
                     at 
picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2273)   
                                                                                
                                                                                
                                                                                
                                                                                
                     at 
picocli.CommandLine$RunLast.execute(CommandLine.java:2417)                      
                                                                                
                                                                                
                                                                                
                                                                                
                     at picocli.CommandLine.execute(CommandLine.java:2170)      
                                                                                
                                                                                
                                                                                
                                                                                
                                             at 
org.apache.pdfbox.tools.PDFBox.main(PDFBox.java:77)                             
     

> Acroform international (czech) characters can't be written to the textfields
> ----------------------------------------------------------------------------
>
>                 Key: PDFBOX-5686
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-5686
>             Project: PDFBox
>          Issue Type: Bug
>          Components: AcroForm
>    Affects Versions: 3.0.0 PDFBox
>         Environment: Windows 11,  JDK 14
>            Reporter: Břetislav Černík
>            Priority: Major
>         Attachments: ZK.pdf, ZK_BAD.XFDF, ZK_Ok.XFDF
>
>
> I try use the ImportXFDF.java but it does not work for the czech characters 
> in the xfdf file.
> The error is
> Exception in thread "main" java.lang.IllegalArgumentException: U+0159 is not 
> available in this font's encoding: WinAnsiEncoding
>     at 
> org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.encode(PDTrueTypeFont.java:404)
>     at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:337)
>     at org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:368)
>     at 
> org.apache.pdfbox.pdmodel.interactive.form.PlainText$Paragraph.getLines(PlainText.java:178)
>     at 
> org.apache.pdfbox.pdmodel.interactive.form.PlainTextFormatter.format(PlainTextFormatter.java:182)
>     at 
> org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.insertGeneratedAppearance(AppearanceGeneratorHelper.java:609)
>     at 
> org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceContent(AppearanceGeneratorHelper.java:443)
>     at 
> org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceValue(AppearanceGeneratorHelper.java:259)
>     at 
> org.apache.pdfbox.pdmodel.interactive.form.PDTextField.constructAppearances(PDTextField.java:262)
>     at 
> org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField.applyChange(PDTerminalField.java:209)
>     at 
> org.apache.pdfbox.pdmodel.interactive.form.PDTextField.setValue(PDTextField.java:218)
>     at formpdf.ImportXFDF.lambda$setFont$0(ImportXFDF.java:194)
>     at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
>     at formpdf.ImportXFDF.setFont(ImportXFDF.java:178)
>     at formpdf.ImportXFDF.importXFDF(ImportXFDF.java:137)
>     at Test.TestFormPDF(Test.java:23)
>     at Test.main(Test.java:18)
>  
> I try to set the TTF Unicode font for every textfields but the same error is 
> generated.
> There are test code from modified ImportXFDF. I use the method importXFDF
> package formpdf;
> //import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
> import java.io.BufferedOutputStream;
> import java.io.IOException;
> import java.io.InputStream;
> import java.io.OutputStream;
> import java.io.OutputStreamWriter;
> import java.io.UncheckedIOException;
> import java.io.File;
> import java.util.Iterator;
> import static org.apache.pdfbox.cos.COSName.Off;
> import org.apache.pdfbox.cos.COSName;
> import org.apache.pdfbox.pdmodel.PDDocument;
> import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
> import org.apache.pdfbox.pdmodel.PDResources;
> import org.apache.pdfbox.pdmodel.fdf.FDFDocument;
> import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
> import org.apache.pdfbox.pdmodel.interactive.form.PDCheckBox;
> import org.apache.pdfbox.pdmodel.interactive.form.PDComboBox;
> import org.apache.pdfbox.pdmodel.interactive.form.PDField;
> import org.apache.pdfbox.pdmodel.interactive.form.PDListBox;
> import org.apache.pdfbox.pdmodel.interactive.form.PDRadioButton;
> import org.apache.pdfbox.pdmodel.interactive.form.PDTextField;
> import org.apache.pdfbox.Loader;
> import org.apache.pdfbox.pdmodel.font.PDFont;
> import org.apache.pdfbox.pdmodel.font.PDType0Font;
> import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
> import org.apache.pdfbox.pdmodel.font.encoding.Encoding;
> import org.apache.pdfbox.pdmodel.font.encoding.StandardEncoding;
> import org.apache.pdfbox.pdmodel.font.encoding.WinAnsiEncoding;
> import org.apache.pdfbox.pdmodel.font.encoding.GlyphList;
> import org.apache.pdfbox.cos.COSBase;
> import org.apache.pdfbox.cos.COSName;
> import org.apache.fontbox.ttf.TrueTypeFont;
> public class ImportXFDF 
> {
>    /**
>     * @param ac_PDFDocument
>     * @param ac_XFDFData
>     * @param ac_PDFResult
>     * @param ab_clearFields
>     * @throws IOException
>     */
>    public static void importXFDF
>    (
>       InputStream ac_PDFDocument, 
>       InputStream ac_XFDFData, 
>       OutputStream ac_PDFResult, 
>       boolean ab_clearFields,
>       boolean ab_RemoveFields
>    ) throws IOException
>     {
>         PDDocument 
>            lc_PDDDocument = null;
>          String   ls_FontName = "ArialMT";
> //         MyEncoding
> //            lc_Encoding;
> //         lc_Encoding = new MyEncoding();
> //         lc_Encoding.addChar( 0x0159, "rcaron" );
>          try 
>          {
>             lc_PDDDocument = Loader.loadPDF( ac_PDFDocument.readAllBytes() ); 
> //PDDocument.load( ac_PDFDocument);
>    
>          }
>          catch (IOException  ex) 
>          {
>             throw new IOException("Error while reading pdf", ex);
>          }
>    
>    
>          FDFDocument fdfDocument = null;
>          try 
>          {
>    //            fdfDocument =  FDFDocument.loadXFDF( ac_XFDFData);
>            fdfDocument =  Loader.loadXFDF( ac_XFDFData);
>          } 
>          catch (IOException ex)
>          {
>             throw new IOException("Error while reading xfdf file", ex);
>          }
>          PDDocumentCatalog docCatalog = lc_PDDDocument.getDocumentCatalog();
>          PDAcroForm acroForm = docCatalog.getAcroForm();
>          if(acroForm == null){
>             throw new IOException("Internal Error with acroform");
>          }
>          PDResources formResources = acroForm.getDefaultResources();
> //         PDTrueTypeFont lc_Arial = (PDTrueTypeFont) 
> formResources.getFont(COSName.getPDFName( "Arial" ));
> //         TrueTypeFont   lc_ArialTTF = lc_Arial.getTrueTypeFont();
> //         PDFont lc_ArialNew = PDType0Font.load( lc_PDDDocument, 
> lc_ArialTTF, true);
> //         lc_ArialTTF.close();
>        
> //        PDFont lc_Arial = PDTrueTypeFont.load( lc_PDDDocument, new 
> File("C:\\Windows\\Fonts\\arial.ttf"),lc_Encoding );
>          PDFont lc_Arial = PDType0Font.load( lc_PDDDocument, new 
> File("C:\\Windows\\Fonts\\arial.ttf") );
> //         lc_Arial.addToSubset( 0x0159 );
> //         lc_Arial.subset();
> //        PDFont lc_ArialB = PDTrueTypeFont.load( lc_PDDDocument, new 
> File("C:\\Windows\\Fonts\\arialbd.ttf"), lc_Encoding );
> //       PDFont lc_CourNB = PDTrueTypeFont.load( lc_PDDDocument, new 
> File("C:\\Windows\\Fonts\\courbd.ttf"), lc_Encoding );
> //         formResources.put( COSName.getPDFName( ls_FontName ), lc_ArialNew 
> );
>         ls_FontName = formResources.add(lc_Arial).getName();
>          System.out.println( ls_FontName );
> //       formResources.add(lc_ArialB);
> //       formResources.add(lc_CourNB);
>          System.out.println( formResources.getFontNames());
>          acroForm.setDefaultAppearance( String.format("/%s 0 Tf 0 g", 
> ls_FontName  ));
> //        PDFont lc_font = PDType0Font.load(lc_PDDDocument, new 
> File("C://Windows/Fonts/arial.ttf"));
> //        formResources.put(COSName.getPDFName("Arial"), lc_font);
> //        formResources.add(lc_font);
> //        System.out.println( formResources.getFontNames());
> //        acroForm.setDefaultResources(formResources);
> //        acroForm.setDefaultAppearance("/Arial 0 Tf 0 g");
> //        System.out.println( acroForm.getDefaultAppearance());
>         acroForm.setCacheFields( true );
>         if (ab_clearFields) {
>             try 
>             {
>                 ClearFileds(acroForm.getFieldIterator());
>             } 
>             catch (UncheckedIOException ex) 
>             {
>                 throw new IOException("Error during clearing field forms", 
> ex);
>             }
>         }
> /*
> */
>         acroForm.setNeedAppearances( true );
>          setFont(acroForm.getFieldIterator(), ls_FontName );
>         acroForm.setNeedAppearances( true );
>         try 
>         {
>             acroForm.importFDF(fdfDocument);
>         } 
>         catch (IOException ex)
>         {
>             throw new IOException("Error while importing data", ex);
>         }
>        acroForm.setNeedAppearances(true);
>         if ( ab_RemoveFields )
>         {
>            acroForm.setNeedAppearances(false);
>            try
>            {
>               acroForm.refreshAppearances();
>            }
>            catch (IOException e )
>            {
>                throw new IOException( "Chyba při obnově vzhledu", e );
>            }
>          System.out.println( "Flatten" );
>            acroForm.flatten();
>         }
>         // konec úpravy aby ukazoval správn? vzhled
>         try
>         {
>             lc_PDDDocument.save(new BufferedOutputStream( ac_PDFResult ));
>         } 
>         catch(IOException ex)
>         {
>             throw new IOException("Error while saving to pdf", ex);
>         }
>     }
>    private static void setFont(Iterator<PDField> ac_FieldIterator, String 
> as_FontName ) throws UncheckedIOException
>    {
>      ac_FieldIterator.forEachRemaining
>      (
>         (field) ->
>         {
>             if (field instanceof PDTextField)
>             {
> //                    System.out.println(((PDTextField) 
> field).getDefaultAppearance());
> //                    ((PDTextField) field).setDefaultAppearance("/F19 0 Tf 0 
> g");
>                 ((PDTextField)field).setDefaultAppearance( String.format("/%s 
> 0 Tf 0 g", as_FontName  ));
>             System.out.println( field.getFullyQualifiedName() + ": " + 
> ((PDTextField)field).getDefaultAppearance() + " to " + String.format("/%s 10 
> Tf 0 g", as_FontName  ) );
>             try
>             {
>                   if (field.getFullyQualifiedName()=="PL_NAZEV" )
>                   {}
>                else
>                ((PDTextField) field).setValue("\u0159" ); //Příliš žluťoučký 
> kůň úpěl ďábelské ódy");
>             }
>             catch (IOException e)
>             {
>                throw new UncheckedIOException( e );
>             }
>          }
>         }
>      );
>    }
>     private static void ClearFileds(Iterator<PDField> ac_FieldIterator) 
> throws UncheckedIOException
>     {
>       ac_FieldIterator.forEachRemaining
>       (
>          (field) ->
>          {
>             try {
>                 if (field instanceof PDCheckBox)
>                 {
>                     ((PDCheckBox) field).unCheck();
>                 }
>                 else if (field instanceof PDComboBox)
>                 {
>                     field.setValue(Off.getName());
>                 }
>                 else if (field instanceof PDListBox)
>                 {
>                     field.setValue(Off.getName());
>                 }
>                 else if (field instanceof PDRadioButton)
>                 {
>                     field.setValue(Off.getName());
>                 }
>                 else if (field instanceof PDTextField)
>                 {
> //                    System.out.println(((PDTextField) 
> field).getDefaultAppearance());
> //                    ((PDTextField) field).setDefaultAppearance("/F19 0 Tf 0 
> g");
>                     field.setValue("");
>                 }
>             } 
>             catch (IOException ex )
>             {
>                 throw new UncheckedIOException(ex);
>             }
>          }
>       );
>     }
>    /**
>     * @param ac_PDFDocument
>     * @param ac_XFDFData
>     * @throws IOException
>     */
>    public static void exportXFDF(InputStream ac_PDFDocument, OutputStream 
> ac_XFDFData )
>             throws IOException
>     {
>        OutputStreamWriter outputStreamWriter = new 
> OutputStreamWriter(ac_XFDFData);
>        PDDocumentCatalog lc_pdDocumentDocumentCatalog;
>        PDDocument lc_pdDocument = null;
>        PDAcroForm lc_acroForm;
>         try {
> //            lc_pdDocument = PDDocument.load(ac_PDFDocument);
>            lc_pdDocument = Loader.loadPDF( ac_PDFDocument.readAllBytes());
>         }
>         catch (IOException  ex)
>         {
>             throw new IOException("Error while reading pdf", ex);
>         }
>       lc_pdDocumentDocumentCatalog = lc_pdDocument.getDocumentCatalog();
>       lc_acroForm = lc_pdDocumentDocumentCatalog.getAcroForm();
>       FDFDocument lc_fdfDocument = null;
>         try {
>             lc_fdfDocument = lc_acroForm.exportFDF();
>         }catch(IOException ex){
>             throw new IOException("Error while exporting fdf", ex);
>         }
>         try{
>             lc_fdfDocument.saveXFDF(outputStreamWriter);
>         } catch (IOException ex){
>             throw new IOException("Error during saving XFDF",ex);
>         }
>     }
> }
>  
> The acroForm.setNeedAppearances( true ) is not usable for the final output. 
> It is not suported in the some viewers I.e. apple tablets
> Best regards
>  Břetislav Černík
>  [email protected]



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to