private void DeleteFile_Click(object sender, RoutedEventArgs e) { // to delete we just mark for not to be reincluded and do a round of saving PDDocumentCatalog catalog = pd.getDocumentCatalog(); PDDocumentNameDictionary names = catalog.getNames(); PDEmbeddedFilesNameTreeNode embeddedFiles = names.getEmbeddedFiles(); Map embeddedFileNames = embeddedFiles.getNames(); Dictionary <String, PDComplexFileSpecification> embeddedFileNamesNet = embeddedFileNames.ToDictionary <String, PDComplexFileSpecification>(); Map TomsNewMap = new HashMap(); // Attach all the existing files foreach (KeyValuePair <String, PDComplexFileSpecification> entry in embeddedFileNamesNet) { if (selectedFile == entry.Key) { // } else { TomsNewMap.put(entry.Key, entry.Value); } } PDEmbeddedFilesNameTreeNode TomsEmbeddedFiles = new PDEmbeddedFilesNameTreeNode(); TomsEmbeddedFiles.setNames(TomsNewMap); names.setEmbeddedFiles(TomsEmbeddedFiles); catalog.setNames(names); pd.save(pathToCurrentPDF); // reload the PDF LoadPDFAndLookForAttachments(pathToCurrentPDF); ButtonsStackPanel.Visibility = Visibility.Hidden; }
/** * Extracts a ZUGFeRD invoice from a PDF document represented by an input stream. * Errors are reported via exception handling. */ public void extractLowLevel(InputStream pdfStream) { PDDocument doc = null; try { doc = PDDocument.load(pdfStream); // PDDocumentInformation info = doc.getDocumentInformation(); PDDocumentNameDictionary names = new PDDocumentNameDictionary( doc.getDocumentCatalog()); PDEmbeddedFilesNameTreeNode etn; etn = names.getEmbeddedFiles(); if (etn == null) { doc.close(); return; } //Set efMap = etn.getNames().keySet(); Object[] efMap = etn.getNames().keySet().toArray(); //Map<String, COSObjectable> efMap = etn.getNames(); // String filePath = "/tmp/"; //for (String filename : efMap.keySet()) { foreach (String filename in efMap) { ///** //* currently (in the release candidate of version 1) only one //* attached file with the name ZUGFeRD-invoice.xml is allowed //* */ if (filename.Equals("ZUGFeRD-invoice.xml")) { //$NON-NLS-1$ containsMeta = true; PDComplexFileSpecification fileSpec = (PDComplexFileSpecification)etn.getNames().get(filename); PDEmbeddedFile embeddedFile = fileSpec.getEmbeddedFile(); // String embeddedFilename = filePath + filename; // File file = new File(filePath + filename); // System.out.println("Writing " + embeddedFilename); // ByteArrayOutputStream fileBytes=new // ByteArrayOutputStream(); // FileOutputStream fos = new FileOutputStream(file); rawXML = embeddedFile.getByteArray(); setMeta(Encoding.UTF8.GetString(rawXML)); // fos.write(embeddedFile.getByteArray()); // fos.close(); } } } catch (IOException e1) { throw e1; } finally { try { if (doc != null) { doc.close(); } } catch (IOException e) { } } }
private void LoadPDFAndLookForAttachments(string PDFPath) { try { pd.close(); } catch { // pd isn't open } FileDropStatus.Text = ""; AttachmentsPanel.Children.Clear(); if (!String.Equals(System.IO.Path.GetExtension(PDFPath), ".pdf", StringComparison.CurrentCultureIgnoreCase)) { MessageBoxResult result = MessageBox.Show("PDF Attacher only reads PDFs.", "PDF expected."); } else { FileDropStatus.Text = System.IO.Path.GetFileName(PDFPath); pd = PDDocument.load(PDFPath); // Get attachments and save out as a file PDDocumentCatalog catalog = pd.getDocumentCatalog(); PDDocumentNameDictionary names = catalog.getNames(); PDEmbeddedFilesNameTreeNode embeddedFiles = names.getEmbeddedFiles(); Map embeddedFileNames = embeddedFiles.getNames(); embeddedFileNamesNet = embeddedFileNames.ToDictionary <String, PDComplexFileSpecification>(); AttachmentsPanel.Children.Clear(); //For-Each Loop is used to list all embedded files (if there is more than one) foreach (KeyValuePair <String, PDComplexFileSpecification> entry in embeddedFileNamesNet) { StackPanel attachmentPanel = new StackPanel(); attachmentPanel.Orientation = Orientation.Vertical; attachmentPanel.Margin = new Thickness(5); attachmentPanel.MinWidth = 90; System.Windows.Controls.Image attachmentImage = new System.Windows.Controls.Image(); attachmentImage.Height = 32; attachmentImage.Width = 32; attachmentPanel.Tag = entry.Key; attachmentPanel.MouseEnter += AttachmentPanel_MouseEnter; attachmentPanel.MouseLeave += AttachmentPanel_MouseLeave; attachmentPanel.MouseUp += AttachmentPanel_MouseUp; Icon attachmentIcon = ShellIcon.GetLargeIconFromExtension(System.IO.Path.GetExtension(entry.Key)); BitmapSource attachmentBitmapSource = Imaging.CreateBitmapSourceFromHIcon(attachmentIcon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); attachmentImage.Source = attachmentBitmapSource; attachmentImage.Margin = new Thickness(5, 5, 5, 0); attachmentIcon.Dispose(); TextBlock attachmentTextBlock = new TextBlock(); attachmentTextBlock.Margin = new Thickness(5); attachmentTextBlock.Text = System.IO.Path.GetFileName(entry.Key); System.Windows.Controls.Image deleteImage = new System.Windows.Controls.Image(); deleteImage.Height = 20; deleteImage.Width = 20; deleteImage.Margin = new Thickness(0, 6, -50, -6); // var uriSource = new Uri(@"/PDFBox_sharp;component/DeleteIcon.png", UriKind.Relative); // deleteImage.Source = new BitmapImage(uriSource); // attachmentPanel.Children.Add(deleteImage); attachmentPanel.Children.Add(attachmentImage); attachmentPanel.Children.Add(attachmentTextBlock); AttachmentsPanel.Children.Add(attachmentPanel); } Icon sysicon = System.Drawing.Icon.ExtractAssociatedIcon(PDFPath); BitmapSource bmpSrc = Imaging.CreateBitmapSourceFromHIcon(sysicon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); PDFIcon.Source = bmpSrc; sysicon.Dispose(); } //pd.close(); }
// Decent example here -- https://github.com/Aiybe/PDFData/blob/master/od-reader/src/main/java/im/abe/pdfdata/AttachmentDataStorage.java private void AttachmentZone_Drop(object sender, DragEventArgs e) { // reset UI AttachmentZoneBorder.BorderThickness = new Thickness(1); AttachmentZone.Background = new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 255, 255)); deselectAllAttachmentPanels(); // attach files to PDF if (e.Data.GetDataPresent(DataFormats.FileDrop)) { // Note that you can have more than one file. string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); List <string> filesList = files.ToList(); if (pd != null) { foreach (string file in filesList) { byte[] fileBytes; try { fileBytes = System.IO.File.ReadAllBytes(file); } catch { // couldn't read file MessageBox.Show("Can't open " + file + " make sure it is not open in another application.", "Can't open file."); continue; } FileStream _filestream = System.IO.File.Open(file, FileMode.Open); string nameOfFileToAttach = _filestream.Name; _filestream.Close(); PDComplexFileSpecification fs = new PDComplexFileSpecification(); fs.setFile(nameOfFileToAttach); ByteArrayInputStream inputStream = new ByteArrayInputStream(fileBytes, 0, fileBytes.Length); //ByteArrayInputStream inputStream = new ByteArrayInputStream(fileBytes); PDEmbeddedFile embeddedFile = new PDEmbeddedFile(pd, inputStream); embeddedFile.setModDate(java.util.Calendar.getInstance()); embeddedFile.setSize(fileBytes.Length); fs.setEmbeddedFile(embeddedFile); PDDocumentCatalog catalog = pd.getDocumentCatalog(); PDDocumentNameDictionary names = catalog.getNames(); Map TomsNewMap = new HashMap(); if (names != null) { // there are already some attached files PDEmbeddedFilesNameTreeNode embeddedFiles = names.getEmbeddedFiles(); Map embeddedFileNames = embeddedFiles.getNames(); Dictionary <String, PDComplexFileSpecification> embeddedFileNamesNet = embeddedFileNames.ToDictionary <String, PDComplexFileSpecification>(); // Attach all the existing files foreach (KeyValuePair <String, PDComplexFileSpecification> entry in embeddedFileNamesNet) { TomsNewMap.put(entry.Key, entry.Value); } } else { // there are no files already attached -- so create a new name dictionary names = new PDDocumentNameDictionary(catalog); } // Attach the new file TomsNewMap.put(System.IO.Path.GetFileName(nameOfFileToAttach), fs); PDEmbeddedFilesNameTreeNode TomsEmbeddedFiles = new PDEmbeddedFilesNameTreeNode(); TomsEmbeddedFiles.setNames(TomsNewMap); names.setEmbeddedFiles(TomsEmbeddedFiles); catalog.setNames(names); pd.save(pathToCurrentPDF); pd.close(); } } else { MessageBoxResult result = MessageBox.Show("No PDF file loaded."); } } // reload the PDF LoadPDFAndLookForAttachments(pathToCurrentPDF); }
/** * Embeds an external file (generic - any type allowed) in the PDF. * * @param doc * PDDocument to attach the file to. * @param filename * name of the file that will become attachment name in the PDF * @param relationship * how the file relates to the content, e.g. "Alternative" * @param description * Human-readable description of the file content * @param subType * type of the data e.g. could be "text/xml" - mime like * @param data * the binary data of the file/attachment */ public void PDFAttachGenericFile(PDDocument doc, String filename, String relationship, String description, String subType, byte[] data) { PDComplexFileSpecification fs = new PDComplexFileSpecification(); fs.setFile(filename); COSDictionary dict = fs.getCOSDictionary(); dict.setName("AFRelationship", relationship); dict.setString("UF", filename); dict.setString("Desc", description); ByteArrayInputStream fakeFile = new ByteArrayInputStream(data); PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile); ef.setSubtype(subType); ef.setSize(data.Length); ef.setCreationDate(new GregorianCalendar()); ef.setModDate(GregorianCalendar.getInstance()); fs.setEmbeddedFile(ef); // In addition make sure the embedded file is set under /UF dict = fs.getCOSDictionary(); COSDictionary efDict = (COSDictionary)dict .getDictionaryObject(COSName.EF); COSBase lowerLevelFile = efDict.getItem(COSName.F); efDict.setItem(COSName.UF, lowerLevelFile); // now add the entry to the embedded file tree and set in the document. PDDocumentNameDictionary names = new PDDocumentNameDictionary( doc.getDocumentCatalog()); PDEmbeddedFilesNameTreeNode efTree = names.getEmbeddedFiles(); if (efTree == null) { efTree = new PDEmbeddedFilesNameTreeNode(); } //Map<String, COSObjectable> namesMap = new HashMap<String, COSObjectable>(); // Map<String, COSObjectable> oldNamesMap = efTree.getNames(); //if (oldNamesMap != null) { // for (String key : oldNamesMap.keySet()) { // namesMap.put(key, oldNamesMap.get(key)); // } //} //efTree.setNames(namesMap); //should be ported more exactly... efTree.setNames(Collections.singletonMap(filename, fs)); names.setEmbeddedFiles(efTree); doc.getDocumentCatalog().setNames(names); // AF entry (Array) in catalog with the FileSpec COSArray cosArray = (COSArray)doc.getDocumentCatalog() .getCOSDictionary().getItem("AF"); if (cosArray == null) { cosArray = new COSArray(); } cosArray.add(fs); COSDictionary dict2 = doc.getDocumentCatalog().getCOSDictionary(); COSArray array = new COSArray(); array.add(fs.getCOSDictionary()); // see below dict2.setItem("AF", array); doc.getDocumentCatalog().getCOSDictionary().setItem("AF", cosArray); }