Hi Maruan Here are the files: ccalt-simple.pdf <https://drive.google.com/file/d/0B7Bzk_1dcyc5RmcyWVo1ZURyV0k/view?usp=drive_web> cctemp-simple.pdf <https://drive.google.com/file/d/0B7Bzk_1dcyc5UHUtNWh6ampVMnc/view?usp=drive_web> And here is the testNG code portion. I trust you'll get a reproduceable setup working based on this.
private static PDDocument srcDoc; private static PDDocument tplDoc; @Test public static void SimpleTest() throws IOException { String ownerPassword = "ubsforms"; srcDoc = PDDocument.load(new File("./ccalt-simple.pdf"), ownerPassword); tplDoc = PDDocument.load(new File("./cctemp-simple.pdf"), ownerPassword); tplDoc.setAllSecurityToBeRemoved(true); srcDoc.close(); tplDoc.getDocumentCatalog().getAcroForm().setNeedAppearances(true); tplDoc.save("ccmig-simple.pdf"); tplDoc.close(); } Cheers Roberto On Mon, Jul 27, 2015 at 11:56 AM, Maruan Sahyoun <sahy...@fileaffairs.de> wrote: > Hi, > > Am 27.07.2015 um 11:49 schrieb Andreas Lehmkühler <andr...@lehmi.de>: > > > > > > > >> Roberto Nibali <rnib...@gmail.com> hat am 27. Juli 2015 um 10:29 > geschrieben: > >> > >> > >> Hi Andreas > >> > >> Thanks for the quick reply. > >> > >> On Mon, Jul 27, 2015 at 9:55 AM, Andreas Lehmkühler <andr...@lehmi.de> > >> wrote: > >> > >>> > >>> > >>>> Andreas Lehmkühler <andr...@lehmi.de> hat am 27. Juli 2015 um 09:37 > >>>> geschrieben: > >>>> > >>>> > >>>> Hi Roberto, > >>>> > >>>>> Roberto Nibali <rnib...@gmail.com> hat am 27. Juli 2015 um 09:28 > >>>>> geschrieben: > >>>>> > >>>>> > >>>>> Dear developers > >>>>> > >>>>> The last commit 1692730 by lehmi, 18:36, broke the PDFWriter. The > >>> result > >>>>> is: The file xx.pdf cannot be open; It may be damaged or use a file > >>> format > >>>>> that Preview doesn’t recognize. The same when using Acrobat > >>> Professional. > >>>>> > >>>>> Reverting the commit to the old one makes everything work again. What > >>> is > >>>>> the reason for this change? > >>>>> > >>>>> // use previous startXref value as new PREV value > >>>>> trailer.setLong(COSName.PREV, doc.getStartXref()); > >>>>> //trailer.removeItem(COSName.PREV); > >>>>> > >>>>> The trailer.removeItem(COSName.PREV) works, the new > >>>>> trailer.setLong(COSName.PREV, doc.getStartXref()) code does not. > >>>> Thanks for your hint. > >>>> > >>>> Can you be a little bit more specific, please? What kind of pdf did > you > >>> try to > >>>> sign? Can you provide us with a sample pdf? > >>> > >> > >> As far as I can tell, I'm not trying to sign any document. I'm working > on a > >> tool that migrates form fields from a source document to a new template > >> document (containing the same fields, however some CI/CD changes), and > >> subsequently saves the document as a new PDF with suffix "-migrated". > >> > >> In fact, I can trigger this behaviour with the following simple code > (which > >> does nothing else than open the source PDF, the template PDF, removes > the > >> security, sets the need for auto-generated appearances, and saves the > >> template into a new PDF): > >> > >> private static PDDocument srcDoc; > >> private static PDDocument tplDoc; > >> > >> @Test > >> public static void SimpleTest() throws IOException { > >> String ownerPassword = "limitedHappiness"; > >> srcDoc = PDDocument.load(new File("./ccalt.pdf"), ownerPassword); > >> tplDoc = PDDocument.load(new File("./cctemp.pdf"), ownerPassword); > >> tplDoc.setAllSecurityToBeRemoved(true); > >> srcDoc.close(); > >> tplDoc.getDocumentCatalog().getAcroForm().setNeedAppearances(true); > >> tplDoc.save("ccmig.pdf"); > >> tplDoc.close(); > >> } > >> > >> Due to signed NDAs, I cannot send you the PDF. If we can't solve the > >> issue, I'll try to generate a stripped down version for you, however > that's > >> going to take a day or so, and I have other pending issues which I'd > like > >> to address first, as the deadline for the final delivery of the tool is > now > >> definitely coming up. > > could you provide us with a stripped down version even if the change > resolves the issue as I tried to replicate it with some sample PDFs I have > and haven't been able to do so? > > BR > Maruan > > > OK, I see you are not using an incremental update feature. The name of > the > > modified method "doWriteXRefInc" pretends to be limited to incremental > updates, > > but it isn't. > > > >> > >>> I just had another idea. Can you please check the following change > >>> > >>> if (trailer.getItem(COSName.PREV != null)) > >>> { > >>> trailer.setLong(COSName.PREV, doc.getStartXref()) > >>> } > >>> > >>> > >> I modified to the following code, so it compiles: > >> > >> COSDictionary trailer = doc.getTrailer(); > >> // use previous startXref value as new PREV value > >> //trailer.setLong(COSName.PREV, doc.getStartXref()); > >> //trailer.removeItem(COSName.PREV); > >> if (trailer.getItem(COSName.PREV) != null) > >> { > >> trailer.setLong(COSName.PREV, doc.getStartXref()); > >> } > >> > >> No change, it still breaks my simple test case. > > I'm not at home, so that I can't check that myself, but I guess the > following > > should do the trick > > if (incrementalUpdate) > > { > > trailer.setLong(COSName.PREV, doc.getStartXref()); > > } > > > >> > >> On a side note (not understanding anything about PDFBox internals): Your > >> change seems pretty invasive just from an outsider's perspective > >> interpreting the method's name. Before your change, you basically seem > to > >> have removed the COS entry PREV, after your change, you set it to the > >> position of the xref section. I'm sure you know what you're doing, it > just > >> does not look minimally invasive in what I would call the hotpath of > >> PDFWriter ;). > >> > >> Cheers > >> Roberto > > > > BR > > Andreas > > > > --------------------------------------------------------------------- > > 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 > >