Here’s code that works: after the page has been rotated by 90 degrees, the 
field’s contents appear vertical, as expected.

There’s a glitch, though:

templateAcroForm.getField("field0")

returns null

which is why I use

final PDField templateField0 = templatePdfFields.get(0);

instead, to retrieve the field from the form.

I am not sure why the field is null in the first case.

Philippe


————————————

public class App {

        final static File TEMPLATE_FOLDER = new 
File("/Users/philippe/templates");
        final static File RESULT_FOLDER = new File("/Users/philippe/results");
        
    public static void main( String[] args ) {
                new App();
    }
    
    public App() {
                try {
                        testGeneratedTemplate();
                        } catch (COSVisitorException e) {
                                
                                e.printStackTrace();
                        } catch (IOException e) {
                                
                                e.printStackTrace();
                        }
    }


——————————————————

 public void testGeneratedTemplate() throws COSVisitorException, IOException {
        
          final byte[] generatedTemplate = generateSimpleTemplate();
          final PDDocument templateDoc = new PDDocument().load(new 
ByteArrayInputStream(generatedTemplate));
          Files.write(new File(TEMPLATE_FOLDER,  "template.pdf").toPath(), 
generatedTemplate);
          
        final PDDocument finalDoc = new PDDocument();
        final List<PDField> fields = new ArrayList<PDField>();
        final int numberOfPages = 2;
        final float inch = 72;
        final float borderThickness = inch / 48f;
        final float distanceFromField = inch / 2f;
        
        for (int i = 0; i < numberOfPages; ++i) {
                        final PDDocumentCatalog templateDocCatalog = 
templateDoc.getDocumentCatalog();
                final PDAcroForm templateAcroForm = 
templateDocCatalog.getAcroForm();

            //final PDField templateField0 = 
templateAcroForm.getField("field0");
                final PDField templateField0 = templatePdfFields.get(0);
            if (templateField0 != null) {
                                templateField0.setValue("xxx" + i);
                                templateField0.setPartialName("field0-" + i);
                                templateField0.setReadonly(true);
                                 final List<PDPage> pages = (List<PDPage>) 
templateDocCatalog.getAllPages();
                                 PDPage page = pages.get(0);
                                 finalDoc.addPage(page);  
                      fields.add(templateField0);
            }
        }

        final PDAcroForm finalForm = new PDAcroForm(finalDoc);
        finalDoc.getDocumentCatalog().setAcroForm(finalForm);
        finalForm.setFields(fields);      
        
        finalDoc.save(new File(RESULT_FOLDER, "form-two-templates.pdf"));
        templateDoc.close();
        
       finalDoc.close();
        
        
    }

——————————————————







> Le 25 avr. 2015 à 18:08, Tilman Hausherr <thaush...@t-online.de> a écrit :
> 
> Hi,
> 
> Code doesn't work.
> 
> getTwelveFontSize, getTwentyFourFontSize, getEightyFieldWidth, 
> getTwelveDefaultAppearance, getSeventyFieldWidth are missing. And there is no 
> main class (although it seems that one would just instanciate the class)
> 
> Tilman
> 
> Am 24.04.2015 um 09:41 schrieb phi...@free.fr:
>> Hi Tilman,
>> 
>> there's no need to change the coordinate values.
>> 
>> I must have made a mistake in my original code.
>> 
>> If you comment out setRotation() below, the page will be portraited. If you 
>> leave setRotation(), it will be landscaped.
>> 
>> In both cases, the fields will be in the right direction.
>> 
>> Thanks for your input.
>> 
>> Best regards,
>> 
>> Philippe
>> 
>> -------------------------------------------------------------------------------------------
>> 
>> 
>> 
>> public class PdfTemplate0 {
>> 
>>      protected final int             twelveFontSize                          
>>         = 12;
>>      protected final int             twentyFourFontSize                      
>>         = 24;
>> 
>>      protected final float   fortyFieldWidth                                 
>> = 40f;
>>      protected final float   seventyFieldWidth                               
>> = 70f;
>>      protected final float   eightyFieldWidth                                
>> = 80f;
>>      protected final float   oneHundredSixtyFieldWidth               = 160f;
>>      protected final float   threeHundredFiftyFieldWidth             = 350f;
>>      protected final float   threeHundredEightyFieldWidth    = 380f;
>>      protected final float   fourHundredFieldWidth                   = 400f;
>> 
>>      protected String                twelveDefaultAppearance;
>>      protected String                twentyFourDefaultAppearance;
>> 
>>      public PdfTemplate0() {
>> 
>>              final String RESULTS_FOLDER = 
>> "D:\\dev\\ProjectData\\fillbundlelabelformData\\pdf";
>>              try {
>>                      byte[] template = generateSimpleTemplate(false);
>>                      Files.write(new File(RESULTS_FOLDER, 
>> "template.pdf").toPath(), template);
>> 
>>              } catch (COSVisitorException e) {
>>                      e.printStackTrace();
>>              } catch (IOException e) {
>>                      e.printStackTrace();
>>              }
>>      }
>> 
>>      /* ***************************************************************** */
>> 
>>      byte[] generateSimpleTemplate(final boolean addBarcode) throws 
>> IOException, COSVisitorException {
>> 
>>              final PDDocument template = new PDDocument();
>>              final ByteArrayOutputStream resultStream = new 
>> ByteArrayOutputStream();
>> 
>>              final PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
>>              page.setRotation(90);
>>              template.addPage(page);
>> 
>>              final PDFont font = PDType1Font.HELVETICA;
>>              PDAcroForm acroForm = acroForm = new PDAcroForm(template);
>> 
>>              final String fontName = setFontFormAndResources(acroForm, font, 
>> template);
>> 
>>              
>> setTwelveDefaultAppearance(setPdfDefaultAppearance(Integer.toString(getTwelveFontSize()),
>>  fontName));
>>              
>> setTwentyFourDefaultAppearance(setPdfDefaultAppearance(Integer.toString(getTwentyFourFontSize()),
>>  fontName));
>> 
>>              createReportLineOne(page, acroForm);
>>              
>> 
>>              template.save(resultStream);
>>              return resultStream.toByteArray();
>> 
>>      } // end generateSimpleTemplate
>> 
>>      /* 
>> ********************************************************************* */
>> 
>>      protected void generateTemplatePdf(final String 
>> pathToGeneratedPdfDirectory) throws COSVisitorException, IOException {
>> 
>>              final byte[] templateWithoutBarcode = 
>> generateSimpleTemplate(false);
>>              final byte[] templateWithBarcode = generateSimpleTemplate(true);
>> 
>>              final PDDocument finalDoc0 = new PDDocument();
>>              final PDDocument finalDoc1 = new PDDocument();
>> 
>>              final PDDocument doc0 = PDDocument.load(new 
>> ByteArrayInputStream(templateWithoutBarcode));
>>              final PDDocument doc1 = PDDocument.load(new 
>> ByteArrayInputStream(templateWithBarcode));
>> 
>>              doc0.save(pathToGeneratedPdfDirectory + File.separator + 
>> "templateWithoutBarcode.pdf");
>>              doc1.save(pathToGeneratedPdfDirectory + File.separator + 
>> "templateWithBarcode.pdf");
>> 
>>              finalDoc0.close();
>>              finalDoc1.close();
>> 
>>      } // end generateTemplatePdf
>> 
>>      /* 
>> ************************************************************************** */
>> 
>>      protected COSDictionary createPdfCosDict(final float leftX, final float 
>> bottomY, final float rightX, final float topY, final String da) {
>> 
>>              final COSDictionary cosDict = new COSDictionary();
>> 
>>              final COSArray rect = new COSArray();
>> 
>>              // x and y start in the lower left
>>              rect.add(new COSFloat(leftX)); // left x boundary
>>              rect.add(new COSFloat(bottomY)); // bottom y boundary
>>              rect.add(new COSFloat(rightX)); // right x boundary
>>              rect.add(new COSFloat(topY)); // top y boundary
>> 
>>              cosDict.setItem(COSName.RECT, rect);
>>              cosDict.setItem(COSName.FT, COSName.getPDFName("Tx")); // Field 
>> Type
>>              cosDict.setItem(COSName.TYPE, COSName.ANNOT);
>>              cosDict.setItem(COSName.SUBTYPE, COSName.getPDFName("Widget"));
>>              cosDict.setItem(COSName.DA, new COSString(da));
>> 
>>              return cosDict;
>> 
>>      }
>> 
>>      /* 
>> ********************************************************************* */
>> 
>>      protected void createPdfTextbox(PDPage pDPage, PDAcroForm acroForm, 
>> final float leftX, final float bottomY, final float rightX, final float topY,
>>                      final String defaultAppearanceString, final String 
>> textboxPartialName, final String textboxValue) throws IOException {
>> 
>>              final COSDictionary cosDictionary = createPdfCosDict(leftX, 
>> bottomY, rightX, topY, defaultAppearanceString);
>> 
>>              // add a form field to the form
>>              final PDTextbox textbox = new PDTextbox(acroForm, 
>> cosDictionary);
>>              textbox.setPartialName(textboxPartialName);
>> 
>>              ((List<PDField>) acroForm.getFields()).add(textbox);
>> 
>>              // specify the annotation associated with the field
>>              // and add it to the page
>>              final PDAnnotationWidget widget = textbox.getWidget();
>>              pDPage.getAnnotations().add(widget);
>> 
>>              textbox.setValue(textboxValue);
>> 
>>      }
>> 
>>      /* 
>> ********************************************************************* */
>> 
>>      protected String setPdfDefaultAppearance(final String fontSize, final 
>> String fontName) {
>> 
>>              final String defAp = "/" + fontName + " " + fontSize + " Tf 0 
>> g";
>>              return defAp;
>> 
>>      }
>> 
>>      /* 
>> ********************************************************************* */
>> 
>>      protected String setFontFormAndResources(final PDAcroForm acroForm, 
>> PDFont font, PDDocument template) {
>> 
>>              template.getDocumentCatalog().setAcroForm(acroForm);
>> 
>>              // Add and set the resources and default appearance
>>              final PDResources res = new PDResources();
>>              final String fontName = res.addFont(font);
>>              acroForm.setDefaultResources(res);
>> 
>>              return fontName;
>> 
>>      }
>> 
>>      /* 
>> ********************************************************************* */
>> 
>>      protected void createReportLineOne(PDPage page, PDAcroForm acroForm) 
>> throws IOException {
>> 
>>              // leftX, bottomY, rightX, topY
>>              createPdfTextbox(page, acroForm, 20f, 770f, 
>> getEightyFieldWidth() + 20f, 800f, getTwelveDefaultAppearance(), 
>> "DATDELIVRY", "21 MAR 2015");
>>              createPdfTextbox(page, acroForm, 110f, 770f, 
>> getSeventyFieldWidth() + 110f, 800f, getTwelveDefaultAppearance(), 
>> "DLVROUTE.CODDLVMANI", "VAN4");
>>              createPdfTextbox(page, acroForm, 190f, 770f, 
>> getSeventyFieldWidth() + 190f, 800f, getTwelveDefaultAppearance(), 
>> "DLVROUTE.CODDLVDROP",
>>                              "10095");
>>              createPdfTextbox(page, acroForm, 270f, 770f, 
>> getSeventyFieldWidth() + 270f, 800f, getTwelveDefaultAppearance(), 
>> "BUNDLEPOSI", "1");
>>              createPdfTextbox(page, acroForm, 350f, 770f, 
>> getSeventyFieldWidth() + 350f, 800f, getTwelveDefaultAppearance(), 
>> "NBRBUNDLES", "1");
>>              createPdfTextbox(page, acroForm, 430f, 770f, 
>> getSeventyFieldWidth() + 430f, 800f, getTwelveDefaultAppearance(), 
>> "QUANTITCOP", "3");
>>              createPdfTextbox(page, acroForm, 510f, 770f, 
>> getSeventyFieldWidth() + 510f, 800f, getTwelveDefaultAppearance(), 
>> "QTYPRINTED", "3");
>> 
>>      }
>> ...
>> 
>> 
>> -------------------------------------------------------------------------------------------
>> 
>> 
>> 
>> ----- Mail original -----
>> De: "Tilman Hausherr" <thaush...@t-online.de>
>> À: users@pdfbox.apache.org
>> Envoyé: Mercredi 22 Avril 2015 23:09:15
>> Objet: Re: Rotate text
>> 
>> I found this in the PDF spec for BBox:
>> /
>> //A rectangle in default user space coordinates specifying the location
>> of the viewport on the page.//
>> //The two coordinate pairs of the rectangle shall be specified in
>> normalized form; that is, lower-left followed by upper-right, relative
>> to the measuring coordinate system. This ordering shall determine the
>> orientation of the measuring coordinate system (that is, the direction
>> of the positive x and yaxes) in this viewport, which may have a
>> different rotation from the page./
>> 
>> 
>> So my understanding is that instead of 0,0,100,100 you should try e.g.
>> 0,100,100,0 or 100,0,0,100 for the BBox.
>> 
>> I didn't test it myself because your code isn't complete. Please tell
>> whether it worked or not.
>> 
>> Tilman
>> 
>> 
>> Am 22.04.2015 um 10:39 schrieb phi...@free.fr:
>>> Hello,
>>> 
>>> when I generate the PDF using this method, the page is landscaped but not 
>>> the input field text.
>>> 
>>> How do I rotate the text?
>>> 
>>> Many thanks.
>>> 
>>> Philippe
>>> 
>>> ----------------------------------
>>> 
>>>     byte[] generateSimpleTemplate() throws IOException, COSVisitorException 
>>> {
>>> 
>>>             try (PDDocument template = new PDDocument();
>>>                             InputStream fontStream = 
>>> getClass().getResourceAsStream("/META-INF/fonts/arial.ttf");
>>>                             ByteArrayOutputStream resultStream = new 
>>> ByteArrayOutputStream()) {
>>>                     final PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
>>>                     page.setRotation(90);
>>>                     template.addPage(page);
>>> 
>>>                     final PDTrueTypeFont font = 
>>> PDTrueTypeFont.loadTTF(template, fontStream);
>>> 
>>>                     // add a new AcroForm and add that to the document
>>>                     final PDAcroForm acroForm = new PDAcroForm(template);
>>>                     template.getDocumentCatalog().setAcroForm(acroForm);
>>> 
>>>                     // Add and set the resources and default appearance
>>>                     final PDResources res = new PDResources();
>>>                     final String fontName = res.addFont(font);
>>>                     acroForm.setDefaultResources(res);
>>>                     final String da = "/" + fontName + " 12 Tf 0 g";
>>> 
>>>                     final COSDictionary cosDict = new COSDictionary();
>>> 
>>>                     final COSArray rect = new COSArray();
>>> 
>>>                     rect.add(new COSFloat(0f)); // lower x boundary
>>>                     rect.add(new COSFloat(0f)); // lower y boundary
>>>                     rect.add(new COSFloat(100f)); // upper x boundary
>>>                     rect.add(new COSFloat(100f)); // upper y boundary
>>> 
>>>                     cosDict.setItem(COSName.RECT, rect);
>>>                     cosDict.setItem(COSName.FT, COSName.getPDFName("Tx")); 
>>> // Field Type
>>>                     cosDict.setItem(COSName.TYPE, COSName.ANNOT);
>>>                     cosDict.setItem(COSName.SUBTYPE, 
>>> COSName.getPDFName("Widget"));
>>>                     cosDict.setItem(COSName.DA, new COSString(da));
>>> 
>>>                     // add a form field to the form
>>>                     final PDTextbox textBox = new PDTextbox(acroForm, 
>>> cosDict);
>>>                     textBox.setPartialName("SampleField");
>>> 
>>> ---------------------------------------
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscr...@pdfbox.apache.org
>>> For additional commands, e-mail: users-h...@pdfbox.apache.org
>>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@pdfbox.apache.org
>> For additional commands, e-mail: users-h...@pdfbox.apache.org
>> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@pdfbox.apache.org
> For additional commands, e-mail: users-h...@pdfbox.apache.org
> 

Reply via email to