?
Solved

.net implementing simple javascript luhn check

Posted on 2013-06-28
10
Medium Priority
?
455 Views
Last Modified: 2013-06-28
I have inherited a fairly basic .net site which allows users to register, part of the sign up procedure requires that they enter a valid 19 digit number, the last number of which needs to be checked by a basic luhn checker. Basicaly I want to hook up the code at this url
http://imei.sms.eu.sk/
In to the PRN field on this page, if it was a standard html form I could hook it in easy enough but I am not familiar with .net and thisis using a "wizard" type registration process so do not understand when it is passing post or validation information.

I have included the full .aspx page below.
<%@ Page Language="VB" AutoEventWireup="false" EnableViewStateMac="false" CodeFile="customerDetails.aspx.vb"
  Inherits="customerDetails" MasterPageFile="~/Site.Master" %>

<asp:Content ID="Content3" ContentPlaceHolderID="HeadContent" runat="server">
  <script type="text/javascript" src="/Scripts/countrycodes.js"></script>
  <script type="text/javascript" src="/Scripts/customerDetails.js"></script>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  <script type="text/javascript">
    $(document).ready(function () {
      $('input[type=text]').bind('copy paste', function (e) {
        e.preventDefault();
      });
    });
  </script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="PageTitle" runat="server">
  Your Details
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="SubHeading" runat="server">
</asp:Content>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
  <div class="sign_up_lft">

  <asp:Panel ID="pnlError" runat="server" Visible="False" CssClass="alert-error">

    <div class="alert-error">
      <asp:Label Font-Bold="false" ID='lblError' runat="server"></asp:Label>
    </div>
    
  </asp:Panel>
  <asp:Wizard ID="Wizard1" runat="server" DisplaySideBar="False" Width="700px" OnNextButtonClick="OnNextButtonClick" FinishStepButtonText="Next" FinishCompleteButtonText="Next" StepPreviousButtonText="Back" CellPadding="10" CssClass="tablewidth">
    <CancelButtonStyle CssClass="btn btn-primary" />
    <NavigationButtonStyle CssClass="btn btn-primary" />
    <StepNextButtonStyle CssClass="btn btn-primary" />
    <StepPreviousButtonStyle CssClass="btn btn-primary" />
    
    <WizardSteps>
      <asp:WizardStep ID="WizardStep1" runat="server" Title="">
       <div class="req"><span class="red">*</span> fields are mandatory. </div>
	   
	   <%-- <h2>
          Your Name</h2>--%>
           <%--<label for="txtBillingFirstnames">
            First Name: <span class="red">*</span> <span style="font-size: smaller">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* a mandatory field</span></label>--%>
          <span class="profile_01"><h2><b>1.</b> Your Name </h2></span>
            <div class="quote_form">
          <label for="txtBillingFirstnames" class="lft_name">
            First Name:<span class="red"> *</span> </label>
          <asp:TextBox ID="txtBillingFirstnames" MaxLength="20" runat="server" Text="" ClientIDMode="Static" class="txt_box"> </asp:TextBox>
          <asp:RequiredFieldValidator ID="valBillingFirstnames"
                                      runat="server" ErrorMessage="Please enter first name" 
                                      ControlToValidate="txtBillingFirstnames" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>

          <label for="txtBillingSurname" class="lft_name">
            Last Name:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingSurname" MaxLength="20" runat="server" Text="" ClientIDMode="Static" class="txt_box"> </asp:TextBox>
          <asp:RequiredFieldValidator ID="valBillingSurname"
                                      runat="server" ErrorMessage="Please enter surname" 
                                      ControlToValidate="txtBillingSurname" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>

        </div>
        
		<asp:RequiredFieldValidator ID="valBillingAddress1"
                                      runat="server" ErrorMessage="Please enter address line 1" 
                                      ControlToValidate="txtBillingAddress1" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>
		
		<%--<h3>
          Your Address<a rel="tooltip" href="#" title="This is the address that your new allpay Mobile SIM card will be dispatched to.">?</a></h3>--%>
          <span class="profile_01 profile_tx"><h2><b>2.</b> Your Address </h2><a rel="tooltip" href="#" title="This is the address that your new allpay Mobile SIM card will be dispatched to.">?</a></span>
          <div class="quote_form">
          <label for="txtBillingAddress1" class="lft_name">
            Address Line 1:<span class="red"> *</span></label>
          &nbsp;<asp:TextBox ID="txtBillingAddress1" MaxLength="100" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
          
             
          <label for="txtBillingAddress2" class="lft_name">
            Address Line 2:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingAddress2" MaxLength="100" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
         
             
          <label for="txtBillingCity" class="lft_name">
            City / Town:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingCity" MaxLength="40" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
          <br /><asp:RequiredFieldValidator ID="valBillingCity"
                                      runat="server" ErrorMessage="Please enter city" 
                                      ControlToValidate="txtBillingCity" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/> 
          
          <label for="txtBillingPostCode" class="lft_name">
            Postcode:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingPostCode" MaxLength="10" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
          <br /><asp:RequiredFieldValidator ID="valBillingPostCode"
                                      runat="server" ErrorMessage="Please enter postcode" 
                                      ControlToValidate="txtBillingPostCode" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/> 
          
          <label for="txtBillingCountry" class="lft_name">
            Country:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingCountry" MaxLength="10" runat="server" Text="GB" ClientIDMode="Static"
                       ReadOnly="True" class="txt_box"/>
          <br /><asp:RequiredFieldValidator ID="valBillingCountry"
                                      runat="server" ErrorMessage="Please enter country" 
                                      ControlToValidate="txtBillingCountry" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/> 
        </div>
      </asp:WizardStep>
      <asp:WizardStep ID="WizardStep2" runat="server" Title="">
      <%--  <h3>
          Your Contact Details</h3>--%>
          <span class="profile_01 profile_tx"><h2>Your Contact Details</h2></span>

        <div class="quote_form">
          <label for="txtBillingPhone" class="lft_name">
            Your Telephone Number:<a rel="tooltip" href="#" title="Please enter your telephone number">?</a></label>
          <asp:TextBox ID="txtBillingPhone" MaxLength="20" runat="server" Text="" ClientIDMode="Static" class="txt_box"/> 

          <label for="txtCustomerEMail" class="lft_name">
           Your Email Address:<span class="red"> *</span></label>
          <asp:TextBox ID="txtCustomerEMail" MaxLength="255" runat="server" Text="" ClientIDMode="Static" class="txt_box"/> 
          <br /><asp:RequiredFieldValidator ID="valCustomerEmail"
                                      runat="server" ErrorMessage="Please enter email" 
                                      ControlToValidate="txtCustomerEMail" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>
                                      
          <asp:RegularExpressionValidator ID="valEmailFormat1" runat="server" ErrorMessage="Please enter a valid email address" ClientIDMode="Static" ControlToValidate="txtCustomerEMail" Display="Dynamic" SetFocusOnError="True" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>
          
          <label for="txtCustomerEMail2" class="lft_name">
            Confirm Email Address:<span class="red"> *</span></label>
          <asp:TextBox ID="txtCustomerEMail2" MaxLength="255" runat="server" Text="" ClientIDMode="Static" class="txt_box"/> 
          <br /><asp:RequiredFieldValidator ID="valCustomerEmail2"
                                      runat="server" ErrorMessage="Please re-enter your email" 
                                      ControlToValidate="txtCustomerEMail2" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>
          
           <asp:RegularExpressionValidator ID="valEmailFormat2" runat="server" ErrorMessage="Please enter a valid email address" ClientIDMode="Static" ControlToValidate="txtCustomerEMail2" ForeColor="Red" Display="Dynamic" SetFocusOnError="True" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>
                                       
          <asp:CompareValidator ID="valCompareEmail" 
                                      runat="server" ErrorMessage="Email addresses do not match" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True" ControlToCompare="txtCustomerEMail" ControlToValidate="txtCustomerEMail2"></asp:CompareValidator>


          <asp:Panel runat="server" ID="pnlAdditional" Visible="True">
            <label for="ddlGender" class="lft_name">
              Lead Soucre:</label>
            <asp:DropDownList ID="ddlMarketing" runat="server">
              <asp:ListItem Value="Leaflet" Text="Leaflet" />
              <asp:ListItem Value="Poster in rent payment office" Text="Poster in rent payment office" />
		<asp:ListItem Value="Twitter/ Facebook" Text="Twitter/ Facebook" />
		<asp:ListItem Value="Newsletter/ Magazine" Text="Newsletter/ Magazine" />
		<asp:ListItem Value="Friend/ family recommendation" Text="Friend/ family recommendation" />
		<asp:ListItem Value="Rent Statement" Text="Rent Statement" />
		<asp:ListItem Value="Website" Text="Website" />
		<asp:ListItem Value="Google/ bing/ yahoo" Text="Google/ bing/ yahoo" />
		<asp:ListItem Value="Other" Text="Other" />
            </asp:DropDownList>
            
            <label for="txtPRN" class="lft_name">
              PRN<span class="red"> *</span></label>
            <asp:TextBox ID="txtPRN" MaxLength="19" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
            
              
          </asp:Panel>
</div>
      </asp:WizardStep>
      <asp:WizardStep ID="WizardStep3" runat="server" Title="">
        <asp:Panel ID="pnlDeliveryAddress" runat="server">
          <h4>
            Delivery Details</h4>

    <div class="delivery">     
            <!-- delivery same checkbox -->
			<div class="check">
            <asp:CheckBox ID="IsDeliverySame" runat="server" OnCheckedChanged="IsDeliverySame_Clicked" AutoPostBack="True" /></div>
            <label class="checkbox-label" for="IsDeliverySame">
              Is your delivery address the same as your billing address?</label>
  </div>

            <h4>
              Your Name</h4>

            <div>
              <label for="txtDeliveryFirstnames">
                First Name:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryFirstnames" MaxLength="20" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryFirstnames"
                                          runat="server" ErrorMessage="Please enter first name" 
                                          ControlToValidate="txtDeliveryFirstnames" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliverySurname">
                Last Name:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliverySurname" MaxLength="20" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliverySurname"
                                          runat="server" ErrorMessage="Please enter surname" 
                                          ControlToValidate="txtDeliveryFirstnames" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
            



            <div class="profile_01"><h4>
              Your Address</h4></div>

              <label for="txtDeliveryAddress1">
                Address line 1:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryAddress1" MaxLength="100" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryAddress1"
                                          runat="server" ErrorMessage="Please enter address line 1" 
                                          ControlToValidate="txtDeliveryAddress1" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliveryAddress2">
                Address line 2:</label>
              <asp:TextBox ID="txtDeliveryAddress2" MaxLength="100" runat="server" Text="" ClientIDMode="Static"/>

              <label for="txtDeliveryCity">
                City:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryCity" MaxLength="40" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryCity"
                                          runat="server" ErrorMessage="Please enter city" 
                                          ControlToValidate="txtDeliveryCity" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliveryPostCode">
                Postcode:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryPostCode" MaxLength="10" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryPostcode"
                                          runat="server" ErrorMessage="Please enter poscode" 
                                          ControlToValidate="txtDeliveryPostCode" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliveryCountry">
                Country:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryCountry" MaxLength="10" runat="server" Text="GB" ClientIDMode="Static" ReadOnly="True"/>
              <asp:RequiredFieldValidator ID="valDeliveryCountry"
                                          runat="server" ErrorMessage="Please enter country" 
                                          ControlToValidate="txtDeliveryCountry" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
                                          
                                          
              <label for="txtDeliveryPhone">
                Phone:</label>
              <asp:TextBox ID="txtDeliveryPhone" MaxLength="20" runat="server" Text="" ClientIDMode="Static"/>
              
            



           

        </asp:Panel>
      </asp:WizardStep>
      <asp:WizardStep ID="WizardStep4" runat="server" Title="">
        <asp:Panel ID="pnlRegOptions1" runat="server">
          <div><h4>
            Security Settings</h4></div>

            <label for="txtPassword">
              Password:<span class="red"> *</span></label>
            <asp:TextBox ID="txtPassword" MaxLength="20" runat="server" Text="" ClientIDMode="Static" />
            <asp:RequiredFieldValidator ID="valPassword"
                                          runat="server" ErrorMessage="Please enter password" 
                                          ControlToValidate="txtPassword" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>

            <label for="txtPassword2">
              Confirm Password:<span class="red"> *</span></label>
            <asp:TextBox ID="txtPassword2" MaxLength="20" runat="server" Text="" ClientIDMode="Static" />
            <asp:RequiredFieldValidator ID="valPassword2"
                                          runat="server" ErrorMessage="Please re-enter password" 
                                          ControlToValidate="txtPassword2" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
                                          
            <asp:CompareValidator ID="valComparePassword" 
                                      runat="server" ErrorMessage="Passwords do not match" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True" ControlToCompare="txtPassword" ControlToValidate="txtPassword2"></asp:CompareValidator>

            <label for="ContentPlaceHolder1_ddlSecurityQuestion">
              Security Question:<span class="red"> *</span></label>
            <asp:DropDownList ID="ddlSecurityQuestion" runat="server">
              <asp:ListItem>
              </asp:ListItem>
              <asp:ListItem>Favourite Pet</asp:ListItem>
              <asp:ListItem>First School Attended</asp:ListItem>
              <asp:ListItem>Mother's Maiden Name</asp:ListItem>
              <asp:ListItem>Childhood Nickname</asp:ListItem>
            </asp:DropDownList>
            <asp:RequiredFieldValidator ID="valSecurityQuestion"
                                          runat="server" ErrorMessage="Please select a security question" 
                                          ControlToValidate="ddlSecurityQuestion" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
            <br />
            <label for="txtSecurityAnswer">
              Security Answer:<span class="red"> *</span></label>
            <asp:TextBox ID="txtSecurityAnswer" MaxLength="50" runat="server" Text="" ClientIDMode="Static" TextMode="SingleLine" />
            <asp:RequiredFieldValidator ID="valSecurityAnswer"
                                          runat="server" ErrorMessage="Please enter security answer" 
                                          ControlToValidate="txtSecurityAnswer" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>

            <br />
        



        </asp:Panel>
      </asp:WizardStep>
      
    </WizardSteps>
  </asp:Wizard>
  </div>
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="RightSide">
  <asp:Panel ID="pnlRightSide" runat="server">
  </asp:Panel>
</asp:Content>


<asp:Content runat="server" ContentPlaceHolderID="ProgressBar">
  <asp:Panel ID="pnlProgressBar" runat="server">
    
  <%--<asp:Image id="ProgBar" runat="server" CssClass="float_m progress"></asp:Image>--%>
  
  </asp:Panel>
</asp:Content>

Open in new window

0
Comment
Question by:ScorchD
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 6
  • 4
10 Comments
 
LVL 58

Expert Comment

by:Julian Hansen
ID: 39284030
So basically lines 9-14 you want to do this
    $(document).ready(function () {
      $('input[type=text]').bind('copy paste', function (e) {
        e.preventDefault();
      });
/* If you want to check the number immediately after the field looses focus */
     $('#txtPRN').blur(function() {
        var val = $(this).val();
        // perform LUHN check here - can put luhn check in a function and call it here
        // or put the code directly
        if (!ValidateLuhn(val)) {
         // errror here
        }
     });
    });

function ValidateLuhn(Luhn)
 {
	var LuhnDigit = parseInt(Luhn.substring(Luhn.length-1,Luhn.length));
	var LuhnLess = Luhn.substring(0,Luhn.length-1);
	if (Calculate(LuhnLess)==parseInt(LuhnDigit))
	{
		return true;
	}	
	return false;
 }

Open in new window

You can also pick up the button clicks and check there as well.
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284252
Brilliant, I cant quite get it to work though, I also want to prevent the default actiioon for the form if the PRN field isnt valid, its rather crude but I have been trying to do so by preventing the default action of the next button like this.
jQuery(document).ready(function(){
jQuery.fn.exists = function(){return this.length>0;}
if ($("#txtPRN").length > 0) {

$("#ContentPlaceHolder1_Wizard1_StepNavigationTemplateContainerID_StepNextButton").click(function(event) {

event.preventDefault();
$('#ContentPlaceHolder1_Wizard1_pnlAdditional').append('<span id="prn-msg">Please enter a valid PRN</span>')
});

}

Open in new window

That aside for some reason I cannot get the above code that you gave me to work and I cannot work out why. In simplest form why does this not work?
jQuery(document).ready(function () {
     
     $('#txtPRN').blur(function() {
        var val = $(this).val();
		if (ValidateLuhn(val)) {
		alert('Valid');
		}else{
         alert('Invalid');
        }
     });
    });

function ValidateLuhn(Luhn)
 {
	var LuhnDigit = parseInt(Luhn.substring(Luhn.length-1,Luhn.length));
	var LuhnLess = Luhn.substring(0,Luhn.length-1);
	if (Calculate(LuhnLess)==parseInt(LuhnDigit))
	{
		return true;
	}	
	return false;
 }

});

Open in new window

0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284329
I have the function working, apologies, it was a typo within the Calculate function.
Still not sure how best to prevent and then allow the user through, there isn't anyway to revert to default action of the onclick handler? I realize that it is not action based.

Many thanks for your time.
0
AWS Certified Solutions Architect - Associate

This course has been developed to provide you with the requisite knowledge to not only pass the AWS CSA certification exam but also gain the hands-on experience required to become a qualified AWS Solutions architect working in a real-world environment.

 
LVL 58

Accepted Solution

by:
Julian Hansen earned 2000 total points
ID: 39284385
If you have a form you can catch the submit event
$('#idofform').submit(function() {
   // check here
  //  return false if fails - this will prevent form being submitted
});

Open in new window

If there is only one form then you can select like so
$('form').submit( ....

Open in new window

For the click
$('#idofbutton').click(function(e) {
    if (ValidateLuhn(val)) {
      return true;
    }
    e.preventDefault(); 
    return false;
   return rv;
});

Open in new window

0
 
LVL 4

Author Closing Comment

by:ScorchD
ID: 39284437
Excellent, thank you.

If I could award more points for this I would :)
0
 
LVL 58

Expert Comment

by:Julian Hansen
ID: 39284448
You are most welcome - thanks for the points and good luck with your project.

Just saw a typo in the last bit of script

the return rv - shoud be removed.
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284453
Yes I noticed that, thank you
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284601
Julian if you are still there could I ask a really quick one, I also need to do a quick check to make sure the luhn value is 19 long, however this doesnt seem to be working?
function ValidateLuhn(Luhn)
 {
 
	var LuhnDigit = parseInt(Luhn.substring(Luhn.length-1,Luhn.length));
	var LuhnLess = Luhn.substring(0,Luhn.length-1);
	var LuhnLength = Luhn.length;
	if ( LuhnLength = 19 && Calculate(LuhnLess)==parseInt(LuhnDigit))
	{
		return true;
	}	
	return false;
 }

Open in new window

0
 
LVL 58

Expert Comment

by:Julian Hansen
ID: 39284686
Common mistake

if ( LuhnLength = 19 && Calculate(LuhnLess)==parseInt(LuhnDigit))

You are using the assignment '=' instead of equality check '==' here so you are setting the length to 19 irrespective of the length.
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284717
Ah of course, thank you!
You are right at the top of my Christmas list.
0

Featured Post

Quick Start: DOCKER

Sometimes you just need a Quick Start on a topic in order to begin using it.. this is just what you need to know to get up and running with Docker!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

JavaScript can be used in a browser to change parts of a webpage dynamically. It begins with the following pattern: If condition W is true, do thing X to target Y after event Z. Below are some tips and tricks to help you get started with JavaScript …
The Windows functions GetTickCount and timeGetTime retrieve the number of milliseconds since the system was started. However, the value is stored in a DWORD, which means that it wraps around to zero every 49.7 days. This article shows how to solve t…
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…
In this fifth video of the Xpdf series, we discuss and demonstrate the PDFdetach utility, which is able to list and, more importantly, extract attachments that are embedded in PDF files. It does this via a command line interface, making it suitable …
Suggested Courses

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question