示例#1
0
 internal PdfReaderInstance(PdfReader reader, PdfWriter writer)
 {
     this.reader = reader;
     this.writer = writer;
     file = reader.SafeFile;
     myXref = new int[reader.XrefSize];
 }
 /**
  * The verification constructor. This class should only be created with
  * PdfStamper.getLtvVerification() otherwise the information will not be
  * added to the Pdf.
  * @param stp the PdfStamper to apply the validation to
  */
 public LtvVerification(PdfStamper stp)
 {
     this.stp = stp;
     writer = stp.Writer;
     reader = stp.Reader;
     acroFields = stp.AcroFields;
 }
 // membervariables
 // constructors
 /**
  * Constructs a <CODE>PdfIndirectReference</CODE>.
  *
  * @param        reader            a <CODE>PdfReader</CODE>
  * @param        number            the object number.
  * @param        generation        the generation number.
  */
 internal PRIndirectReference(PdfReader reader, int number, int generation)
 {
     type = INDIRECT;
     this.number = number;
     this.generation = generation;
     this.reader = reader;
 }
示例#4
0
 /**
 * Constructor
 * @param reader reader of the input file
 */
 public PRAcroForm(PdfReader reader)
 {
     this.reader = reader;
     fields = new ArrayList();
     fieldByName = new Hashtable();
     stack = new ArrayList();
 }
示例#5
0
	    /**
	     * Creates a VerificationData object for a PdfReader
	     * @param reader	a reader for the document we want to verify.
	     * @throws GeneralSecurityException 
	     */
	    public LtvVerifier(PdfReader reader) : base(null) {
		    this.reader = reader;
		    fields = reader.AcroFields;
		    List<String> names = fields.GetSignatureNames();
		    signatureName = names[names.Count - 1];
		    signDate = DateTime.Now;
		    pkcs7 = CoversWholeDocument();
		    LOGGER.Info(String.Format("Checking {0}signature {1}", pkcs7.IsTsp ? "document-level timestamp " : "", signatureName));
	    }
示例#6
0
 /**
  * Parses a string with structured content.
  * 
  * @param reader
  *            the PdfReader that has access to the PDF file
  * @param os
  *            the Stream to which the resulting xml will be written
  * @param charset
  *            the charset to encode the data
  * @since 5.0.5
  */
 public virtual void ConvertToXml(PdfReader reader, Stream os, Encoding encoding) {
     this.reader = reader;
     outp = new StreamWriter(os, encoding);
     // get the StructTreeRoot from the root obj
     PdfDictionary catalog = reader.Catalog;
     PdfDictionary struc = catalog.GetAsDict(PdfName.STRUCTTREEROOT);
     if (struc == null)
         throw new IOException(MessageLocalization.GetComposedMessage("no.structtreeroot.found"));
     // Inspect the child or children of the StructTreeRoot
     InspectChild(struc.GetDirectObject(PdfName.K));
     outp.Flush();
     outp.Close();
 }
示例#7
0
 public PRStream(PRStream stream, PdfDictionary newDic)
 {
     reader = stream.reader;
     offset = stream.offset;
     length = stream.Length;
     compressed = stream.compressed;
     compressionLevel = stream.compressionLevel;
     streamBytes = stream.streamBytes;
     bytes = stream.bytes;
     objNum = stream.objNum;
     objGen = stream.objGen;
     if (newDic != null)
     Merge(newDic);
     else
     Merge(stream);
 }
示例#8
0
 /**
 * This method feeds in the source document
 * @param reader The PDF reader containing the source document
 * @throws DocumentException
 */
 public void CopyDocumentFields(PdfReader reader)
 {
     if (!reader.IsOpenedWithFullPermissions)
         throw new BadPasswordException("PdfReader not opened with owner password");
     if (readers2intrefs.ContainsKey(reader)) {
         reader = new PdfReader(reader);
     }
     else {
         if (reader.Tampered)
             throw new DocumentException("The document was reused.");
         reader.ConsolidateNamedDestinations();
         reader.Tampered = true;
     }
     reader.ShuffleSubsetNames();
     readers2intrefs[reader] = new IntHashtable();
     fields.Add(reader.AcroFields);
     UpdateCalculationOrder(reader);
 }
示例#9
0
 /// <summary>
 /// Removes layers from a PDF document </summary>
 /// <param name="reader">	a PdfReader containing a PDF document </param>
 /// <param name="layers">	a sequence of names of OCG layers </param>
 /// <exception cref="IOException"> </exception>
 public virtual void RemoveLayers(PdfReader reader, params string[] layers) {
     int n = reader.NumberOfPages;
     for (int i = 1; i <= n; i++)
         reader.SetPageContent(i, reader.GetPageContent(i));
     ICollection<string> ocgs = new HashSet2<string>();
     for (int i = 0; i < layers.Length; i++) {
         ocgs.Add(layers[i]);
     }
     OCGParser parser = new OCGParser(ocgs);
     for (int i = 1; i <= n; i++) {
         PdfDictionary page = reader.GetPageN(i);
         Parse(parser, page);
         page.Remove(PdfName.PIECEINFO);
         RemoveAnnots(page, ocgs);
         RemoveProperties(page, ocgs);
     }
     PdfDictionary root = reader.Catalog;
     PdfDictionary ocproperties = root.GetAsDict(PdfName.OCPROPERTIES);
     if (ocproperties != null) {
         RemoveOCGsFromArray(ocproperties, PdfName.OCGS, ocgs);
         PdfDictionary d = ocproperties.GetAsDict(PdfName.D);
         if (d != null) {
             RemoveOCGsFromArray(d, PdfName.ON, ocgs);
             RemoveOCGsFromArray(d, PdfName.OFF, ocgs);
             RemoveOCGsFromArray(d, PdfName.LOCKED, ocgs);
             RemoveOCGsFromArray(d, PdfName.RBGROUPS, ocgs);
             RemoveOCGsFromArray(d, PdfName.ORDER, ocgs);
             RemoveOCGsFromArray(d, PdfName.AS, ocgs);
         }
         PdfArray ocgsArray = ocproperties.GetAsArray(PdfName.OCGS);
         if (ocgsArray != null && ocgsArray.IsEmpty()) {
             root.Remove(PdfName.OCPROPERTIES);
             if (PdfName.USEOC.Equals(root.GetAsName(PdfName.PAGEMODE))) {
                 root.Remove(PdfName.PAGEMODE);
             }
         }
     }
     reader.RemoveUnusedObjects();
 }
示例#10
0
 /**
  * Processes a properly tagged PDF form.
  * @param reader the PdfReader instance holding the PDF
  * @throws IOException
  * @throws DocumentException 
  */
 virtual public void Process(PdfReader reader, Stream os) {
     int n = reader.NumberOfPages;
     // getting the root dictionary
     PdfDictionary catalog = reader.Catalog;
     // flattening means: remove AcroForm
     catalog.Remove(PdfName.ACROFORM);
     // read the structure and create a parser
     StructureItems items = new StructureItems(reader);
     MCParser parser = new MCParser(items);
     // loop over all pages
     for(int i = 1; i <= n; i++) {
         // make one stream of a content stream array
         reader.SetPageContent(i, reader.GetPageContent(i));
         // parse page
         parser.Parse(reader.GetPageN(i), reader.GetPageOrigRef(i));
     }
     reader.RemoveUnusedObjects();
     // create flattened file
     PdfStamper stamper = new PdfStamper(reader, os);
     items.WriteParentTree(stamper.Writer);
     stamper.Close();
 }
示例#11
0
        public void putData()
        {
            try
            {
                if (MainForm.lib == 1)
                {
                    word = new List <string>();
                    word.Add(line[4]);                                                         // title
                    word.Add(getdataline("Construction Name"));                                // name
                    word.Add(getdataline("Construction No"));                                  // no
                    word.Add(getdataline("Construction Site"));                                // site
                    word.Add(getdatablock("Construction outline", "Reason for construction")); // outline
                    word.Add(getdataline("Estimate Amount"));                                  // amount
                    word.Add(getdataline("Phone"));                                            // phone
                    word.Add(getdataline("Reason for construction"));                          // reson
                    word.Add(getdatablock("Remarks", string.Empty));                           // remarks
                }
                else if (MainForm.lib == 2)
                {
                    word = new List <string>();
                    word.Add(line[0]);                                                                                     // title
                    word.Add(getdataup("Construction Name"));                                                              // name
                    word.Add(getdataup("Construction No").Substring(0, Method.getdataup("Construction No").IndexOf(" "))); // no
                    word.Add(getdataup("Construction Site"));                                                              // site
                    word.Add(getdatadownblock("Outline of Construction"));                                                 // outline
                    word.Add(getdataup("Estimate Amount"));                                                                // amount
                    word.Add(getdataup("Phone"));                                                                          // phone
                    word.Add(getdataup("Reason for construction"));                                                        // reson
                    word.Add(getdataup("Remarks"));                                                                        // remarks
                }
                else if (MainForm.lib == 3)
                {
                    word = new List <string>();
                    word.Add(line[0].Substring(line[0].IndexOf("度") + 1).Trim());
                    word.Add(getdataline("Construction No"));
                    word.Add(getdataline("Construction Name"));
                    word.Add(getdataline("Phone"));

                    word.Add(getdataline("River Name"));

                    word.Add(getdatablock("Position", "Contract enforcement"));
                    word.Add(getdatadown("Contract enforcement"));
                    word.Add(getdatakeyinMiddle("Construction outline", 2, 1));
                    word.Add(line[line.Count - 1]);
                }
                else if (MainForm.lib == 4)
                {
                    word = new List <string>();
                    word.Add(line[1]);
                    word.Add(getdataline("Construction name"));
                    word.Add(getdataline("Business name"));
                    word.Add(getdataline("Constructor name"));

                    word.Add(getdataline("Phone"));

                    word.Add(getdataline("Designer name"));
                    word.Add(getdataline("Factory Place"));
                    word.Add(getdataline("construction number"));
                    word.Add(getdataline("Unit price Appropriate land"));
                    word.Add(getdataline("Construction  year"));
                    word.Add(line[line.Count - 1]);
                }
                else if (MainForm.lib == 5)
                {
                    PdfReader reader = new PdfReader(mpath);
                    string    key    = reader.Info["Keywords"];
                    word = new List <string>();
                    switch (key)
                    {
                    case "12":
                        word.Add(line[0]);                                                        // title
                        word.Add(getdataline("Construction Name"));                               // name
                        word.Add(getdataline("Construction No"));                                 // no
                        word.Add(getdataline("Construction Site"));                               // site
                        word.Add(getdatablock("Outline of Construction", "Construction period")); // outline
                        word.Add(getdataline("Estimate Amount"));                                 // amount
                        word.Add(getdataline("Phone"));                                           // phone
                        word.Add(getdataline("Reason for construction"));                         // reson
                        word.Add(getdatablock("Remarks", string.Empty));                          // remarks

                        word.Add(periodSpliter("Construction period")[0]);
                        word.Add(periodSpliter("Construction period")[1]);
                        word.Add(periodSpliter("Construction period")[2]);
                        break;


                    case "3":
                        word.Add(line[0]);
                        word.Add(getdataline("Construction No"));
                        word.Add(getdataline("Construction Name"));
                        word.Add(getdataline("Phone"));

                        word.Add(getdataline("River Name"));

                        word.Add(getdataline("Position"));
                        word.Add(getdataline("Contract enforcement"));
                        word.Add(getdatablock("Construction outline", line[line.Count - 1]));
                        word.Add(line[line.Count - 1]);

                        word.Add(periodSpliter("Date")[0]);
                        word.Add(periodSpliter("Date")[1]);
                        word.Add(periodSpliter("Date")[2]);
                        break;


                    case "4":
                        word.Add(line[0]);
                        word.Add(getdatablock("Construction Name", "Business Name"));
                        word.Add(getdataline("Business Name"));
                        word.Add(getdataline("Constructor Name"));

                        word.Add(getdataline("Phone"));

                        word.Add(getdataline("Designer Name"));
                        word.Add(getdataline("Factory Place"));
                        word.Add(getdataline("Construction Number"));
                        word.Add(getdataline("Unit Price Appropriate land"));
                        word.Add(getdataline("Construction year"));
                        word.Add(line[line.Count - 1]);

                        word.Add(periodSpliter("Date")[0]);
                        word.Add(periodSpliter("Date")[1]);
                        word.Add(periodSpliter("Date")[2]);
                        break;

                    default:
                        break;
                    }
                }
            }
            catch (Exception)
            {
                //MessageBox.Show("PDF is Worng!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
示例#12
0
        private void btnProcess_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrWhiteSpace(tbPath.Text))
            {
                return;
            }

            dataGridView1.Rows.Clear();
            Cursor = Cursors.WaitCursor;

            IEnumerable <string> srcFiles;

            if (System.IO.File.GetAttributes(tbPath.Text).HasFlag(FileAttributes.Directory))
            {
                srcFiles = Directory.EnumerateFiles(tbPath.Text, "*.pdf", SearchOption.AllDirectories);
            }
            else
            {
                srcFiles = new string[] { tbPath.Text };
            }

            foreach (var srcFile in srcFiles)
            {
                var        dataGridRowNum = dataGridView1.Rows.Add(new object[] { srcFile, 0 });
                PdfReader  reader         = null;
                PdfStamper pdfStamper     = null;

                try
                {
                    reader = new PdfReader(srcFile);
                    var dstFile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(srcFile),
                                                         System.IO.Path.GetFileNameWithoutExtension(srcFile) + "_clean.pdf");
                    var output = File.Open(dstFile, FileMode.Create);

                    pdfStamper = new PdfStamper(reader, output, reader.PdfVersion, false);
                    pdfStamper.RotateContents = false;

                    var replaceTextProcessor = new TextReplaceStreamEditor(tbReplaceMatch.Text, tbReplaceReplace.Text);
                    if (cbReplaceText.Checked)
                    {
                        for (int i = 1; i <= reader.NumberOfPages; i++)
                        {
                            replaceTextProcessor.EditPage(pdfStamper, i);
                        }
                    }

                    var redactTextProcessor = new TextRedactStreamEditor(tbRedactMatch.Text);
                    if (cbRedactText.Checked)
                    {
                        for (int i = 1; i <= reader.NumberOfPages; i++)
                        {
                            redactTextProcessor.EditPage(pdfStamper, i);
                        }
                        pdfStamper.Writer.SetEncryption(null,
                                                        Encoding.UTF8.GetBytes("ownerPassword"),
                                                        PdfWriter.AllowDegradedPrinting | PdfWriter.AllowPrinting,
                                                        PdfWriter.ENCRYPTION_AES_256);
                    }


                    if (cbRemoveJavascript.Checked && reader.JavaScript != null)
                    {
                        pdfStamper.JavaScript = "";
                    }

                    pdfStamper.Writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
                    pdfStamper.SetFullCompression();
                    pdfStamper.Writer.Info?.Clear();
                    pdfStamper.XmpMetadata = new byte[0];
                    pdfStamper.MoreInfo?.Clear();

                    dataGridView1.Rows[dataGridRowNum].ErrorText = "";;
                }
                catch (Exception ex)
                {
                    dataGridView1.Rows[dataGridRowNum].ErrorText = ex.Message;
                }
                finally
                {
                    pdfStamper?.Close();
                    reader?.Close();
                }
            }

            Cursor = Cursors.Arrow;
        }
示例#13
0
        /// <summary>
        /// 加图片水印
        /// </summary>
        /// <param name="inputfilepath"></param>
        /// <param name="outputfilepath"></param>
        /// <param name="ModelPicName"></param>
        /// <param name="top"></param>
        /// <param name="left"></param>
        /// <returns></returns>
        public string PDFWatermark(string inputfilepath, string outputfilepath, string ModelPicName, float top, float left)
        {
            PdfReader  pdfReader  = null;
            PdfStamper pdfStamper = null;

            try
            {
                pdfReader = new PdfReader(inputfilepath);

                int numberOfPages = pdfReader.NumberOfPages;

                iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1);

                float width = psize.Width;

                float height = psize.Height;

                pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.OpenOrCreate));

                PdfContentByte waterMarkContent;

                iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(ModelPicName);

                image.GrayFill = 80; //透明度,灰色填充
                                     //image.Rotation = 40;//旋转
                                     //image.RotationDegrees = 40;//旋转角度
                                     //水印的位置
                if (left < 0)
                {
                    left = width / 2 - image.Width + left;
                }

                //image.SetAbsolutePosition(left, (height - image.Height) - top);
                image.SetAbsolutePosition(left, (height / 2 - image.Height) - top);


                //每一页加水印,也可以设置某一页加水印
                for (int i = 1; i <= numberOfPages; i++)
                {
                    waterMarkContent = pdfStamper.GetUnderContent(i); //内容下层加水印
                                                                      //waterMarkContent = pdfStamper.GetOverContent(i);//内容上层加水印
                    waterMarkContent.AddImage(image);
                }

                return(outputfilepath);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (pdfStamper != null)
                {
                    pdfStamper.Close();
                }

                if (pdfReader != null)
                {
                    pdfReader.Close();
                }
            }
        }
示例#14
0
        /// <summary>
        /// Executes the action.
        /// </summary>
        /// <param name="rockContext">The rock context.</param>
        /// <param name="action">The action.</param>
        /// <param name="entity">The entity.</param>
        /// <param name="errorMessages">The error messages.</param>
        /// <returns></returns>
        public override bool Execute(RockContext rockContext, WorkflowAction action, object entity, out List <string> errorMessages)
        {
            errorMessages = new List <string>();

            PDFWorkflowObject pdfWorkflowObject = new PDFWorkflowObject();

            // A PDF merge can enter in two ways, kicked off with trigger or called from a block
            // If it is called from a block we will get our information from a PDFWorkflowObject
            // Otherwise we will need to get our information from the workflow attributes
            if (entity is PDFWorkflowObject)
            {
                pdfWorkflowObject = Utility.GetPDFFormMergeFromEntity(entity, out errorMessages);
            }
            else
            {
                pdfWorkflowObject = new PDFWorkflowObject(action, rockContext);
            }

            BinaryFile renderedPDF = new BinaryFile();

            // Merge PDF
            using (MemoryStream ms = new MemoryStream())
            {
                var pdfGuid   = GetAttributeValue(action, "PDFTemplate");
                var pdf       = new BinaryFileService(rockContext).Get(pdfGuid.AsGuid());
                var pdfBytes  = pdf.ContentStream.ReadBytesToEnd();
                var pdfReader = new PdfReader(pdfBytes);
                var stamper   = new PdfStamper(pdfReader, ms);
                var form      = stamper.AcroFields;

                form.GenerateAppearances = true;

                var fieldKeys = form.Fields.Keys;

                // Field keys are the names of form fields in a pdf form
                foreach (string fieldKey in fieldKeys)
                {
                    // If this is a key value pairing
                    if (pdfWorkflowObject.MergeObjects.ContainsKey(fieldKey))
                    {
                        if (pdfWorkflowObject.MergeObjects[fieldKey] is string)
                        {
                            form.SetField(fieldKey, pdfWorkflowObject.MergeObjects[fieldKey] as string);
                        }
                    }
                    // otherwise test for lava and use the form value as the lava input
                    else
                    {
                        string fieldValue = form.GetField(fieldKey);
                        if (!string.IsNullOrWhiteSpace(fieldValue) && fieldValue.HasMergeFields())
                        {
                            form.SetField(fieldKey, fieldValue.ResolveMergeFields(pdfWorkflowObject.MergeObjects));
                        }
                    }
                }

                // Should we flatten the form
                stamper.FormFlattening = GetActionAttributeValue(action, "Flatten").AsBoolean();

                stamper.Close();
                pdfReader.Close();

                // Generate New Object
                renderedPDF.CopyPropertiesFrom(pdf);
                renderedPDF.Guid             = Guid.NewGuid();
                renderedPDF.BinaryFileTypeId = new BinaryFileTypeService(rockContext).Get(new Guid(Rock.SystemGuid.BinaryFiletype.DEFAULT)).Id;

                BinaryFileData pdfData = new BinaryFileData();
                pdfData.Content = ms.ToArray();

                renderedPDF.DatabaseData = pdfData;

                pdfReader.Close();
            }

            if (entity is PDFWorkflowObject)
            {
                entity = pdfWorkflowObject;
            }
            else
            {
                BinaryFileService binaryFileService = new BinaryFileService(rockContext);
                binaryFileService.Add(renderedPDF);
                rockContext.SaveChanges();

                Guid guid = GetAttributeValue(action, "PDFOutput").AsGuid();
                if (!guid.IsEmpty())
                {
                    var attribute = AttributeCache.Get(guid, rockContext);
                    if (attribute != null)
                    {
                        SetWorkflowAttributeValue(action, guid, renderedPDF.Guid.ToString());
                    }
                }
            }

            return(true);
        }
示例#15
0
 public pdfparser(string path)
 {
     reader = new PdfReader(path);
 }
示例#16
0
 /** Entry point to encrypt a PDF document. The encryption parameters are the same as in
  * <code>PdfWriter</code>. The userPassword and the
  *  ownerPassword can be null or have zero length. In this case the ownerPassword
  *  is replaced by a random string. The open permissions for the document can be
  *  AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
  *  AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
  *  The permissions can be combined by ORing them.
  * @param reader the read PDF
  * @param os the output destination
  * @param type the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.
  * Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext
  * @param userPassword the user password. Can be null or empty
  * @param ownerPassword the owner password. Can be null or empty
  * @param permissions the user permissions
  * values delete the key in the original info dictionary
  * @throws DocumentException on error
  * @throws IOException on error
  */
 public static void Encrypt(PdfReader reader, Stream os, int type, String userPassword, String ownerPassword, int permissions)
 {
     PdfStamper stamper = new PdfStamper(reader, os);
     stamper.SetEncryption(type, userPassword, ownerPassword, permissions);
     stamper.Close();
 }
示例#17
0
 internal AcroFields(PdfReader reader, PdfWriter writer)
 {
     this.reader = reader;
     this.writer = writer;
     xfa = new XfaForm(reader);
     if (writer is PdfStamperImp) {
         append = ((PdfStamperImp)writer).append;
     }
     Fill();
 }
示例#18
0
 /**
 * Copies the output intent dictionary from other document to this one.
 * @param reader the other document
 * @param checkExistence <CODE>true</CODE> to just check for the existence of a valid output intent
 * dictionary, <CODE>false</CODE> to insert the dictionary if it exists
 * @throws IOException on error
 * @return <CODE>true</CODE> if the output intent dictionary exists, <CODE>false</CODE>
 * otherwise
 */
 public bool SetOutputIntents(PdfReader reader, bool checkExistence)
 {
     PdfDictionary catalog = reader.Catalog;
     PdfArray outs = catalog.GetAsArray(PdfName.OUTPUTINTENTS);
     if (outs == null)
         return false;
     ArrayList arr = outs.ArrayList;
     if (outs.Size == 0)
         return false;
     PdfDictionary outa = outs.GetAsDict(0);
     PdfObject obj = PdfReader.GetPdfObject(outa.Get(PdfName.S));
     if (obj == null || !PdfName.GTS_PDFX.Equals(obj))
         return false;
     if (checkExistence)
         return true;
     PRStream stream = (PRStream)PdfReader.GetPdfObject(outa.Get(PdfName.DESTOUTPUTPROFILE));
     byte[] destProfile = null;
     if (stream != null) {
         destProfile = PdfReader.GetStreamBytes(stream);
     }
     SetOutputIntents(GetNameString(outa, PdfName.OUTPUTCONDITIONIDENTIFIER), GetNameString(outa, PdfName.OUTPUTCONDITION),
         GetNameString(outa, PdfName.REGISTRYNAME), GetNameString(outa, PdfName.INFO), destProfile);
     return true;
 }
示例#19
0
 protected internal virtual int GetNewObjectNumber(PdfReader reader, int number, int generation)
 {
     return currentPdfReaderInstance.GetNewObjectNumber(number, generation);
 }
示例#20
0
 /** Writes the reader to the document and frees the memory used by it.
 * The main use is when concatenating multiple documents to keep the
 * memory usage restricted to the current appending document.
 * @param reader the <CODE>PdfReader</CODE> to free
 * @throws IOException on error
 */
 public virtual void FreeReader(PdfReader reader)
 {
     currentPdfReaderInstance = (PdfReaderInstance)importedPages[reader];
     if (currentPdfReaderInstance == null)
         return;
     currentPdfReaderInstance.WriteAllPages();
     currentPdfReaderInstance = null;
     importedPages.Remove(reader);
 }
示例#21
0
 /** Gets a page from other PDF document. The page can be used as
 * any other PdfTemplate. Note that calling this method more than
 * once with the same parameters will retrieve the same object.
 * @param reader the PDF document where the page is
 * @param pageNumber the page number. The first page is 1
 * @return the template representing the imported page
 */
 public virtual PdfImportedPage GetImportedPage(PdfReader reader, int pageNumber)
 {
     PdfReaderInstance inst = (PdfReaderInstance)importedPages[reader];
     if (inst == null) {
         inst = reader.GetPdfReaderInstance(this);
         importedPages[reader] = inst;
     }
     return inst.GetImportedPage(pageNumber);
 }
 public static Hashtable GetNamedDestination(PdfReader reader, bool fromNames)
 {
     IntHashtable pages = new IntHashtable();
     int numPages = reader.NumberOfPages;
     for (int k = 1; k <= numPages; ++k)
         pages[reader.GetPageOrigRef(k).Number] = k;
     Hashtable names = fromNames ? reader.GetNamedDestinationFromNames() : reader.GetNamedDestinationFromStrings();
     String[] keys = new String[names.Count];
     names.Keys.CopyTo(keys, 0);
     foreach (String name in keys) {
         PdfArray arr = (PdfArray)names[name];
         StringBuilder s = new StringBuilder();
         try {
             s.Append(pages[(arr.GetAsIndirectObject(0)).Number]);
             s.Append(' ').Append(arr[1].ToString().Substring(1));
             for (int k = 2; k < arr.Size; ++k)
                 s.Append(' ').Append(arr[k].ToString());
             names[name] = s.ToString();
         }
         catch {
             names.Remove(name);
         }
     }
     return names;
 }
示例#23
0
        public void WriteAbout(int n)
        {
            string pasta;

            pasta = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
            if (!Directory.Exists(Path.Combine(pasta, "ErgoMobile", "Exported", "temp", "new")))
            {
                Directory.CreateDirectory(Path.Combine(pasta, "ErgoMobile", "Exported", "temp", "new"));
            }

            char   c = (char)(41 + n);
            string oldFile;
            string newFile;

            if (n >= 0)
            {
                oldFile = Path.Combine(pasta, "ErgoMobile", "Exported", "temp", (n + 1) + c + ".pdf");
                newFile = Path.Combine(pasta, "ErgoMobile", "Exported", "temp", "new", (n + 1) + c + ".pdf");
            }
            else
            {
                oldFile = Path.Combine(pasta, "ErgoMobile", "Exported", "temp", "99total.pdf");
                newFile = Path.Combine(pasta, "ErgoMobile", "Exported", "temp", "new", "99total.pdf");
            }

            // open the reader
            PdfReader reader   = new PdfReader(oldFile);
            Rectangle size     = reader.GetPageSizeWithRotation(1);
            Document  document = new Document(size);

            // open the writer
            if (File.Exists(newFile))
            {
                File.Delete(newFile);
            }
            FileStream fs     = new FileStream(newFile, FileMode.Create, FileAccess.Write);
            PdfWriter  writer = PdfWriter.GetInstance(document, fs);

            document.Open();


            // the pdf content
            PdfContentByte cb = writer.DirectContent;

            // select the font properties
            BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

            cb.SetColorFill(BaseColor.DARK_GRAY);
            cb.SetFontAndSize(bf, 17);

            // write the text in the pdf content
            string Text = "Total respondido: " + (mr + r + reg + b + mb) + "       Não respondido: " + nr;

            if (lang == "en")
            {
                Text = "Total answered: " + (mr + r + reg + b + mb) + "       Not answered: " + nr;
            }
            cb.BeginText();
            // put the alignment and coordinates here
            cb.ShowTextAligned(1, Text, 296, 760, 0);
            cb.EndText();
            cb.BeginText();

            Text = "Muito ruim: " + mr + "     Ruim: " + r + "     Regular: " + reg + "     Bom: " + b + "     Muito bom: " + mb;
            if (lang == "en")
            {
                Text = "Too bad: " + mr + "     Bad: " + r + "     Regular: " + reg + "     Good: " + b + "     Very good: " + mb;
            }

            // put the alignment and coordinates here
            cb.ShowTextAligned(1, Text, 296, 740, 0);
            cb.EndText();

            // create the new page and add it to the pdf
            PdfImportedPage page = writer.GetImportedPage(reader, 1);

            cb.AddTemplate(page, 0, 0);

            // close the streams and voilá the file should be changed :)
            document.Close();
            fs.Close();
            writer.Close();
            reader.Close();
        }
示例#24
0
        private void readPng()
        {
            for (var i = 0; i < Pngid.Length; i++)
            {
                if (Pngid[i] != _isp.ReadByte())
                {
                    throw new IOException("File is not a valid PNG.");
                }
            }
            var buffer = new byte[Transfersize];

            while (true)
            {
                var len    = GetInt(_isp);
                var marker = GetString(_isp);
                if (len < 0 || !checkMarker(marker))
                {
                    throw new IOException("Corrupted PNG file.");
                }

                if (IDAT.Equals(marker))
                {
                    int size;
                    while (len != 0)
                    {
                        size = _isp.Read(buffer, 0, Math.Min(len, Transfersize));
                        if (size <= 0)
                        {
                            return;
                        }

                        _idat.Write(buffer, 0, size);
                        len -= size;
                    }
                }
                else if (tRNS.Equals(marker))
                {
                    switch (_colorType)
                    {
                    case 0:
                        if (len >= 2)
                        {
                            len -= 2;
                            var gray = GetWord(_isp);
                            if (_bitDepth == 16)
                            {
                                _transRedGray = gray;
                            }
                            else
                            {
                                _additional.Put(PdfName.Mask, new PdfLiteral("[" + gray + " " + gray + "]"));
                            }
                        }
                        break;

                    case 2:
                        if (len >= 6)
                        {
                            len -= 6;
                            var red   = GetWord(_isp);
                            var green = GetWord(_isp);
                            var blue  = GetWord(_isp);
                            if (_bitDepth == 16)
                            {
                                _transRedGray = red;
                                _transGreen   = green;
                                _transBlue    = blue;
                            }
                            else
                            {
                                _additional.Put(PdfName.Mask, new PdfLiteral("[" + red + " " + red + " " + green + " " + green + " " + blue + " " + blue + "]"));
                            }
                        }
                        break;

                    case 3:
                        if (len > 0)
                        {
                            _trans = new byte[len];
                            for (var k = 0; k < len; ++k)
                            {
                                _trans[k] = (byte)_isp.ReadByte();
                            }

                            len = 0;
                        }
                        break;
                    }
                    Utilities.Skip(_isp, len);
                }
                else if (IHDR.Equals(marker))
                {
                    _width  = GetInt(_isp);
                    _height = GetInt(_isp);

                    _bitDepth          = _isp.ReadByte();
                    _colorType         = _isp.ReadByte();
                    _compressionMethod = _isp.ReadByte();
                    _filterMethod      = _isp.ReadByte();
                    _interlaceMethod   = _isp.ReadByte();
                }
                else if (PLTE.Equals(marker))
                {
                    if (_colorType == 3)
                    {
                        var colorspace = new PdfArray();
                        colorspace.Add(PdfName.Indexed);
                        colorspace.Add(getColorspace());
                        colorspace.Add(new PdfNumber(len / 3 - 1));
                        var colortable = new ByteBuffer();
                        while ((len--) > 0)
                        {
                            colortable.Append_i(_isp.ReadByte());
                        }
                        colorspace.Add(new PdfString(_colorTable = colortable.ToByteArray()));
                        _additional.Put(PdfName.Colorspace, colorspace);
                    }
                    else
                    {
                        Utilities.Skip(_isp, len);
                    }
                }
                else if (pHYs.Equals(marker))
                {
                    var dx   = GetInt(_isp);
                    var dy   = GetInt(_isp);
                    var unit = _isp.ReadByte();
                    if (unit == 1)
                    {
                        _dpiX = (int)(dx * 0.0254f + 0.5f);
                        _dpiY = (int)(dy * 0.0254f + 0.5f);
                    }
                    else
                    {
                        if (dy != 0)
                        {
                            _xyRatio = dx / (float)dy;
                        }
                    }
                }
                else if (cHRM.Equals(marker))
                {
                    _xW      = GetInt(_isp) / 100000f;
                    _yW      = GetInt(_isp) / 100000f;
                    _xR      = GetInt(_isp) / 100000f;
                    _yR      = GetInt(_isp) / 100000f;
                    _xG      = GetInt(_isp) / 100000f;
                    _yG      = GetInt(_isp) / 100000f;
                    _xB      = GetInt(_isp) / 100000f;
                    _yB      = GetInt(_isp) / 100000f;
                    _hasChrm = !(Math.Abs(_xW) < 0.0001f || Math.Abs(_yW) < 0.0001f || Math.Abs(_xR) < 0.0001f || Math.Abs(_yR) < 0.0001f || Math.Abs(_xG) < 0.0001f || Math.Abs(_yG) < 0.0001f || Math.Abs(_xB) < 0.0001f || Math.Abs(_yB) < 0.0001f);
                }
                else if (sRGB.Equals(marker))
                {
                    var ri = _isp.ReadByte();
                    _intent  = _intents[ri];
                    _gamma   = 2.2f;
                    _xW      = 0.3127f;
                    _yW      = 0.329f;
                    _xR      = 0.64f;
                    _yR      = 0.33f;
                    _xG      = 0.3f;
                    _yG      = 0.6f;
                    _xB      = 0.15f;
                    _yB      = 0.06f;
                    _hasChrm = true;
                }
                else if (gAMA.Equals(marker))
                {
                    var gm = GetInt(_isp);
                    if (gm != 0)
                    {
                        _gamma = 100000f / gm;
                        if (!_hasChrm)
                        {
                            _xW      = 0.3127f;
                            _yW      = 0.329f;
                            _xR      = 0.64f;
                            _yR      = 0.33f;
                            _xG      = 0.3f;
                            _yG      = 0.6f;
                            _xB      = 0.15f;
                            _yB      = 0.06f;
                            _hasChrm = true;
                        }
                    }
                }
                else if (iCCP.Equals(marker))
                {
                    do
                    {
                        --len;
                    } while (_isp.ReadByte() != 0);
                    _isp.ReadByte();
                    --len;
                    var icccom = new byte[len];
                    var p      = 0;
                    while (len > 0)
                    {
                        var r = _isp.Read(icccom, p, len);
                        if (r < 0)
                        {
                            throw new IOException("Premature end of file.");
                        }

                        p   += r;
                        len -= r;
                    }
                    var iccp = PdfReader.FlateDecode(icccom, true);
                    icccom = null;
                    try
                    {
                        _iccProfile = IccProfile.GetInstance(iccp);
                    }
                    catch
                    {
                        _iccProfile = null;
                    }
                }
                else if (IEND.Equals(marker))
                {
                    break;
                }
                else
                {
                    Utilities.Skip(_isp, len);
                }
                Utilities.Skip(_isp, 4);
            }
        }
示例#25
0
        // ---------------------------------------------------------------------------
        public void Write(Stream stream)
        {
            string datasheet = Path.Combine(Utility.ResourcePdf, "datasheet.pdf");

            using (ZipFile zip = new ZipFile())
            {
                // Create a reader to extract info
                PdfReader reader = new PdfReader(datasheet);
                // Get the fields from the reader (read-only!!!)
                AcroFields form = reader.AcroFields;
                reader.Close();
                // Loop over the fields and get info about them
                StringBuilder sb = new StringBuilder();
                foreach (string key in form.Fields.Keys)
                {
                    sb.Append(key);
                    sb.Append(": ");
                    switch (form.GetFieldType(key))
                    {
                    case AcroFields.FIELD_TYPE_CHECKBOX:
                        sb.Append("Checkbox");
                        break;

                    case AcroFields.FIELD_TYPE_COMBO:
                        sb.Append("Combobox");
                        break;

                    case AcroFields.FIELD_TYPE_LIST:
                        sb.Append("List");
                        break;

                    case AcroFields.FIELD_TYPE_NONE:
                        sb.Append("None");
                        break;

                    case AcroFields.FIELD_TYPE_PUSHBUTTON:
                        sb.Append("Pushbutton");
                        break;

                    case AcroFields.FIELD_TYPE_RADIOBUTTON:
                        sb.Append("Radiobutton");
                        break;

                    case AcroFields.FIELD_TYPE_SIGNATURE:
                        sb.Append("Signature");
                        break;

                    case AcroFields.FIELD_TYPE_TEXT:
                        sb.Append("Text");
                        break;

                    default:
                        sb.Append("?");
                        break;
                    }
                    sb.Append(Environment.NewLine);
                }

                // Get possible values for field "CP_1"
                sb.Append("Possible values for CP_1:");
                sb.Append(Environment.NewLine);
                string[] states = form.GetAppearanceStates("CP_1");
                for (int i = 0; i < states.Length; i++)
                {
                    sb.Append(" - ");
                    sb.Append(states[i]);
                    sb.Append(Environment.NewLine);
                }

                // Get possible values for field "category"
                sb.Append("Possible values for category:");
                sb.Append(Environment.NewLine);
                states = form.GetAppearanceStates("category");
                for (int i = 0; i < states.Length - 1; i++)
                {
                    sb.Append(states[i]);
                    sb.Append(", ");
                }
                sb.Append(states[states.Length - 1]);

                zip.AddEntry(RESULT, sb.ToString());
                zip.AddFile(datasheet, "");
                zip.Save(stream);
            }
        }
示例#26
0
 internal virtual RandomAccessFileOrArray GetReaderFile(PdfReader reader)
 {
     return currentPdfReaderInstance.ReaderFile;
 }
示例#27
0
 public PdfReaderContentParser(PdfReader reader)
 {
     this.reader = reader;
 }
        /**
         * Writes information about the specified page in a PDF file to the specified output stream.
         * @since 2.1.5
         * @param pdfFile   a File instance referring to a PDF file
         * @param pageNum   the page number to read
         * @param out       the output stream to send the content to
         * @throws IOException
         */
        public static void ListContentStream(string pdfFile, int pageNum, TextWriter outp)
        {
            PdfReader reader = new PdfReader(pdfFile);

            ListContentStreamForPage(reader, pageNum, outp);
        }
示例#29
0
 public SmartPdfSplitter(PdfReader reader) {
     this.reader = reader;
     reader.Appendable = true;
     numberOfPages = reader.NumberOfPages;
     LOGGER.Info(String.Format("Creating a splitter for a document with {0} pages", numberOfPages));
 }
示例#30
0
        static void Main(string[] args)
        {
            var text      = new StringBuilder();
            var pdfReader = new PdfReader(ConfigurationManager.AppSettings["RegistrationFilePath"]);

            for (var page = 1; page <= pdfReader.NumberOfPages; page++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();

                var currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

                currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText)));
                text.Append(currentText);
            }

            pdfReader.Close();

            var lines          = text.ToString().Split(new[] { '\n' }, StringSplitOptions.None);
            var csvBuilderDict = new Dictionary <char, StringBuilder>();

            foreach (var line in lines)

            {
                try
                {
                    var match = Regex.Match(line, RowRegex);
                    if (match.Success)
                    {
                        var name            = match.Groups[1].ToString();
                        var nameParts       = name.Split(',');
                        var lastName        = nameParts[0].Trim().Replace(",", string.Empty);
                        var firstAndMidName = nameParts[1].Trim().Split(' ');
                        var firstName       = firstAndMidName[0].Replace(",", string.Empty);
                        var midName         = firstAndMidName.Length > 1 ? firstAndMidName[1].Replace(",", string.Empty) : null;
                        var address         = match.Groups[2].ToString().Trim().Replace(",", string.Empty);
                        var address1        = string.Empty;
                        var address2        = string.Empty;
                        var address3        = string.Empty;

                        var addressMatch = Regex.Match(address, AddressRegex);
                        if (addressMatch.Success)
                        {
                            address1 = addressMatch.Groups[1].ToString().Trim();
                            address2 = addressMatch.Groups[2].ToString().Trim();
                            address3 = addressMatch.Groups[3].ToString().Trim();
                        }

                        var registrationDate = new string(match.Groups[3].ToString().Replace(" ", string.Empty).Reverse().ToArray()).Replace(",", string.Empty);
                        var affiliation      = match.Groups[4].ToString().Trim().Replace(",", string.Empty);
                        var precinct         = match.Groups[5].ToString().Trim().Replace(",", string.Empty);
                        var ward             = match.Groups[6].ToString().Trim().Replace(",", string.Empty);
                        var vote0415         = match.Groups[7].ToString().Trim().Replace(",", string.Empty);
                        var vote1114         = match.Groups[8].ToString().Trim().Replace(",", string.Empty);
                        var vote0714         = match.Groups[9].ToString().Trim().Replace(",", string.Empty);
                        var vote0414         = match.Groups[10].ToString().Trim().Replace(",", string.Empty);
                        var vote0413         = match.Groups[11].ToString().Trim().Replace(",", string.Empty);
                        var vote1112         = match.Groups[12].ToString().Trim().Replace(",", string.Empty);
                        var smd = match.Groups[13].ToString().Trim().Replace(",", string.Empty);

                        if (!csvBuilderDict.ContainsKey(lastName.First()))
                        {
                            var newSb = new StringBuilder("LastName, FirstName, MiddleInitial, FullAddress, Address1, Address2, Address3, RegistrationDate, Affiliation, Precinct, Ward, Vote0415, Vote1114, Vote0714, Vote0414, Vote0413, Vote1112, SingleMemberDistrict");
                            newSb.Append(Environment.NewLine);
                            csvBuilderDict.Add(lastName.First(), newSb);
                        }

                        StringBuilder sb;
                        csvBuilderDict.TryGetValue(lastName.First(), out sb);
                        sb.AppendLine($"{lastName},{firstName},{midName},{address},{address1},{address2},{address3},{registrationDate},{affiliation},{precinct},{ward},{vote0415},{vote1114},{vote0714},{vote0414},{vote0413},{vote1112},{smd}");
                    }
                }
                catch (Exception e)
                {
                    // Ignore and move on
                }
            }

            foreach (var stringBuilderEntry in csvBuilderDict)
            {
                File.WriteAllText($"registration-{stringBuilderEntry.Key}.csv", stringBuilderEntry.Value.ToString());
            }
        }
示例#31
0
 /// <summary>Creates a PdfSigner instance.</summary>
 /// <remarks>
 /// Creates a PdfSigner instance. Uses a
 /// <see cref="System.IO.MemoryStream"/>
 /// instead of a temporary file.
 /// </remarks>
 /// <param name="reader">PdfReader that reads the PDF file</param>
 /// <param name="outputStream">OutputStream to write the signed PDF file</param>
 /// <param name="append">boolean to indicate whether the signing should happen in append mode or not</param>
 /// <exception cref="System.IO.IOException"/>
 public PdfSigner(PdfReader reader, Stream outputStream, bool append)
     : this(reader, outputStream, null, append)
 {
 }
示例#32
0
        protected void Page_Load(object sender, EventArgs e)
        {
            string    action    = Request["action"];
            string    filetype  = Request["filetype"];
            string    ordercode = Request["ordercode"];
            string    fileid    = Request["fileid"];
            string    userid    = Request["userid"] == "null" ? "" : Request["userid"];
            string    json      = "";
            string    sql       = "";
            DataTable dt;
            PdfReader pdfReader;
            IDatabase db = SeRedis.redis.GetDatabase();
            FileInfo  fi;

            string    username = "";
            DataTable dt_user  = DBMgr.GetDataTable("select * from Sys_User where ID='" + userid + "'");

            if (dt_user.Rows.Count > 0)
            {
                username = dt_user.Rows[0]["REALNAME"] + "";
            }

            switch (action)
            {
            case "merge":
                string         splitfilename = "";
                string         filestatus    = "";
                string         fileids       = Request["fileids"].Replace("[", "").Replace("]", "");
                string[]       fileidarray   = fileids.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                IList <string> pathlist      = new List <string>();
                //如果传输到这个页面的比如订单文件大于等于两个,需要将这文件合并后再输出
                if (fileidarray.Length > 1)
                {
                    for (int i = 0; i < fileidarray.Length; i++)
                    {
                        sql = "select * from list_attachment where ID=" + fileidarray[i];
                        dt  = DBMgr.GetDataTable(sql);
                        if (dt.Rows.Count > 0)
                        {
                            if (File.Exists(@"d:\ftpserver\" + dt.Rows[0]["FILENAME"] + ""))
                            {
                                pathlist.Add(dt.Rows[0]["FILENAME"] + "");
                            }
                        }
                    }
                    string orifilename = Guid.NewGuid().ToString();
                    splitfilename = "/" + DateTime.Now.ToString("yyyy-MM-dd") + "/" + orifilename + ".pdf";
                    MergePDFFiles(pathlist, @"d:\ftpserver\" + splitfilename);
                    sql = @"insert into list_attachment (id,FILENAME,ORIGINALNAME,UPLOADTIME,FILETYPE,ORDERCODE,FILESUFFIX,uploaduserid,ISUPLOAD)
                        values (list_attachment_id.nextval,'{0}','{1}',sysdate,'{2}','{3}','{4}','{5}','1')";
                    sql = string.Format(sql, splitfilename, orifilename + ".pdf", 44, ordercode, "pdf", userid);
                    DBMgr.ExecuteNonQuery(sql);
                    //合并完成后数据库删除原有文件,插入新的文件记录"/" + ordercode
                    try
                    {
                        for (int k = 0; k < fileidarray.Length; k++)
                        {
                            sql = "delete from list_attachment where id= '" + fileidarray[k] + "'";
                            DBMgr.ExecuteNonQuery(sql);
                        }
                        for (int j = 0; j < pathlist.Count; j++)
                        {
                            File.Delete(@"d:\ftpserver\" + pathlist[j]);
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                }
                Response.Write("{success:true}");
                Response.End();
                break;

            case "loadpdf":
                sql           = "select * from list_attachment where id='" + Request["fileid"] + "'";
                dt            = DBMgr.GetDataTable(sql);
                splitfilename = dt.Rows[0]["FILENAME"] + "";
                fileid        = Request["fileid"];
                filestatus    = dt.Rows[0]["SPLITSTATUS"] + ""; //0 未拆分  1 已拆分
                if (filestatus == "" || filestatus == "0")      //如果未拆分,初始化拆分明细界面内容并写入缓存
                {
                    //插入待压缩文件的记录【新的压缩方式】 因为工具端上传的文件是没有压缩日志的
                    sql = "select t.* from pdfshrinklog t where t.attachmentid='" + fileid + "'";
                    dt  = DBMgr.GetDataTable(sql);
                    if (dt.Rows.Count == 0)
                    {
                        sql = "insert into pdfshrinklog (id,attachmentid) values (pdfshrinklog_id.nextval,'" + fileid + "')";
                        DBMgr.ExecuteNonQuery(sql);
                    }
                    pdfReader = new PdfReader(@"d:\ftpserver\" + splitfilename);
                    int totalPages = pdfReader.NumberOfPages;
                    pdfReader.Close(); pdfReader.Dispose();
                    sql = "select * from sys_filetype where parentfiletypeid=44  order by sortindex asc";    //取该文件类型下面所有的子类型
                    dt  = DBMgr.GetDataTable(sql);
                    //构建页码表格数据
                    DataTable  dt2 = new DataTable();
                    DataColumn dc  = new DataColumn("ID");
                    dt2.Columns.Add(dc);
                    for (int k = 0; k < dt.Rows.Count; k++)
                    {
                        dc = new DataColumn("c-" + dt.Rows[k]["FILETYPEID"] + "@" + dt.Rows[k]["FILETYPENAME"]);
                        dt2.Columns.Add(dc);
                    }
                    for (int i = 1; i <= totalPages; i++)
                    {
                        DataRow dr = dt2.NewRow();
                        dr["ID"] = i;
                        dt2.Rows.Add(dr);
                    }
                    json = JsonConvert.SerializeObject(dt2);
                    //订单文件拆分明细保存至缓存数据库 并设置过期时间是24小时
                    db.StringSet(ordercode + ":" + fileid + ":splitdetail", json, TimeSpan.FromMinutes(1440));
                }
                else    //如果已拆分 直接读取缓存数据库
                {
                    if (db.KeyExists(ordercode + ":" + fileid + ":splitdetail"))
                    {
                        json = db.StringGet(ordercode + ":" + fileid + ":splitdetail");
                    }
                    else
                    {
                        pdfReader = new PdfReader(@"d:\ftpserver\" + splitfilename);
                        int totalPages = pdfReader.NumberOfPages;
                        pdfReader.Close(); pdfReader.Dispose();
                        sql = "select * from sys_filetype where parentfiletypeid=44 order by sortindex asc";    //取该文件类型下面所有的子类型
                        dt  = DBMgr.GetDataTable(sql);
                        //构建页码表格数据
                        DataTable  dt2 = new DataTable();
                        DataColumn dc  = new DataColumn("ID");
                        dt2.Columns.Add(dc);
                        for (int k = 0; k < dt.Rows.Count; k++)
                        {
                            dc = new DataColumn("c-" + dt.Rows[k]["FILETYPEID"] + "@" + dt.Rows[k]["FILETYPENAME"]);
                            dt2.Columns.Add(dc);
                        }
                        for (int i = 1; i <= totalPages; i++)
                        {
                            DataRow dr = dt2.NewRow();
                            dr["ID"] = i;
                            foreach (DataRow tmp in dt.Rows)    //一个子类型是一列  取每一列的值
                            {
                                sql = "select pages from list_attachmentdetail where ordercode='" + ordercode + "' and attachmentid=" + fileid + " and filetypeid=" + tmp["FILETYPEID"];
                                DataTable sub_dt = DBMgr.GetDataTable(sql);
                                if (sub_dt.Rows.Count > 0)
                                {
                                    string[] tmparray = sub_dt.Rows[0]["PAGES"].ToString().Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                                    if (tmparray.Contains <string>(i + ""))
                                    {
                                        dr["c-" + tmp["FILETYPEID"] + "@" + tmp["FILETYPENAME"]] = "√";
                                    }
                                    else
                                    {
                                        dr["c-" + tmp["FILETYPEID"] + "@" + tmp["FILETYPENAME"]] = "";
                                    }
                                }
                            }
                            dt2.Rows.Add(dr);
                        }
                        json = JsonConvert.SerializeObject(dt2);
                        db.StringSet(ordercode + ":" + fileid + ":splitdetail", json, TimeSpan.FromMinutes(1440));
                    }
                }
                //sql = "select * from sys_filetype where filetypeid=" + filetype;
                //dt = DBMgr.GetDataTable(sql);
                //string filetypename = dt.Rows[0]["FILETYPENAME"] + "";
                //如果是已经拆分好的 需要调出所有拆分好的文件类型 filetype:'" + filetypename + "'
                sql = @"select a.id,a.filetypeid,b.filetypename from LIST_ATTACHMENTDETAIL a left join sys_filetype
                          b on a.filetypeid=b.filetypeid where a.attachmentid='" + fileid + "' and a.ordercode='" + ordercode + "' order by b.sortindex asc";
                dt  = DBMgr.GetDataTable(sql);
                string json_type = JsonConvert.SerializeObject(dt);
                Response.Write(@"{success:true,src:'\/file\/" + splitfilename + "',rows:" + json + ",fileid:" + fileid + ",filestatus:'" + filestatus + "',result:" + json_type + "}");
                Response.End();
                break;

            case "split":
                int    filepages = 0;
                string data      = Request["pages"];
                JArray jsonarray = JsonConvert.DeserializeObject <JArray>(data);
                db.StringSet(ordercode + ":" + fileid + ":splitdetail", data);
                sql = "select * from list_attachment where ID='" + fileid + "'";
                dt  = DBMgr.GetDataTable(sql);
                //2016-6-16压缩改用pdfshrink在后台执行
                string compressname = "";
                //如果pdfshrink压缩文件存在
                if (File.Exists(@"d:\ftpserver\" + (dt.Rows[0]["FILENAME"] + "").Replace(".pdf", "").Replace(".PDF", "") + "-web.pdf"))
                {
                    compressname = @"d:\ftpserver\" + (dt.Rows[0]["FILENAME"] + "").Replace(".pdf", "").Replace(".PDF", "") + "-web.pdf";
                }
                else
                {
                    if (File.Exists(@"d:\Compress\" + fileid + ".pdf"))    //如果代码压缩的文件存在
                    {
                        compressname = @"d:\Compress\" + fileid + ".pdf";
                    }
                    else
                    {
                        fi = new FileInfo(@"D:\ftpserver\" + dt.Rows[0]["FILENAME"]);
                        CompressPdf(fileid, fi);    //不存在则生成压缩文件再进行拆分
                        compressname = @"d:\Compress\" + fileid + ".pdf";
                    }
                }
                if (File.Exists(compressname))    //如果压缩文件存在
                {
                    try
                    {
                        if ((new FileInfo(@"D:\ftpserver\" + dt.Rows[0]["FILENAME"])).Length / 1024 == (new FileInfo(compressname)).Length / 1024)    //压缩文件根源文件大小一样
                        {
                            //没压缩成功  新增压缩任务
                            DataTable dt_shrink = new DataTable();
                            dt_shrink = DBMgr.GetDataTable("select * from pdfshrinklog where attachmentid='" + fileid + "' and ISCOMPRESS=0");
                            if (dt_shrink.Rows.Count <= 0)
                            {
                                sql = "insert into pdfshrinklog (id,attachmentid) values (pdfshrinklog_id.nextval,'" + fileid + "')";
                                DBMgr.ExecuteNonQuery(sql);
                            }
                            Response.Write("{success:false}");    //没压缩成功
                        }
                        else
                        {
                            pdfReader = new PdfReader(compressname); filepages = pdfReader.NumberOfPages;
                            sql       = "select * from sys_filetype where parentfiletypeid=" + filetype;//取该文件类型下面所有的子类型
                            dt        = DBMgr.GetDataTable(sql);
                            IList <Int32> pagelist;
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                int rotation = 0;
                                pagelist = new List <Int32>();
                                foreach (JObject jo in jsonarray)
                                {
                                    if (jo.Value <string>("c-" + dt.Rows[i]["FILETYPEID"] + "@" + dt.Rows[i]["FILETYPENAME"]) == "√")
                                    {
                                        pagelist.Add(jo.Value <Int32>("ID"));   //统计出该子类型下面所有的页码
                                    }
                                }
                                if (pagelist.Count > 0)
                                {
                                    string new_name = DateTimeToUnixTimestamp(DateTime.Now) + "";
                                    if (!Directory.Exists(@"d:/ftpserver/" + dt.Rows[i]["FILETYPEID"] + @"/" + ordercode))
                                    {
                                        Directory.CreateDirectory(@"d:/ftpserver/" + dt.Rows[i]["FILETYPEID"] + @"/" + ordercode);
                                    }
                                    string     newfilename = @"d:/ftpserver/" + dt.Rows[i]["FILETYPEID"] + @"/" + ordercode + @"/" + ordercode + "_" + new_name + ".pdf";
                                    FileStream fs          = new FileStream(newfilename, FileMode.Create);
                                    Document   newDocument = new Document();
                                    PdfWriter  pdfWriter   = PdfWriter.GetInstance(newDocument, fs);
                                    pdfWriter.CloseStream = true;
                                    newDocument.Open();
                                    PdfContentByte pdfContentByte = pdfWriter.DirectContent;
                                    foreach (Int32 page in pagelist)
                                    {
                                        newDocument.SetPageSize(pdfReader.GetPageSizeWithRotation(page));
                                        newDocument.NewPage();
                                        PdfImportedPage importedPage = pdfWriter.GetImportedPage(pdfReader, page);
                                        rotation = pdfReader.GetPageRotation(page);
                                        pdfContentByte.AddTemplate(importedPage, 0, 0);
                                        if (rotation == 90 || rotation == 270)
                                        {
                                            pdfContentByte.AddTemplate(importedPage, 0, -1f, 1f, 0, 0, pdfReader.GetPageSizeWithRotation(page).Height);
                                        }
                                        else
                                        {
                                            pdfContentByte.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0);
                                        }
                                    }
                                    fs.Flush();
                                    newDocument.Close();
                                    sql = "insert into LIST_ATTACHMENTDETAIL (id,sourcefilename,filename,attachmentid,filetypeid,splitetime,ordercode,pages) values (list_attachmentdetail_id.nextval,'{0}','{1}','{2}','{3}',sysdate,'{4}','{5}')";
                                    sql = String.Format(sql, dt.Rows[i]["FILETYPEID"] + @"/" + ordercode + @"/" + ordercode + "_" + new_name + ".pdf", ordercode + "_" + new_name + ".pdf", fileid, dt.Rows[i]["FILETYPEID"], ordercode, string.Join(",", pagelist.ToArray()));
                                    DBMgr.ExecuteNonQuery(sql);
                                }
                            }
                            pdfReader.Close(); pdfReader.Dispose();

                            //拆分完成后更新主文件的状态,同时将拆分好的类型送到页面形成按钮便于查看
                            sql = "update LIST_ATTACHMENT set SPLITSTATUS=1,CONFIRMSTATUS=1,FILEPAGES=" + filepages + " where id=" + fileid;
                            DBMgr.ExecuteNonQuery(sql);

                            DataTable dt_list_order = DBMgr.GetDataTable("select * from LIST_ORDER where  code='" + ordercode + "'");
                            sql = "update LIST_ORDER set FILESTATUS=1,FILESPLITTIME=sysdate,FILEPAGES=" + filepages
                                  + ",FILESPLITEUSERID='" + userid + "',FILESPLITEUSERNAME='******' where code='" + ordercode + "'";
                            int resultcode = DBMgr.ExecuteNonQuery(sql);
                            if (resultcode > 0)
                            {
                                //若正常拆分在字段修改历史记录表中记录
                                sql = "insert into list_updatehistory(id,ordercode,type,userid, updatetime, oldfield,newfield,name,fieldname,code,field)"
                                      + " values(LIST_UPDATEHISTORY_ID.nextval,'" + ordercode + "','1','" + userid + "',sysdate,'" + dt_list_order.Rows[0]["FILESTATUS"] + "','1','" + username + "','业务—文件状态-WEB','"
                                      + ordercode + "','FILESTATUS')";
                                DBMgr.ExecuteNonQuery(sql);
                            }
                            sql  = "select a.id,a.filetypeid,b.filetypename from LIST_ATTACHMENTDETAIL a left join sys_filetype b on a.filetypeid=b.filetypeid where a.ordercode='" + ordercode + "' order by b.sortindex asc";
                            dt   = DBMgr.GetDataTable(sql);
                            json = JsonConvert.SerializeObject(dt);
                            Response.Write("{success:true,result:" + json + "}");
                        }
                    }
                    catch (Exception ex)
                    {
                        string error = "{\"ordercode\":\"" + ordercode + "\",\"fileid\":\"" + fileid + "\",\"error\":\"" + ex.Message + "\"}";
                        db.ListRightPush("spliterror", error);
                        Response.Write("{success:false,result:[" + error + "]}");    //拆分异常
                    }
                }
                else
                {
                    Response.Write("{success:false}");    //压缩文件不存在
                }
                Response.End();
                break;

            case "cancelsplit":
                //删除文件明细
                string fileids_temp = "";
                sql = "select * from list_attachmentdetail where ordercode='" + ordercode + "'";
                dt  = DBMgr.GetDataTable(sql);
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (!fileids_temp.Contains(dt.Rows[i]["attachmentid"].ToString()))
                    {
                        fileids_temp = fileids_temp + dt.Rows[i]["attachmentid"].ToString() + ",";
                        db.KeyDelete(ordercode + ":" + fileid + ":splitdetail");
                    }
                    if (File.Exists(@"d:/ftpserver/" + dt.Rows[i]["SOURCEFILENAME"]))
                    {
                        File.Delete(@"d:/ftpserver/" + dt.Rows[i]["SOURCEFILENAME"]);
                    }
                    sql = "delete from list_attachmentdetail where id=" + dt.Rows[i]["ID"];
                    DBMgr.ExecuteNonQuery(sql);
                }

                if (fileids_temp != "")
                {
                    fileids_temp = fileids_temp.Substring(0, fileids_temp.Length - 1);
                    sql          = "update LIST_ATTACHMENT set SPLITSTATUS=0 where id in(" + fileids_temp + ")";
                    DBMgr.ExecuteNonQuery(sql);
                }

                DataTable dt_list_order_c = DBMgr.GetDataTable("select * from LIST_ORDER where  code='" + ordercode + "'");

                //20160922赵艳提出 拆分完,需要更新订单表的 拆分人和时间,和文件状态
                sql = "update LIST_ORDER set FILESTATUS=0,FILEPAGES=null,FILESPLITEUSERNAME=null,FILESPLITEUSERID=null,FILESPLITTIME=null where code='" + ordercode + "'";
                DBMgr.ExecuteNonQuery(sql);

                sql = "insert into list_updatehistory(id,ordercode,type,userid, updatetime, oldfield,newfield,name,fieldname,code,field)"
                      + " values(LIST_UPDATEHISTORY_ID.nextval,'" + ordercode + "','1','" + userid + "',sysdate,'" + dt_list_order_c.Rows[0]["FILESTATUS"] + "','0','" + username + "','业务—文件状态-WEB','"
                      + ordercode + "','FILESTATUS')";
                DBMgr.ExecuteNonQuery(sql);

                Response.Write("{success:true}");
                Response.End();
                break;

            case "loadfile":
                sql = "select * from list_attachmentdetail where id='" + fileid + "'";
                dt  = DBMgr.GetDataTable(sql);
                if (dt.Rows.Count > 0)
                {
                    Response.Write(@"{success:true,src:'/file/" + dt.Rows[0]["SOURCEFILENAME"] + "'}");
                    Response.End();
                }
                break;

            case "adjustpage":
                int    currentPage = Convert.ToInt32(Request["currentpage"]);
                string direction   = Request["direction"];
                sql = "select * from list_attachment where ID=" + fileid;
                dt  = DBMgr.GetDataTable(sql);
                if (dt.Rows.Count > 0)
                {
                    if (File.Exists(@"d:\ftpserver\" + dt.Rows[0]["FILENAME"] + ""))
                    {
                        string newid   = Guid.NewGuid().ToString();
                        string outFile = dt.Rows[0]["FILETYPE"] + @"/" + ordercode + @"/" + newid + ".pdf";
                        AdjustPage(dt.Rows[0]["FILENAME"] + "", currentPage, direction, @"d:/ftpserver/" + outFile);
                        //删除老文件 并更新该记录的FILENAME字段
                        //2016-8-17测试发现调整页码顺序重新生成文件,删除时有可能文件正在使用中,故原始文件暂不需要删除 下面这句话会报错
                        //File.Delete(@"d:/ftpserver/" + dt.Rows[0]["FILENAME"]);
                        sql = "update list_attachment set FileName='" + outFile + "',fileguid='" + newid + "',originalname='" + newid + ".pdf'  where id=" + fileid;
                        DBMgr.ExecuteNonQuery(sql);
                        Response.Write(@"{success:true,src:'/file/" + outFile + "'}");
                        Response.End();
                    }
                }
                break;

            case "compress":
                string ser_path = Server.MapPath(Request["path"]);
                fi = new FileInfo(ser_path);
                CompressPdf(fileid, fi);
                break;

            case "loadform":
                sql = "SELECT * FROM list_order WHERE CODE = '" + ordercode + "'";
                dt  = DBMgr.GetDataTable(sql);
                if (!string.IsNullOrEmpty(dt.Rows[0]["ASSOCIATENO"].ToString()))
                {
                    sql = "SELECT * FROM list_order WHERE CODE != '" + ordercode + "' and ASSOCIATENO='" + dt.Rows[0]["ASSOCIATENO"] + "'";
                    DataTable dt_gl = DBMgr.GetDataTable(sql);
                    if (dt_gl.Rows.Count > 0)
                    {
                        dt.Rows[0]["ASSOCIATENO"] = dt_gl.Rows[0]["CODE"];
                    }
                    else
                    {
                        dt.Rows[0]["ASSOCIATENO"] = "";
                    }
                }
                string result = JsonConvert.SerializeObject(dt).Replace("[", "").Replace("]", "");
                sql = "select * from list_attachment where ordercode='" + ordercode + "' and filetype=44 order by uploadtime asc";
                DataTable dt_file     = DBMgr.GetDataTable(sql);
                string    result_file = JsonConvert.SerializeObject(dt_file);
                Response.Write("{formdata:" + result + ",filedata:" + result_file + "}");
                Response.End();
                break;

            case "loadattach":
                sql = "select * from list_attachment where ordercode='" + ordercode + "' and filetype=44 order by uploadtime asc";
                DataTable dt_attach     = DBMgr.GetDataTable(sql);
                string    result_attach = JsonConvert.SerializeObject(dt_attach);
                Response.Write("{filedata:" + result_attach + "}");
                Response.End();
                break;

            case "delete":    //删除及明细
                try
                {
                    string   del_fileids     = Request["fileids"].Replace("[", "").Replace("]", "");
                    string[] del_fileidarray = del_fileids.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);

                    for (int i = 0; i < del_fileidarray.Length; i++)
                    {
                        sql = "select * from list_attachment where ID=" + del_fileidarray[i];
                        dt  = DBMgr.GetDataTable(sql);
                        if (dt.Rows.Count > 0)
                        {
                            //删除明细
                            sql = "select * from list_attachmentdetail where ordercode='" + ordercode + "' and attachmentid=" + del_fileidarray[i];
                            DataTable dt_detail = DBMgr.GetDataTable(sql);
                            for (int j = 0; j < dt_detail.Rows.Count; j++)
                            {
                                if (File.Exists(@"d:/ftpserver/" + dt_detail.Rows[j]["SOURCEFILENAME"]))
                                {
                                    File.Delete(@"d:/ftpserver/" + dt_detail.Rows[j]["SOURCEFILENAME"]);
                                }
                                sql = "delete from list_attachmentdetail where id=" + dt_detail.Rows[j]["ID"];
                                DBMgr.ExecuteNonQuery(sql);
                            }

                            //删除
                            if (File.Exists(@"d:/ftpserver/" + dt.Rows[0]["FILENAME"]))
                            {
                                File.Delete(@"d:/ftpserver/" + dt.Rows[0]["FILENAME"]);
                            }

                            sql = "delete from list_attachment where id= '" + del_fileidarray[i] + "'";
                            DBMgr.ExecuteNonQuery(sql);

                            db.KeyDelete(ordercode + ":" + del_fileidarray[i] + ":splitdetail");
                        }
                    }

                    sql = "update LIST_ORDER set FILESTATUS=0,FILEPAGES=null,FILESPLITEUSERNAME=null,FILESPLITEUSERID=null,FILESPLITTIME=null where code='" + ordercode + "'";
                    DBMgr.ExecuteNonQuery(sql);

                    Response.Write("{success:true}");
                }
                catch (Exception ex)
                {
                    Response.Write("{success:false,error:\"" + ex.Message + "\"}");
                }

                Response.End();
                break;
            }
        }
示例#33
0
        /// <summary>
        /// Firma un documento
        /// </summary>
        /// <param name="Source">Documento origen</param>
        /// <param name="Target">Documento destino</param>
        /// <param name="Certificate">Certificado a utilizar</param>
        /// <param name="Reason">Razón de la firma</param>
        /// <param name="Location">Ubicación</param>
        /// <param name="AddVisibleSign">Establece si hay que agregar la firma visible al documento</param>
        public static void SignHashed(string Source, string Target, SysX509.X509Certificate2 Certificate, string Reason, string Location, bool AddVisibleSign)
        {
            X509CertificateParser objCP = new X509CertificateParser();

            X509Certificate[] objChain = new X509Certificate[] { objCP.ReadCertificate(Certificate.RawData) };

            PdfReader              objReader  = new PdfReader(Source);
            PdfStamper             objStamper = PdfStamper.CreateSignature(objReader, new FileStream(Target, FileMode.Create), '\0');
            PdfSignatureAppearance objSA      = objStamper.SignatureAppearance;

            if (AddVisibleSign)
            {
                objSA.SetVisibleSignature(new Rectangle(50, 50, 150, 100), 2, null);
            }

            objSA.SignDate = DateTime.Now;
            objSA.SetCrypto(null, objChain, null, null);
            objSA.Reason      = Reason;
            objSA.Location    = Location;
            objSA.Acro6Layers = true;
            objSA.Render      = PdfSignatureAppearance.SignatureRender.NameAndDescription;
            PdfSignature objSignature = new PdfSignature(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);

            objSignature.Date = new PdfDate(objSA.SignDate);
            objSignature.Name = PdfPKCS7.GetSubjectFields(objChain[0]).GetField("CN");
            if (objSA.Reason != null)
            {
                objSignature.Reason = objSA.Reason;
            }
            if (objSA.Location != null)
            {
                objSignature.Location = objSA.Location;
            }
            objSA.CryptoDictionary = objSignature;
            int       intCSize = 4000;
            Hashtable objTable = new Hashtable();

            objTable[PdfName.CONTENTS] = intCSize * 2 + 2;
            objSA.PreClose(objTable);

            HashAlgorithm objSHA1 = new SHA1CryptoServiceProvider();

            Stream objStream = objSA.RangeStream;
            int    intRead   = 0;

            byte[] bytBuffer = new byte[8192];
            while ((intRead = objStream.Read(bytBuffer, 0, 8192)) > 0)
            {
                objSHA1.TransformBlock(bytBuffer, 0, intRead, bytBuffer, 0);
            }
            objSHA1.TransformFinalBlock(bytBuffer, 0, 0);

            byte[] bytPK  = SignMsg(objSHA1.Hash, Certificate, false);
            byte[] bytOut = new byte[intCSize];

            PdfDictionary objDict = new PdfDictionary();

            Array.Copy(bytPK, 0, bytOut, 0, bytPK.Length);

            objDict.Put(PdfName.CONTENTS, new PdfString(bytOut).SetHexWriting(true));
            objSA.Close(objDict);
        }
示例#34
0
        private void CompressPdf(string fileId, FileInfo fi)
        {
            //ITextSharp是一个生成Pdf文件的开源项目
            PdfReader reader = new PdfReader(fi.FullName);

            if (File.Exists(@"D:\Compress\" + fileId + ".pdf"))//先判断对应文件ID的压缩文件是否存在  如果存在,将其删除
            {
                File.Delete(@"D:\Compress\" + fileId + ".pdf");
            }
            string newPath = @"D:\Compress\" + fileId + ".pdf";

            using (FileStream fs = new FileStream(newPath, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (PdfStamper stamper = new PdfStamper(reader, fs))
                {
                    #region
                    for (int i = 1; i <= reader.NumberOfPages; i++)
                    {
                        PdfDictionary page      = reader.GetPageN(i);
                        PdfDictionary resources = (PdfDictionary)PdfReader.GetPdfObject(page.Get(PdfName.RESOURCES));
                        PdfDictionary xobject   = (PdfDictionary)PdfReader.GetPdfObject(resources.Get(PdfName.XOBJECT));
                        if (xobject != null)
                        {
                            PdfObject obj;
                            foreach (PdfName name in xobject.Keys)
                            {
                                obj = xobject.Get(name);
                                if (obj.IsIndirect())
                                {
                                    //Get the current key as a PDF object
                                    PdfDictionary imgObject = (PdfDictionary)PdfReader.GetPdfObject(obj);
                                    //See if its an image
                                    if (imgObject.Get(PdfName.SUBTYPE).Equals(PdfName.IMAGE))
                                    {
                                        //NOTE: There's a bunch of different types of filters, I'm only handing the simplest one here which is basically raw JPG, you'll have to research others
                                        if (imgObject.Get(PdfName.FILTER).Equals(PdfName.DCTDECODE))
                                        {
                                            //Get the raw bytes of the current image
                                            byte[] oldBytes = PdfReader.GetStreamBytesRaw((PRStream)imgObject);
                                            //Will hold bytes of the compressed image later
                                            byte[] newBytes;
                                            //Wrap a stream around our original image
                                            using (MemoryStream sourceMS = new MemoryStream(oldBytes))
                                            {
                                                //Convert the bytes into a .Net image
                                                using (System.Drawing.Image oldImage = Bitmap.FromStream(sourceMS))
                                                {
                                                    //Shrink the image to 90% of the original
                                                    using (System.Drawing.Image newImage = ShrinkImage(oldImage, 40 / 100f))
                                                    {
                                                        //Convert the image to bytes using JPG at 85%
                                                        newBytes = ConvertImageToBytes(newImage, 35);
                                                    }
                                                }
                                            }
                                            //Create a new iTextSharp image from our bytes
                                            iTextSharp.text.Image compressedImage = iTextSharp.text.Image.GetInstance(newBytes);
                                            //Kill off the old image
                                            PdfReader.KillIndirect(obj);
                                            //Add our image in its place
                                            stamper.Writer.AddDirectImageSimple(compressedImage, (PRIndirectReference)obj);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    #endregion
                }
            }
            reader.Close(); reader.Dispose();
        }
示例#35
0
        /**
         * Creates a new PDF based on the one in the reader
         * @param reader a reader with a PDF file
         * @throws IOException
         * @throws DocumentException
         */
        private void ManipulateWithStamper(PdfReader reader)
        {
            PdfStamper stamper = new PdfStamper(reader, new MemoryStream());

            stamper.Close();
        }
示例#36
0
        protected void AdjustPage(string filename, int currentPage, string direction, string outFile)
        {
            PdfReader reader;
            Document  document = new Document();
            // Define the output place, and add the document to the stream
            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outFile, FileMode.Create));

            // Open document
            document.Open();
            // PDF ContentByte
            PdfContentByte cb = writer.DirectContent;
            // PDF import page
            PdfImportedPage newPage;

            reader = new PdfReader(@"d:\ftpserver\" + filename);
            int iPageNum = reader.NumberOfPages;

            for (int j = 1; j <= iPageNum; j++)
            {
                if (direction == "down")
                {
                    if (currentPage == j)
                    {
                        document.NewPage();
                        newPage = writer.GetImportedPage(reader, j + 1);
                        cb.AddTemplate(newPage, 0, 0);
                        document.NewPage();
                        newPage = writer.GetImportedPage(reader, j);
                        cb.AddTemplate(newPage, 0, 0);
                        j++;
                    }
                    else
                    {
                        document.NewPage();
                        newPage = writer.GetImportedPage(reader, j);
                        cb.AddTemplate(newPage, 0, 0);
                    }
                }
                if (direction == "up")
                {
                    if (currentPage == j + 1)
                    {
                        document.NewPage();
                        newPage = writer.GetImportedPage(reader, j + 1);
                        cb.AddTemplate(newPage, 0, 0);
                        document.NewPage();
                        newPage = writer.GetImportedPage(reader, j);
                        cb.AddTemplate(newPage, 0, 0);
                        j++;
                    }
                    else
                    {
                        document.NewPage();
                        newPage = writer.GetImportedPage(reader, j);
                        cb.AddTemplate(newPage, 0, 0);
                    }
                }
                //if (direction == "delete")  by panhuaguo 2016-4-19 梁总决定不让删除原始文件的某一页
                //{
                //    if (currentPage != j)
                //    {
                //        document.NewPage();
                //        newPage = writer.GetImportedPage(reader, j);
                //        cb.AddTemplate(newPage, 0, 0);
                //    }
                //}
            }
            document.Close();
        }
示例#37
0
        static void Main()
        {
            const string watermark = "PDFsharp";
            const int    emSize    = 150;

            // Get a fresh copy of the sample PDF file.
            const string filename = "Portable Document Format.pdf";
            var          file     = Path.Combine(Directory.GetCurrentDirectory(), filename);

            File.Copy(Path.Combine("../../../../assets/PDFs/", filename), file, true);

            // Remove ReadOnly attribute from the copy.
            File.SetAttributes(file, File.GetAttributes(file) & ~FileAttributes.ReadOnly);

            // Create the font for drawing the watermark.
            var font = new XFont("Times New Roman", emSize, XFontStyle.BoldItalic);

            // Open an existing document for editing and loop through its pages.
            var document = PdfReader.Open(filename);

            // Set version to PDF 1.4 (Acrobat 5) because we use transparency.
            if (document.Version < 14)
            {
                document.Version = 14;
            }

            for (var idx = 0; idx < document.Pages.Count; idx++)
            {
                var page = document.Pages[idx];

                switch (idx % 3)
                {
                case 0:
                {
                    // Variation 1: Draw a watermark as a text string.

                    // Get an XGraphics object for drawing beneath the existing content.
                    var gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Prepend);

                    // Get the size (in points) of the text.
                    var size = gfx.MeasureString(watermark, font);

                    // Define a rotation transformation at the center of the page.
                    gfx.TranslateTransform(page.Width / 2, page.Height / 2);
                    gfx.RotateTransform(-Math.Atan(page.Height / page.Width) * 180 / Math.PI);
                    gfx.TranslateTransform(-page.Width / 2, -page.Height / 2);

                    // Create a string format.
                    var format = new XStringFormat();
                    format.Alignment     = XStringAlignment.Near;
                    format.LineAlignment = XLineAlignment.Near;

                    // Create a dimmed red brush.
                    XBrush brush = new XSolidBrush(XColor.FromArgb(128, 255, 0, 0));

                    // Draw the string.
                    gfx.DrawString(watermark, font, brush,
                                   new XPoint((page.Width - size.Width) / 2, (page.Height - size.Height) / 2),
                                   format);
                }
                break;

                case 1:
                {
                    // Variation 2: Draw a watermark as an outlined graphical path.
                    // NYI: Does not work in Core build.

                    // Get an XGraphics object for drawing beneath the existing content.
                    var gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Prepend);

                    // Get the size (in points) of the text.
                    var size = gfx.MeasureString(watermark, font);

                    // Define a rotation transformation at the center of the page.
                    gfx.TranslateTransform(page.Width / 2, page.Height / 2);
                    gfx.RotateTransform(-Math.Atan(page.Height / page.Width) * 180 / Math.PI);
                    gfx.TranslateTransform(-page.Width / 2, -page.Height / 2);

                    // Create a graphical path.
                    var path = new XGraphicsPath();

                    // Create a string format.
                    var format = new XStringFormat();
                    format.Alignment     = XStringAlignment.Near;
                    format.LineAlignment = XLineAlignment.Near;

                    // Add the text to the path.
                    // AddString is not implemented in PDFsharp Core.
                    path.AddString(watermark, font.FontFamily, XFontStyle.BoldItalic, 150,
                                   new XPoint((page.Width - size.Width) / 2, (page.Height - size.Height) / 2),
                                   format);

                    // Create a dimmed red pen.
                    var pen = new XPen(XColor.FromArgb(128, 255, 0, 0), 2);

                    // Stroke the outline of the path.
                    gfx.DrawPath(pen, path);
                }
                break;

                case 2:
                {
                    // Variation 3: Draw a watermark as a transparent graphical path above text.
                    // NYI: Does not work in Core build.

                    // Get an XGraphics object for drawing above the existing content.
                    var gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Append);

                    // Get the size (in points) of the text.
                    var size = gfx.MeasureString(watermark, font);

                    // Define a rotation transformation at the center of the page.
                    gfx.TranslateTransform(page.Width / 2, page.Height / 2);
                    gfx.RotateTransform(-Math.Atan(page.Height / page.Width) * 180 / Math.PI);
                    gfx.TranslateTransform(-page.Width / 2, -page.Height / 2);

                    // Create a graphical path.
                    var path = new XGraphicsPath();

                    // Create a string format.
                    var format = new XStringFormat();
                    format.Alignment     = XStringAlignment.Near;
                    format.LineAlignment = XLineAlignment.Near;

                    // Add the text to the path.
                    // AddString is not implemented in PDFsharp Core.
                    path.AddString(watermark, font.FontFamily, XFontStyle.BoldItalic, 150,
                                   new XPoint((page.Width - size.Width) / 2, (page.Height - size.Height) / 2),
                                   format);

                    // Create a dimmed red pen and brush.
                    var    pen   = new XPen(XColor.FromArgb(50, 75, 0, 130), 3);
                    XBrush brush = new XSolidBrush(XColor.FromArgb(50, 106, 90, 205));

                    // Stroke the outline of the path.
                    gfx.DrawPath(pen, brush, path);
                }
                break;
                }
            }
            // Save the document...
            document.Save(filename);
            // ...and start a viewer
            Process.Start(filename);
        }
示例#38
0
        public static void InspectDocs(
            SearchOption a_so = SearchOption.AllDirectories)
        {
            string sCorePath = AppCfg.ArchivePath_Core;

            DirectoryInfo di_Cor = new DirectoryInfo(sCorePath);


            var fi_Coll_Core_0 = di_Cor.GetFiles("*.corPdf",
                                                 //SearchOption.AllDirectories);
                                                 a_so);


            if (fi_Coll_Core_0.Length == 0)
            {
                return;
            }


            var fi_Coll_Core =
                fi_Coll_Core_0.OrderBy(f => f.Name);


            DataTable tbl_Docs = null;
            {
                string stmt =

                    " SELECT     Document_ID, IsInspected " +
                    " FROM         dbo.Documents " +
                    " WHERE     (IsInspected = 0) " +
                    " Order by Document_ID ";

                tbl_Docs = DataHelper.ExecuteSqlCmd(stmt);
            }


            SqlBatchMgr sbm1 = new SqlBatchMgr(
                SqlBatchMgr.ExecutionType.ExecNonQuery);

            int nIdx_Row = 0;

            foreach (FileInfo fi in fi_Coll_Core)
            {
                int nDocument_ID = int.Parse(
                    fi.Name.Substring(0, 10));

                for (; nIdx_Row < tbl_Docs.Rows.Count; nIdx_Row++)
                {
                    int nDocID_Row =
                        (int)tbl_Docs.Rows[nIdx_Row]["Document_ID"];

                    if (nDocID_Row < nDocument_ID)
                    {
                        continue;
                    }
                    else if (nDocID_Row > nDocument_ID)
                    {
                        break;
                    }


                    //if (nIdx_Row >= tbl_Docs.Rows.Count)
                    //break;



                    //  hthm tmp
                    //if (nDocument_ID < 394)
                    //continue;

                    int nofPages = -1;

                    bool bIsCorrupted = true;

                    PdfReader pdfReader = null;

                    try
                    {
                        pdfReader = new PdfReader(fi.FullName);

                        nofPages = pdfReader.NumberOfPages;

                        bIsCorrupted = false;

                        //pdfReader.Close();
                    }
                    catch (Exception exp)
                    {
                    }
                    finally
                    {
                        if (pdfReader != null)
                        {
                            pdfReader.Close();
                        }
                    }

                    {
                        string stmt =

                            " update Documents set " +
                            " NofPages = %NofPages, " +
                            " IsCorrupted = '%IsCorrupted', " +
                            " IsInspected = 'True' " +
                            " where Document_ID = %Document_ID ";

                        stmt = stmt.Replace("%NofPages",
                                            nofPages.ToString());

                        stmt = stmt.Replace("%IsCorrupted",
                                            bIsCorrupted.ToString());

                        stmt = stmt.Replace("%Document_ID",
                                            nDocument_ID.ToString());

                        sbm1.AddStatment(stmt);
                    }
                }
            }

            sbm1.ExecuteNonQuery();
        }
        private void InputDir(string srcPath)
        {
            string fullName, paperName, paperXiangduiPath, paperTextXiangduiPath;

            try
            {
                DirectoryInfo    dir      = new DirectoryInfo(srcPath);
                FileSystemInfo[] fileinfo = dir.GetFileSystemInfos();  //返回目录中所有文件和子目录
                foreach (FileSystemInfo i in fileinfo)
                {
                    if (i is DirectoryInfo)            //判断是否文件夹
                    {
                        DirectoryInfo subdir = new DirectoryInfo(i.FullName);
                        //subdir.Delete(true);          //删除子目录和文件
                        InputDir(subdir.FullName);
                    }
                    else
                    {
                        if (i.Extension == ".pdf" || i.Extension == ".PDF" || i.Extension == ".txt" || i.Extension == ".TXT")
                        {
                            fullName  = i.FullName;
                            paperName = i.Name.Substring(0, i.Name.Length - 4);

                            //判断文章表中是否有该名称的文件
                            var data = (from wz in wz_dt
                                        where wz.文章名 == paperName
                                        select wz).ToList();
                            if (data.Count == 0)
                            {
                                //如果文章表中没有,则在文章表中创建新的记录
                                DataRow newRow;
                                newRow        = wz_dt.NewRow();
                                newRow["文章名"] = paperName;

                                //将绝对路径改为相对路径
                                MatchCollection mc;
                                List <Regex>    regex_list = new List <Regex>();
                                regex_list.Add(new Regex("科学研究"));
                                regex_list.Add(new Regex("社会科学"));
                                regex_list.Add(new Regex("文学艺术"));
                                regex_list.Add(new Regex("应用科学"));
                                regex_list.Add(new Regex("哲学"));
                                regex_list.Add(new Regex("自然科学"));

                                for (int regex_int = 0; regex_int < regex_list.Count; regex_int++)
                                {
                                    Regex r = regex_list[regex_int];
                                    mc = r.Matches(fullName);
                                    if (mc.Count != 0)
                                    {
                                        int index = mc[0].Index;        //正则表达式位置

                                        int qian_location = 1;          //正则表达式的前一字符位置
                                        int hou_location;               //正则表达式的后一字符位置
                                        if (mc[0].Value == "哲学")
                                        {
                                            hou_location = 2;
                                        }
                                        else
                                        {
                                            hou_location = 4;
                                        }

                                        int houZhui_length = 4;         //扩展名长度

                                        char qian = fullName[index - qian_location];
                                        char hou  = fullName[index + hou_location];
                                        if ((qian == '/' || qian == '\\') & (hou == '/' || hou == '\\'))
                                        {
                                            if (i.Extension == ".pdf" || i.Extension == ".PDF")
                                            {
                                                paperXiangduiPath = ".\\" + fullName.Substring(index);
                                                newRow["文件"]      = paperXiangduiPath;
                                            }

                                            string hh = fullName.Substring(index);
                                            string kk = hh.Substring(0, hh.Length - houZhui_length);
                                            paperTextXiangduiPath = ".\\" + kk + ".txt";
                                            newRow["text文件"]      = paperTextXiangduiPath;

                                            wz_dt.Rows.Add(newRow);
                                            wz_ta.Update(wz_dt);

                                            //将pdf文件内容写入txt文件
                                            if (i.Extension == ".pdf" || i.Extension == ".PDF")
                                            {
                                                string text = "";
                                                try
                                                {
                                                    string    pdffilename   = fullName;
                                                    PdfReader pdfReader     = new PdfReader(pdffilename);
                                                    int       numberOfPages = pdfReader.NumberOfPages;
                                                    text = string.Empty;

                                                    for (int j = 1; j <= numberOfPages; ++j)
                                                    {
                                                        iTextSharp.text.pdf.parser.ITextExtractionStrategy strategy = new iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy();
                                                        text += iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(pdfReader, j, strategy);
                                                    }
                                                    pdfReader.Close();
                                                }
                                                catch (Exception ex)
                                                {
                                                    StreamWriter wlog = File.AppendText(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "\\mylog.log");
                                                    wlog.WriteLine("出错文件:" + "原因:" + ex.ToString());
                                                    wlog.Flush();
                                                    wlog.Close();
                                                }

                                                string       ss         = fullName.Substring(0, fullName.Length - houZhui_length) + ".txt";
                                                StreamWriter fileWriter = new StreamWriter(ss, true);
                                                fileWriter.Write(text);
                                                fileWriter.Close();
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
示例#40
0
 /**
 * Return the XFA Object, could be an array, could be a Stream.
 * Returns null f no XFA Object is present.
 * @param    reader  a PdfReader instance
 * @return   the XFA object
 * @since    2.1.3
 */
 public static PdfObject GetXfaObject(PdfReader reader)
 {
     PdfDictionary af = (PdfDictionary)PdfReader.GetPdfObjectRelease(reader.Catalog.Get(PdfName.ACROFORM));
     if (af == null) {
         return null;
     }
     return PdfReader.GetPdfObjectRelease(af.Get(PdfName.XFA));
 }
        private void MergeWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            object[] args = (object[])e.Argument;
            ObservableCollection <PdfFile> pdfFiles = (ObservableCollection <PdfFile>)args[0];
            string          destinationPath = (string)args[1];
            bool            overwriteFile = (bool)args[2];
            string          errorMsg = string.Empty, progressStatus = string.Empty;
            int             rotation = 0, totalNrOfPages = 0, progress = 0;
            int             fileIndex = 0, pageNumber = 0;
            FileStream      outFileStream  = null;
            Document        destinationDoc = null;
            PdfImportedPage page      = null;
            PdfWriter       writer    = null;
            PdfReader       pdfReader = null;

            totalNrOfPages = pdfFiles.Sum(pdfFile => pdfFile.Reader.NumberOfPages);

            if (totalNrOfPages > 0 &&
                FileHelpers.FileIsAvailable(destinationPath,
                                            overwriteFile,
                                            out outFileStream,
                                            out errorMsg) == Define.Success)
            {
                destinationDoc = new Document();
                writer         = PdfWriter.GetInstance(destinationDoc, outFileStream);
                destinationDoc.Open();
                PdfContentByte cb = writer.DirectContent;

                while (fileIndex < pdfFiles.Count &&
                       !mergeBackgroundWorker.CancellationPending)
                {
                    progressStatus = string.Format("Processing PDF file: {0}.", pdfFiles[fileIndex].Info.FullName);
                    mergeBackgroundWorker.ReportProgress(progress * 100 / totalNrOfPages, progressStatus);
                    pdfReader = pdfFiles[fileIndex].Reader;
                    pdfReader.RemoveUnusedObjects();
                    pageNumber = 1;
                    while (pageNumber <= pdfFiles[fileIndex].Reader.NumberOfPages &&
                           !mergeBackgroundWorker.CancellationPending)
                    {
                        destinationDoc.SetPageSize(pdfReader.GetPageSizeWithRotation(pageNumber));
                        destinationDoc.NewPage();
                        page     = writer.GetImportedPage(pdfReader, pageNumber);
                        rotation = pdfReader.GetPageRotation(pageNumber);
                        if (rotation == 90)
                        {
                            cb.AddTemplate(page, 0, -1f, 1f, 0, 0, pdfReader.GetPageSizeWithRotation(pageNumber).Height);
                        }
                        else if (rotation == 180)
                        {
                            cb.AddTemplate(page, -1f, 0, 0, -1f, pdfReader.GetPageSizeWithRotation(pageNumber).Width,
                                           pdfReader.GetPageSizeWithRotation(pageNumber).Height);
                        }
                        else if (rotation == 270)
                        {
                            cb.AddTemplate(page, 0, 1f, -1f, 0, pdfReader.GetPageSizeWithRotation(pageNumber).Width, 0);
                        }
                        else
                        {
                            cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                        }
                        pageNumber++;
                        mergeBackgroundWorker.ReportProgress(++progress * 100 / totalNrOfPages);
                    }
                    fileIndex++;
                }

                progressStatus = string.Format("Closing PDF file: {0}.", destinationPath);
                mergeBackgroundWorker.ReportProgress(progress * 100 / totalNrOfPages, progressStatus);
            }

            if (destinationDoc != null &&
                !mergeBackgroundWorker.CancellationPending)
            {
                destinationDoc.Close();
                destinationDoc.Dispose();
                destinationDoc = null;
            }

            if (writer != null &&
                !mergeBackgroundWorker.CancellationPending)
            {
                writer.Close();
                writer.Dispose();
                writer = null;
            }

            if (outFileStream != null)
            {
                outFileStream.Close();
                outFileStream.Dispose();
                outFileStream = null;
            }

            if (mergeBackgroundWorker.CancellationPending)
            {
                e.Cancel = true;
            }

            e.Result = errorMsg;
        }
示例#42
0
 /**
 * A constructor from a <CODE>PdfReader</CODE>. It basically does everything
 * from finding the XFA stream to the XML parsing.
 * @param reader the reader
 * @throws java.io.IOException on error
 * @throws javax.xml.parsers.ParserConfigurationException on error
 * @throws org.xml.sax.SAXException on error
 */
 public XfaForm(PdfReader reader)
 {
     this.reader = reader;
     PdfObject xfa = GetXfaObject(reader);
     if (xfa == null) {
         xfaPresent = false;
         return;
     }
     xfaPresent = true;
     MemoryStream bout = new MemoryStream();
     if (xfa.IsArray()) {
         PdfArray ar = (PdfArray)xfa;
         for (int k = 1; k < ar.Size; k += 2) {
             PdfObject ob = ar.GetDirectObject(k);
             if (ob is PRStream) {
                 byte[] b = PdfReader.GetStreamBytes((PRStream)ob);
                 bout.Write(b, 0, b.Length);
             }
         }
     }
     else if (xfa is PRStream) {
         byte[] b = PdfReader.GetStreamBytes((PRStream)xfa);
         bout.Write(b, 0, b.Length);
     }
     bout.Seek(0, SeekOrigin.Begin);
     XmlTextReader xtr = new XmlTextReader(bout);
     domDocument = new XmlDocument();
     domDocument.PreserveWhitespace = true;
     domDocument.Load(xtr);
     ExtractNodes();
 }
示例#43
0
        /// <summary>
        /// Extracts a text from a PDF file.
        /// </summary>
        /// <param name="inFileName">the full path to the pdf file.</param>
        /// <param name="outFileName">the output file name.</param>
        /// <returns>the extracted text</returns>
        public bool ExtractText(string inFileName, string outFileName)
        {
            StreamWriter outFile = null;

            try
            {
                // Create a reader for the given PDF file
                var reader = new PdfReader(inFileName);
                //outFile = File.CreateText(outFileName);
                outFile = new StreamWriter(outFileName, false, System.Text.Encoding.UTF8);

                Console.Write("Processing: ");

                int   totalLen     = 68;
                float charUnit     = ((float)totalLen) / (float)reader.NumberOfPages;
                int   totalWritten = 0;
                float curUnit      = 0;

                for (int page = 1; page <= reader.NumberOfPages; page++)
                {
                    outFile.Write(ExtractTextFromPDFBytes(reader.GetPageContent(page)) + " ");

                    // Write the progress.
                    if (charUnit >= 1.0f)
                    {
                        for (int i = 0; i < (int)charUnit; i++)
                        {
                            Console.Write("#");
                            totalWritten++;
                        }
                    }
                    else
                    {
                        curUnit += charUnit;
                        if (curUnit >= 1.0f)
                        {
                            for (int i = 0; i < (int)curUnit; i++)
                            {
                                Console.Write("#");
                                totalWritten++;
                            }
                            curUnit = 0;
                        }
                    }
                }

                if (totalWritten < totalLen)
                {
                    for (int i = 0; i < (totalLen - totalWritten); i++)
                    {
                        Console.Write("#");
                    }
                }
                return(true);
            }
            catch
            {
                return(false);
            }
            finally
            {
                if (outFile != null)
                {
                    outFile.Close();
                }
            }
        }
示例#44
0
        /**
        * Retrieves the page labels from a PDF as an array of String objects.
        * @param reader a PdfReader object that has the page labels you want to retrieve
        * @return  a String array or <code>null</code> if no page labels are present
        */
        public static String[] GetPageLabels(PdfReader reader)
        {
            int n = reader.NumberOfPages;

            PdfDictionary dict = reader.Catalog;
            PdfDictionary labels = (PdfDictionary)PdfReader.GetPdfObjectRelease(dict.Get(PdfName.PAGELABELS));
            if (labels == null)
                return null;

            String[] labelstrings = new String[n];
            Hashtable numberTree = PdfNumberTree.ReadTree(labels);

            int pagecount = 1;
            String prefix = "";
            char type = 'D';
            for (int i = 0; i < n; i++) {
                if (numberTree.ContainsKey(i)) {
                    PdfDictionary d = (PdfDictionary)PdfReader.GetPdfObjectRelease((PdfObject)numberTree[i]);
                    if (d.Contains(PdfName.ST)) {
                        pagecount = ((PdfNumber)d.Get(PdfName.ST)).IntValue;
                    }
                    else {
                        pagecount = 1;
                    }
                    if (d.Contains(PdfName.P)) {
                        prefix = ((PdfString)d.Get(PdfName.P)).ToUnicodeString();
                    }
                    if (d.Contains(PdfName.S)) {
                        type = ((PdfName)d.Get(PdfName.S)).ToString()[1];
                    }
                }
                switch (type) {
                default:
                    labelstrings[i] = prefix + pagecount;
                    break;
                case 'R':
                    labelstrings[i] = prefix + RomanNumberFactory.GetUpperCaseString(pagecount);
                    break;
                case 'r':
                    labelstrings[i] = prefix + RomanNumberFactory.GetLowerCaseString(pagecount);
                    break;
                case 'A':
                    labelstrings[i] = prefix + RomanAlphabetFactory.GetUpperCaseString(pagecount);
                    break;
                case 'a':
                    labelstrings[i] = prefix + RomanAlphabetFactory.GetLowerCaseString(pagecount);
                    break;
                }
                pagecount++;
            }
            return labelstrings;
        }
示例#45
0
 /** Entry point to encrypt a PDF document. The encryption parameters are the same as in
  * <code>PdfWriter</code>. The userPassword and the
  *  ownerPassword can be null or have zero length. In this case the ownerPassword
  *  is replaced by a random string. The open permissions for the document can be
  *  AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
  *  AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
  *  The permissions can be combined by ORing them.
  * @param reader the read PDF
  * @param os the output destination
  * @param strength <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
  * @param userPassword the user password. Can be null or empty
  * @param ownerPassword the owner password. Can be null or empty
  * @param permissions the user permissions
  * @param newInfo an optional <CODE>String</CODE> map to add or change
  * the info dictionary. Entries with <CODE>null</CODE>
  * values delete the key in the original info dictionary
  * @throws DocumentException on error
  * @throws IOException on error
  */
 public static void Encrypt(PdfReader reader, Stream os, bool strength, String userPassword, String ownerPassword, int permissions, Hashtable newInfo)
 {
     PdfStamper stamper = new PdfStamper(reader, os);
     stamper.SetEncryption(strength, userPassword, ownerPassword, permissions);
     stamper.MoreInfo = newInfo;
     stamper.Close();
 }
示例#46
0
        /// <summary>
        /// Parses a stream object and removes OCGs. </summary>
        /// <param name="stream">	a stream object </param>
        /// <param name="resources">	the resources dictionary of that object (containing info about the OCGs) </param>
        public virtual void Parse(PRStream stream, PdfDictionary resources)
        {
            baos       = new MemoryStream();
            properties = resources.GetAsDict(PdfName.PROPERTIES);
            xobj       = new HashSet2 <PdfName>();
            PdfDictionary xobjects = resources.GetAsDict(PdfName.XOBJECT);

            if (xobjects != null)
            {
                // remove XObject (form or image) that belong to an OCG that needs to be removed
                foreach (PdfName name in xobjects.Keys)
                {
                    PRStream      xobject = (PRStream)xobjects.GetAsStream(name);
                    PdfDictionary oc      = xobject.GetAsDict(PdfName.OC);
                    if (oc != null)
                    {
                        PdfString ocname = oc.GetAsString(PdfName.NAME);
                        if (ocname != null && ocgs.Contains(ocname.ToString()))
                        {
                            xobj.Add(name);
                        }
                    }
                }
                foreach (PdfName name in xobj)
                {
                    xobjects.Remove(name);
                }
            }
            // parse the content stream
            byte[]           contentBytes = PdfReader.GetStreamBytes(stream);
            PRTokeniser      tokeniser    = new PRTokeniser(new RandomAccessFileOrArray(contentBytes));
            PdfContentParser ps           = new PdfContentParser(tokeniser);
            List <PdfObject> operands     = new List <PdfObject>();

            while (ps.Parse(operands).Count > 0)
            {
                PdfLiteral @operator = (PdfLiteral)operands[operands.Count - 1];
                ProcessOperator(this, @operator, operands);
                if ("BI".Equals(@operator.ToString()))
                {
                    int  found = 0;
                    int  ch;
                    bool immediateAfterBI = true;
                    while ((ch = tokeniser.Read()) != -1)
                    {
                        if (!immediateAfterBI || !PRTokeniser.IsWhitespace(ch))
                        {
                            baos.WriteByte((byte)ch);
                        }
                        immediateAfterBI = false;
                        if (found == 0 && PRTokeniser.IsWhitespace(ch))
                        {
                            found++;
                        }
                        else if (found == 1 && ch == 'E')
                        {
                            found++;
                        }
                        else if (found == 1 && PRTokeniser.IsWhitespace(ch))
                        {
                            // this clause is needed if we have a white space character that is part of the image data
                            // followed by a whitespace character that precedes the EI operator.  In this case, we need
                            // to flush the first whitespace, then treat the current whitespace as the first potential
                            // character for the end of stream check. Note that we don't increment 'found' here.
                        }
                        else if (found == 2 && ch == 'I')
                        {
                            found++;
                        }
                        else if (found == 3 && PRTokeniser.IsWhitespace(ch))
                        {
                            break;
                        }
                        else
                        {
                            found = 0;
                        }
                    }
                }
            }
            baos.Flush();
            baos.Close();
            stream.SetData(baos.GetBuffer());
        }
示例#47
0
 /** Entry point to encrypt a PDF document. The encryption parameters are the same as in
  * <code>PdfWriter</code>. The userPassword and the
  *  ownerPassword can be null or have zero length. In this case the ownerPassword
  *  is replaced by a random string. The open permissions for the document can be
  *  AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
  *  AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
  *  The permissions can be combined by ORing them.
  * @param reader the read PDF
  * @param os the output destination
  * @param userPassword the user password. Can be null or empty
  * @param ownerPassword the owner password. Can be null or empty
  * @param permissions the user permissions
  * @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
  * @throws DocumentException on error
  * @throws IOException on error */
 public static void Encrypt(PdfReader reader, Stream os, byte[] userPassword, byte[] ownerPassword, int permissions, bool strength128Bits)
 {
     PdfStamper stamper = new PdfStamper(reader, os);
     stamper.SetEncryption(userPassword, ownerPassword, permissions, strength128Bits);
     stamper.Close();
 }
示例#48
0
 public void AddDocument(PdfReader pdfDocument)
 {
     documents.Add(pdfDocument);
 }
示例#49
0
 /**
  * Parses a string with structured content.
  * 
  * @param reader
  *            the PdfReader that has access to the PDF file
  * @param os
  *            the Stream to which the resulting xml will be written
  */
 virtual public void ConvertToXml(PdfReader reader, Stream os) {
     ConvertToXml(reader, os, Encoding.Default);
 }
示例#50
0
        /// <summary>
        /// Parsing data of pdf-file from tables
        /// </summary>
        internal void ParsingFile()
        {
            stream.Position = 0;

            using (var reader = new PdfReader(stream))
                using (var pdf = new PdfDocument(reader))
                {
                    reader.SetCloseStream(false);

                    PageCount = pdf.GetNumberOfPages();

                    // get every page for analyse
                    PdfPage[] pages = Enumerable
                                      .Range(0, PageCount)
                                      .Select(t => pdf.GetPage(t + 1))
                                      .ToArray();

                    // data of every page (two diferent variants)
                    HeadInfo = ParsingHeader(pages[0]);

                    // find the limits
                    {
                        Regex regex = new Regex(@"З(\s*)а(\s*)д(\s*)а(\s*)н(\s+)д(\s*)и(\s*)а(\s*)п(\s*)а(\s*)з(\s*)о(\s*)н(\s+)т(\s*)е(\s*)м(\s*)п(\s*)е(\s*)р(\s*)а(\s*)т(\s*)у(\s*)р(\s+)м(\s*)е(\s*)ж(\s*)д(\s*)у(\s*):(\s+[+-]?\d+)°C и(\s+[+-]?\d+)°C",
                                                RegexOptions.IgnoreCase | RegexOptions.Compiled);
                        Match  match = regex.Match(HeadInfo.ToString());
                        string findS = match.Value;

                        regex = new Regex(@"([+-]?\d+)", RegexOptions.Compiled);
                        MatchCollection matches = regex.Matches(findS);

                        List <float> results = new List <float>();
                        foreach (Match m in matches)
                        {
                            float.TryParse(m.Value, out float res);
                            results.Add(res);
                        }

                        // save data
                        LimitMin = results.Min();
                        LimitMax = results.Max();
                    }

                    //TODO: delete last row for last page, when we will be create new pdf-file

                    // data of names every columns
                    ColumnInfo = ParsingColumns(pages[0]);

                    // data from tables
                    DataInfo = new StringBuilder[PageCount - 1];

                    // analyse tables all page without last using multithreading
                    Parallel.For(0, DataInfo.Length,
                                 i => DataInfo[i] = ParsingTables(pages[i]));

                    // convert string data to real data
                    TableData = ExtractTableData(DataInfo);
                    // save data
                    TableDataBlock = new KeyValuePairTable <int, DateTime, float, bool> [TableData.Length];
                    TableData.CopyTo(TableDataBlock, 0);

                    // data of Oy axis
                    OyAxisInfo = ParsingOyAxis(pages[PageCount - 1]);
                    // convert string data to real data
                    DataOyAxis = ExtractOyAxis(OyAxisInfo);

                    // data of Ox axis
                    OxAxisInfo = ParsingOxAxis(pages[PageCount - 1]);
                    // convert string data to real data
                    DataOxAxis = ExtractOxAxis(OxAxisInfo);

                    pdf.Close();
                }
        }
示例#51
0
 /* ----------------------------------------------------------------- */
 ///
 /// GetContentParser
 ///
 /// <summary>
 /// PdfReaderContentParser オブジェクトを取得します。
 /// </summary>
 ///
 /// <param name="src">PdfReader オブジェクト</param>
 ///
 /// <returns>PdfReaderContentParser オブジェクト</returns>
 ///
 /* ----------------------------------------------------------------- */
 public static PdfReaderContentParser GetContentParser(this PdfReader src) =>
 new PdfReaderContentParser(src);
示例#52
0
        public static string AddCommentsToFile(string fileName, string outfilepath, string userComments, PdfPTable newTable)
        {
            string outputFileName = outfilepath;
            //Step 1: Create a Docuement-Object
            Document document = new Document();

            try
            {
                //Step 2: we create a writer that listens to the document
                PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputFileName, FileMode.Create));

                //Step 3: Open the document
                document.Open();

                PdfContentByte cb = writer.DirectContent;

                //The current file path
                string filename = fileName;

                // we create a reader for the document
                PdfReader reader = new PdfReader(filename);

                for (int pageNumber = 1; pageNumber < reader.NumberOfPages + 1; pageNumber++)
                {
                    document.SetPageSize(reader.GetPageSizeWithRotation(1));
                    document.NewPage();

                    //Insert to Destination on the first page
                    if (pageNumber == 1)
                    {
                        Chunk fileRef = new Chunk(" ");
                        fileRef.SetLocalDestination(filename);
                        document.Add(fileRef);
                    }

                    PdfImportedPage page     = writer.GetImportedPage(reader, pageNumber);
                    int             rotation = reader.GetPageRotation(pageNumber);
                    if (rotation == 90 || rotation == 270)
                    {
                        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pageNumber).Height);
                    }
                    else
                    {
                        cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                    }
                }

                // Add a new page to the pdf file
                document.NewPage();

                Paragraph paragraph = new Paragraph();
                Font      titleFont = new Font(iTextSharp.text.Font.HELVETICA
                                               , 15
                                               , iTextSharp.text.Font.BOLD
                                               , Color.BLACK
                                               );
                Chunk titleChunk = new Chunk("Comments", titleFont);
                paragraph.Add(titleChunk);
                document.Add(paragraph);

                paragraph = new Paragraph();
                Font textFont = new Font(iTextSharp.text.Font.HELVETICA
                                         , 12
                                         , iTextSharp.text.Font.NORMAL
                                         , Color.BLACK
                                         );
                Chunk textChunk = new Chunk(userComments, textFont);
                paragraph.Add(textChunk);

                document.Add(paragraph);
                document.Add(newTable);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                document.Close();
            }
            return(outputFileName);
        }
示例#53
0
 /**
 * Sets the XFA key from a byte array. The old XFA is erased.
 * @param form the data
 * @param reader the reader
 * @param writer the writer
 * @throws java.io.IOException on error
 */
 public static void SetXfa(XfaForm form, PdfReader reader, PdfWriter writer)
 {
     PdfDictionary af = (PdfDictionary)PdfReader.GetPdfObjectRelease(reader.Catalog.Get(PdfName.ACROFORM));
     if (af == null) {
         return;
     }
     PdfObject xfa = GetXfaObject(reader);
     if (xfa.IsArray()) {
         PdfArray ar = (PdfArray)xfa;
         int t = -1;
         int d = -1;
         for (int k = 0; k < ar.Size; k += 2) {
             PdfString s = ar.GetAsString(k);
             if ("template".Equals(s.ToString())) {
                 t = k + 1;
             }
             if ("datasets".Equals(s.ToString())) {
                 d = k + 1;
             }
         }
         if (t > -1 && d > -1) {
             reader.KillXref(ar.GetAsIndirectObject(t));
             reader.KillXref(ar.GetAsIndirectObject(d));
             PdfStream tStream = new PdfStream(SerializeDoc(form.templateNode));
             tStream.FlateCompress(writer.CompressionLevel);
             ar[t] = writer.AddToBody(tStream).IndirectReference;
             PdfStream dStream = new PdfStream(SerializeDoc(form.datasetsNode));
             dStream.FlateCompress(writer.CompressionLevel);
             ar[d] = writer.AddToBody(dStream).IndirectReference;
             af.Put(PdfName.XFA, new PdfArray(ar));
             return;
         }
     }
     reader.KillXref(af.Get(PdfName.XFA));
     PdfStream str = new PdfStream(SerializeDoc(form.domDocument));
     str.FlateCompress(writer.CompressionLevel);
     PdfIndirectReference refe = writer.AddToBody(str).IndirectReference;
     af.Put(PdfName.XFA, refe);
 }
示例#54
0
 /* ----------------------------------------------------------------- */
 ///
 /// GetMetadata
 ///
 /// <summary>
 /// Metadata オブジェクトを取得します。
 /// </summary>
 ///
 /// <param name="src">PdfReader オブジェクト</param>
 ///
 /// <returns>Metadata オブジェクト</returns>
 ///
 /* ----------------------------------------------------------------- */
 public static Metadata GetMetadata(this PdfReader src) => new Metadata
示例#55
0
 /**
 * Retrieves the page labels from a PDF as an array of {@link PdfPageLabelFormat} objects.
 * @param reader a PdfReader object that has the page labels you want to retrieve
 * @return  a PdfPageLabelEntry array, containing an entry for each format change
 * or <code>null</code> if no page labels are present
 */
 public static PdfPageLabelFormat[] GetPageLabelFormats(PdfReader reader)
 {
     PdfDictionary dict = reader.Catalog;
     PdfDictionary labels = (PdfDictionary)PdfReader.GetPdfObjectRelease(dict.Get(PdfName.PAGELABELS));
     if (labels == null)
         return null;
     Hashtable numberTree = PdfNumberTree.ReadTree(labels);
     int[] numbers = new int[numberTree.Count];
     numberTree.Keys.CopyTo(numbers, 0);
     Array.Sort(numbers);
     PdfPageLabelFormat[] formats = new PdfPageLabelFormat[numberTree.Count];
     String prefix;
     int numberStyle;
     int pagecount;
     for (int k = 0; k < numbers.Length; ++k) {
         int key = numbers[k];
         PdfDictionary d = (PdfDictionary)PdfReader.GetPdfObjectRelease((PdfObject)numberTree[key]);
         if (d.Contains(PdfName.ST)) {
             pagecount = ((PdfNumber)d.Get(PdfName.ST)).IntValue;
         } else {
             pagecount = 1;
         }
         if (d.Contains(PdfName.P)) {
             prefix = ((PdfString)d.Get(PdfName.P)).ToUnicodeString();
         } else {
             prefix = "";
         }
         if (d.Contains(PdfName.S)) {
             char type = ((PdfName)d.Get(PdfName.S)).ToString()[1];
             switch (type) {
                 case 'R': numberStyle = UPPERCASE_ROMAN_NUMERALS; break;
                 case 'r': numberStyle = LOWERCASE_ROMAN_NUMERALS; break;
                 case 'A': numberStyle = UPPERCASE_LETTERS; break;
                 case 'a': numberStyle = LOWERCASE_LETTERS; break;
                 default: numberStyle = DECIMAL_ARABIC_NUMERALS; break;
             }
         } else {
             numberStyle = EMPTY;
         }
         formats[k] = new PdfPageLabelFormat(key + 1, numberStyle, prefix, pagecount);
     }
     return formats;
 }
示例#56
0
 /**
  * Parses a string with structured content.
  *
  * @param reader
  *            the PdfReader that has access to the PDF file
  * @param os
  *            the Stream to which the resulting xml will be written
  */
 virtual public void ConvertToXml(PdfReader reader, Stream os)
 {
     ConvertToXml(reader, os, Encoding.UTF8);
 }
示例#57
0
	    /**
	     * Switches to the previous revision.
	     * @throws IOException
	     * @throws GeneralSecurityException 
	     */
	    virtual public void SwitchToPreviousRevision() {
		    LOGGER.Info("Switching to previous revision.");
		    latestRevision = false;
		    dss = reader.Catalog.GetAsDict(PdfName.DSS);
		    DateTime cal = pkcs7.TimeStampDate;
		    if (cal == DateTime.MaxValue)
			    cal = pkcs7.SignDate;
		    // TODO: get date from signature
	        signDate = cal;
		    List<String> names = fields.GetSignatureNames();
		    if (names.Count > 1) {
			    signatureName = names[names.Count - 2];
			    reader = new PdfReader(fields.ExtractRevision(signatureName));
			    fields = reader.AcroFields;
			    names = fields.GetSignatureNames();
			    signatureName = names[names.Count - 1];
			    pkcs7 = CoversWholeDocument();
			    LOGGER.Info(String.Format("Checking {0}signature {1}", pkcs7.IsTsp ? "document-level timestamp " : "", signatureName));
		    }
		    else {
			    LOGGER.Info("No signatures in revision");
			    pkcs7 = null;
		    }
	    }
 /**
  * Signs a PDF where space was already reserved.
  * @param reader the original PDF
  * @param fieldName the field to sign. It must be the last field
  * @param outs the output PDF
  * @param externalSignatureContainer the signature container doing the actual signing. Only the 
  * method ExternalSignatureContainer.sign is used
  * @throws DocumentException
  * @throws IOException
  * @throws GeneralSecurityException 
  */
 public static void SignDeferred(PdfReader reader, String fieldName, Stream outs, IExternalSignatureContainer externalSignatureContainer) {
     AcroFields af = reader.AcroFields;
     PdfDictionary v = af.GetSignatureDictionary(fieldName);
     if (v == null)
         throw new DocumentException("No field");
     if (!af.SignatureCoversWholeDocument(fieldName))
         throw new DocumentException("Not the last signature");
     PdfArray b = v.GetAsArray(PdfName.BYTERANGE);
     long[] gaps = b.AsLongArray();
     if (b.Size != 4 || gaps[0] != 0)
         throw new DocumentException("Single exclusion space supported");
     IRandomAccessSource readerSource = reader.SafeFile.CreateSourceView();
     Stream rg = new RASInputStream(new RandomAccessSourceFactory().CreateRanged(readerSource, gaps));
     byte[] signedContent = externalSignatureContainer.Sign(rg);
     int spaceAvailable = (int)(gaps[2] - gaps[1]) - 2;
     if ((spaceAvailable & 1) != 0)
         throw new DocumentException("Gap is not a multiple of 2");
     spaceAvailable /= 2;
     if (spaceAvailable < signedContent.Length)
         throw new DocumentException("Not enough space");
     StreamUtil.CopyBytes(readerSource, 0, gaps[1] + 1, outs);
     ByteBuffer bb = new ByteBuffer(spaceAvailable * 2);
     foreach (byte bi in signedContent) {
         bb.AppendHex(bi);
     }
     int remain = (spaceAvailable - signedContent.Length) * 2;
     for (int k = 0; k < remain; ++k) {
         bb.Append((byte)48);
     }
     bb.WriteTo(outs);
     StreamUtil.CopyBytes(readerSource, gaps[2] - 1, gaps[3] + 1, outs);
 }
示例#59
0
        internal void ExtractMetaData()
        {
            stream.Position = 0;

            using (var reader = new PdfReader(stream))
                using (var pdf = new PdfDocument(reader))
                    using (var doc = new Document(pdf))
                    {
                        reader.SetCloseStream(false);

                        PageCount = pdf.GetNumberOfPages();

                        #region Another variant of load all page (simple but longer)
#if false
                        {
                            List <PdfPage> pages = new List <PdfPage>();
                            for (int i = 0; i < PageCount; i++)
                            {
                                pages.Add(pdf.GetPage(i + 1));
                            }
                        }
#endif
                        #endregion

                        // get every page for analyse
                        PdfPage[] pages = Enumerable
                                          .Range(0, PageCount)
                                          .Select(t => pdf.GetPage(t + 1))
                                          .ToArray();

                        // create array for save information about every page
                        Pages = new PageInfo[pages.Length];

                        for (int i = 0; i < pages.Length; i++)
                        {
                            Pages[i].Id       = i + 1;
                            Pages[i].Rotation = pages[i].GetRotation();

                            Pages[i].Size = new SizeInfo
                            {
                                X        = pages[i].GetPageSize().GetX(),
                                Y        = pages[i].GetPageSize().GetY(),
                                Height   = pages[i].GetPageSize().GetHeight(),
                                Width    = pages[i].GetPageSize().GetWidth(),
                                HeightUU = iTextSharp.text.Utilities
                                           .PointsToMillimeters(pages[i].GetPageSize().GetHeight()),
                                WidthUU = iTextSharp.text.Utilities
                                          .PointsToMillimeters(pages[i].GetPageSize().GetWidth()),
                                Top    = pages[i].GetPageSize().GetTop(),
                                Bottom = pages[i].GetPageSize().GetBottom(),
                                Left   = pages[i].GetPageSize().GetLeft(),
                                Right  = pages[i].GetPageSize().GetRight(),
                            };
                        }

                        Margin = new MarginInfo
                        {
                            Top    = doc.GetTopMargin(),
                            Bottom = doc.GetBottomMargin(),
                            Left   = doc.GetLeftMargin(),
                            Right  = doc.GetRightMargin()
                        };

                        var data = pdf.GetDocumentInfo();
                        Metadata = new MetaData
                        {
                            Title            = data.GetTitle(),
                            Author           = data.GetAuthor(),
                            Subject          = data.GetSubject(),
                            Keywords         = data.GetKeywords(),
                            Creator          = data.GetCreator(),
                            Producer         = data.GetProducer(),
                            Version          = pdf.GetPdfVersion(),
                            CreationDate     = data.GetMoreInfo(PdfName.CreationDate.GetValue()),
                            ModificationDate = data.GetMoreInfo(PdfName.ModDate.GetValue()),
                        };
                    }
        }
示例#60
-8
 public static string pdfText(string path)
 {
     PdfReader reader = new PdfReader(path);
     string text = string.Empty;
     for(int page = 1; page <= reader.NumberOfPages; page++)
     {
         text += PdfTextExtractor.GetTextFromPage(reader,page);
     }
     reader.Close();
     return text;
 }