Hi Kevin, > Am 21.09.2015 um 20:37 schrieb Kevin Ternes <[email protected]>: > > Maruan, > > I finally got back around to trying this new flatten method out. It works > fantastic as far as preserving the appearance of the fields. > However, if I flatten before a merge, I am still losing data entered into > fields.
could you be a little more specific? Do you have a sample form? Is the data visible before the form is flattened, in which application? BR Maruan > > > -----Original Message----- > From: Maruan Sahyoun [mailto:[email protected]] > Sent: Tuesday, September 15, 2015 4:15 AM > To: [email protected] > Subject: Re: How flatten without changing appearance > > Hi, >> Am 15.09.2015 um 09:06 schrieb Tilman Hausherr <[email protected]>: >> >> Am 15.09.2015 um 09:02 schrieb Maruan Sahyoun: >>>> Am 15.09.2015 um 08:56 schrieb Tilman Hausherr <[email protected]>: >>>> >>>> Am 15.09.2015 um 08:48 schrieb Maruan Sahyoun: >>>>> Hi Tilman, >>>>> >>>>>> Am 15.09.2015 um 08:17 schrieb Tilman Hausherr <[email protected]>: >>>>>> >>>>>> Am 15.09.2015 um 04:47 schrieb Maruan Sahyoun: >>>>>>> Hi Kevin, >>>>>>> >>>>>>> I've created https://issues.apache.org/jira/browse/PDFBOX-2970 >>>>>>> <https://issues.apache.org/jira/browse/PDFBOX-2970> for that. >>>>>>> >>>>>>> In addition you can start playing with that code based on the current >>>>>>> PDFBox 2.0.0 snapshot. >>>>>>> >>>>>>> >>>>>>> >>>>>>> PDDocument doc = PDDocument.load(new File(...)); >>>>>>> PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm(); >>>>>>> // Iterate over all form fields and their widgets and >>>>>>> create a >>>>>>> // FormXObject at the page content level from that >>>>>>> for (PDField field : acroForm.getFieldTree()) >>>>>>> { >>>>>>> for (PDAnnotationWidget widget : >>>>>>> ((PDTerminalField)field).getWidgets()) >>>>>>> { >>>>>>> PDPage page = widget.getPage(); >>>>>>> PDPageContentStream contentStream = new >>>>>>> PDPageContentStream(doc, page, true, true); >>>>>> I wasn't 100% sure what was meant with "flatten", but now I get it! >>>>>> >>>>>> I think the first one of the "new PDPageContentStream" should have the >>>>>> fifth parameter and be true, in case the existing content stream isn't >>>>>> included in q...Q. >>>>> thanks for stepping in. >>>>> >>>>> Is that really needed as we are storing/restoring the current state >>>>> before the new content is added. Putting a store/restore around the >>>>> existing one - assuming there is only one - would store/restore to the >>>>> state before there was any content stream. In addition if there are >>>>> already multiple streams before the new one would we need to put a >>>>> store/restore around each of them? If there wasn't any that would >>>>> potentially change the behavior of the old processing? >>>> The constructor identifies if there is already content, and only then, it >>>> inserts a saveGraphicsState() before the first existing stream and a >>>> restoreGraphicsState() at the end of the new one, so it work both with >>>> none, one, and many. >>>> >>>> Only doing it for the first one is to avoid having too many nesting >>>> q...Q >>> looking at how Adobe does it each of the new content streams is wrapped in >>> a q ...Q - that's why I did the same. >> >> That isn't what I meant. I meant that only the first one should be >> >> PDPageContentStream contentStream = new PDPageContentStream(doc, page, >> true, true, true); >> >> instead of >> >> PDPageContentStream contentStream = new PDPageContentStream(doc, page, >> true, true); >> >> all the rest is fine as it is. >> > > done - thanks for the clarification. > Maruan > >> >> Tilman >> >> >> >>> >>>> What I was thinking of is cases where the existing content stream(s) >>>> modifies the CTM without resetting it. This would have the effect that the >>>> "fields" would appear at the wrong place / wrong size / outside of the >>>> screen. We're having this every few months that somebody wants to add a >>>> stamp to a page, it works for most, except for one "special" file. >>>> >>>> Tilman >>>> >>>> >>>>> BR >>>>> Maruan >>>>> >>>>> >>>>> >>>>>> Tilman >>>>>> >>>>>>> PDFormXObject fieldObject = new >>>>>>> PDFormXObject(widget.getAppearance().getNormalAppearance().getAppearanceStream().getCOSStream()); >>>>>>> Matrix translationMatrix = >>>>>>> Matrix.getTranslateInstance(widget.getRectangle().getLowerLeftX(), >>>>>>> widget.getRectangle().getLowerLeftY()); >>>>>>> contentStream.saveGraphicsState(); >>>>>>> contentStream.transform(translationMatrix); >>>>>>> contentStream.drawForm(fieldObject); >>>>>>> contentStream.restoreGraphicsState(); >>>>>>> contentStream.close(); >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> // preserve all non widget annotations >>>>>>> for (PDPage page : doc.getPages()) >>>>>>> { >>>>>>> List<PDAnnotation> annotations = new >>>>>>> ArrayList<PDAnnotation>(); >>>>>>> for (PDAnnotation annotation: >>>>>>> page.getAnnotations()) >>>>>>> { >>>>>>> if (!(annotation instanceof PDAnnotationWidget)) >>>>>>> { >>>>>>> annotations.add(annotation); >>>>>>> } >>>>>>> } >>>>>>> page.setAnnotations(annotations); >>>>>>> } >>>>>>> // remove the fields >>>>>>> acroForm.setFields(Collections.<PDField>emptyList()); >>>>>>> doc.save(...); >>>>>>> doc.close(); >>>>>>> >>>>>>> >>>>>>> BR >>>>>>> Maruan >>>>>>> >>>>>>> >>>>>>> >>>>>>>> Am 14.09.2015 um 17:57 schrieb Maruan Sahyoun <[email protected]>: >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> Am 14.09.2015 um 16:53 schrieb Kevin Ternes <[email protected]>: >>>>>>>>> >>>>>>>>> I am trying to refactor for 2.0.0-SNAPSHOT now. >>>>>>>>> >>>>>>>>> Can someone tell me how to flatten a PDDocument in PDFBox 2 ? >>>>>>>>> All the examples seem to pertain to v1.x >>>>>>>> there are non but I've started to get that into the project >>>>>>>> >>>>>>>>> -----Original Message----- >>>>>>>>> From: Maruan Sahyoun [mailto:[email protected]] >>>>>>>>> Sent: Saturday, September 12, 2015 1:55 AM >>>>>>>>> To: [email protected] >>>>>>>>> Subject: Re: How flatten without changing appearance >>>>>>>>> >>>>>>>>> Hi, >>>>>>>>> >>>>>>>>>> Am 12.09.2015 um 00:08 schrieb Kevin Ternes <[email protected]>: >>>>>>>>>> >>>>>>>>>> Maruan, >>>>>>>>>> That would be great. Please have a look at: >>>>>>>>>> https://onedrive.live.com/redir?resid=9CCA324BE57ADA7!76929&au >>>>>>>>>> thkey=!A KE0x0fh5QDkIIw&ithint=file%2czip This should >>>>>>>>>> demonstrate the problem by processing several files. >>>>>>>>> I took a quick look. Which version of PDFBox are you using? Would it >>>>>>>>> be possible to go to (the yet to be released) 2.0.0 version? >>>>>>>>> >>>>>>>>> BR >>>>>>>>> Maruan >>>>>>>>> >>>>>>>>> >>>>>>>>>> The users complaint is: Boxes are being greyed out and font sizes >>>>>>>>>> are being changed by the flatten. >>>>>>>>>> My flatten is done by the PDFBoxUtils.flatten() method. >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> -Kevin >>>>>>>>>> >>>>>>>>>> -----Original Message----- >>>>>>>>>> From: Maruan Sahyoun [mailto:[email protected]] >>>>>>>>>> Sent: Friday, September 11, 2015 12:17 PM >>>>>>>>>> To: [email protected] >>>>>>>>>> Subject: Re: How to merge forms where there is >>>>>>>>>> >>>>>>>>>> how urgent is it for you? If you could share a sample file and your >>>>>>>>>> code for flattening I could take a look. >>>>>>>>>> >>>>>>>>>> BR >>>>>>>>>> Maruan >>>>>>>>>> >>>>>>>>>>> Am 11.09.2015 um 18:23 schrieb Kevin Ternes >>>>>>>>>>> <[email protected]>: >>>>>>>>>>> >>>>>>>>>>> I have not been able to successfully flatten a document without >>>>>>>>>>> affecting the formatting of the field. >>>>>>>>>>> There are some example codes out there but none of them work >>>>>>>>>>> correctly for me. >>>>>>>>>>> >>>>>>>>>>> -----Original Message----- >>>>>>>>>>> From: Maruan Sahyoun [mailto:[email protected]] >>>>>>>>>>> Sent: Friday, September 11, 2015 3:15 AM >>>>>>>>>>> To: [email protected] >>>>>>>>>>> Subject: Re: How to merge forms where there is >>>>>>>>>>> >>>>>>>>>>> Hi Kevin >>>>>>>>>>> None of these field values will need to be changed afterward the >>>>>>>>>>> merge. They are set to read-only. >>>>>>>>>>>> I tried flattening the source fields but most of these documents >>>>>>>>>>>> rely on field annotation for the field value formatting and this >>>>>>>>>>>> is not to be changed. >>>>>>>>>>> when a field is flattened correctly the formatting of the >>>>>>>>>>> annotations visually representing the field become part of the page >>>>>>>>>>> content stream. So if you don't need the fields at all - as there >>>>>>>>>>> is no further input - you could flatten the source documents prior >>>>>>>>>>> to merging them. > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]

