{"id":47624,"date":"2025-10-21T09:04:27","date_gmt":"2025-10-21T16:04:27","guid":{"rendered":"https:\/\/www.caninca.com\/?page_id=47624"},"modified":"2025-10-29T12:43:53","modified_gmt":"2025-10-29T19:43:53","slug":"generador-de-facturas","status":"publish","type":"page","link":"https:\/\/www.caninca.com\/en\/apps\/generador-de-facturas\/","title":{"rendered":"Generador de Facturas"},"content":{"rendered":"<style>.kb-row-layout-id47624_4674d8-f7 > .kt-row-column-wrap{align-content:start;}:where(.kb-row-layout-id47624_4674d8-f7 > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:start;}.kb-row-layout-id47624_4674d8-f7 > .kt-row-column-wrap{column-gap:var(--global-kb-gap-md, 2rem);row-gap:var(--global-kb-gap-md, 2rem);padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);grid-template-columns:minmax(0, 1fr);}.kb-row-layout-id47624_4674d8-f7 > .kt-row-layout-overlay{opacity:0.30;}@media all and (max-width: 1024px){.kb-row-layout-id47624_4674d8-f7 > .kt-row-column-wrap{grid-template-columns:minmax(0, 1fr);}}@media all and (max-width: 767px){.kb-row-layout-id47624_4674d8-f7 > .kt-row-column-wrap{grid-template-columns:minmax(0, 1fr);}}<\/style><div class=\"kb-row-layout-wrap kb-row-layout-id47624_4674d8-f7 alignfull wp-block-kadence-rowlayout\"><div class=\"kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top\">\n<style>.kadence-column47624_dc1554-94 > .kt-inside-inner-col,.kadence-column47624_dc1554-94 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column47624_dc1554-94 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column47624_dc1554-94 > .kt-inside-inner-col{flex-direction:column;}.kadence-column47624_dc1554-94 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column47624_dc1554-94 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column47624_dc1554-94{position:relative;}@media all and (max-width: 1024px){.kadence-column47624_dc1554-94 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column47624_dc1554-94 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column47624_dc1554-94\"><div class=\"kt-inside-inner-col\">\n<!DOCTYPE html>\n<html lang=\"es\">\n<head>

<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script id="bv-lazyload-images" data-cfasync="false" bv-exclude="true">var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});var bv_lazyload_event_listener="load",bv_lazyload_events=["mousemove","click","keydown","wheel","touchmove","touchend"],bv_use_srcset_attr=!1,BV_DEBUG_MODE=!1,bv_style_observer,img_observer,picture_lazy_observer,bvImageLazyloadObserverOptions={rootMargin:"200px 0px",threshold:.01};function bvDebugLog(...args){BV_DEBUG_MODE&&console.log(...args)}__name(bvDebugLog,"bvDebugLog"),bv_lazyload_event_listener=="load"?window.addEventListener("load",event=>{handle_lazyload_images()}):bv_lazyload_event_listener=="readystatechange"&&document.addEventListener("readystatechange",event=>{document.readyState==="interactive"&&handle_lazyload_images()});function add_lazyload_image_event_listeners(handle_lazyload_images2){bv_lazyload_events.forEach(function(event){document.addEventListener(event,handle_lazyload_images2,!0)})}__name(add_lazyload_image_event_listeners,"add_lazyload_image_event_listeners");function remove_lazyload_image_event_listeners(){bv_lazyload_events.forEach(function(event){document.removeEventListener(event,handle_lazyload_images,!0)})}__name(remove_lazyload_image_event_listeners,"remove_lazyload_image_event_listeners");function bv_replace_lazyloaded_image_url(element2){let src_value=element2.getAttribute("bv-data-src"),srcset_value=element2.getAttribute("bv-data-srcset"),currentSrc=element2.getAttribute("src");currentSrc&&currentSrc.startsWith("data:image/svg+xml")&&(bv_use_srcset_attr&&srcset_value&&element2.setAttribute("srcset",srcset_value),src_value&&element2.setAttribute("src",src_value))}__name(bv_replace_lazyloaded_image_url,"bv_replace_lazyloaded_image_url");function bv_replace_inline_style_image_url(element2){let bv_style_attr=element2.getAttribute("bv-data-style");if(bvDebugLog(bv_style_attr),bv_style_attr){let currentStyles=element2.getAttribute("style")||"",newStyle=currentStyles+(currentStyles?";":"")+bv_style_attr;element2.setAttribute("style",newStyle)}else bvDebugLog("BV_STYLE_ATTRIBUTE_NOT_FOUND : "+entry)}__name(bv_replace_inline_style_image_url,"bv_replace_inline_style_image_url");function handleLazyloadImages(entries){entries.map(entry2=>{entry2.isIntersecting&&(bv_replace_lazyloaded_image_url(entry2.target),img_observer.unobserve(entry2.target))})}__name(handleLazyloadImages,"handleLazyloadImages");function handleOnscreenInlineStyleImages(entries){entries.map(entry2=>{entry2.isIntersecting&&(bv_replace_inline_style_image_url(entry2.target),bv_style_observer.unobserve(entry2.target))})}__name(handleOnscreenInlineStyleImages,"handleOnscreenInlineStyleImages");function handlePictureTags(entries){entries.map(entry2=>{entry2.isIntersecting&&(bv_replace_picture_tag_url(entry2.target),picture_lazy_observer.unobserve(entry2.target))})}__name(handlePictureTags,"handlePictureTags");function bv_replace_picture_tag_url(element2){const child_elements=element2.children;for(let i=0;i<child_elements.length;i++){let child_elem=child_elements[i],_srcset=child_elem.getAttribute("bv-data-srcset"),_src=child_elem.getAttribute("bv-data-src");_srcset&&child_elem.setAttribute("srcset",_srcset),_src&&child_elem.setAttribute("src",_src),bv_replace_picture_tag_url(child_elem)}}__name(bv_replace_picture_tag_url,"bv_replace_picture_tag_url"),"IntersectionObserver"in window&&(bv_style_observer=new IntersectionObserver(handleOnscreenInlineStyleImages,bvImageLazyloadObserverOptions),img_observer=new IntersectionObserver(handleLazyloadImages,bvImageLazyloadObserverOptions),picture_lazy_observer=new IntersectionObserver(handlePictureTags,bvImageLazyloadObserverOptions));function handle_lazyload_images(){"IntersectionObserver"in window?(document.querySelectorAll(".bv-lazyload-bg-style").forEach(target_element=>{bv_style_observer.observe(target_element)}),document.querySelectorAll(".bv-lazyload-tag-img").forEach(img_element=>{img_observer.observe(img_element)}),document.querySelectorAll(".bv-lazyload-picture").forEach(picture_element=>{picture_lazy_observer.observe(picture_element)})):(document.querySelectorAll(".bv-lazyload-bg-style").forEach(target_element=>{bv_replace_inline_style_image_url(target_element)}),document.querySelectorAll(".bv-lazyload-tag-img").forEach(target_element=>{bv_replace_lazyloaded_image_url(target_element)}),document.querySelectorAll(".bv-lazyload-picture").forEach(picture_element=>{bv_replace_picture_tag_url(element)}))}__name(handle_lazyload_images,"handle_lazyload_images");
</script>

<script id="bv-viewport-image-hydration" data-cfasync="false" bv-exclude="true">var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});const BV_VIEWPORT_IMAGE_CLASS="bv-viewport-img",BV_VIEWPORT_IMAGE_SWAP_MODE="src";function getViewportImageDeviceName(){let device_width=window.outerWidth;return device_width<=480?"mobile":device_width<=820?"ipad":device_width<=1536?"desktop":"large"}__name(getViewportImageDeviceName,"getViewportImageDeviceName");function getViewportHydrationAttr(node_element,attr_suffix,device_name){let attr_names=["bv-data-"+device_name+"-"+attr_suffix,"bv-data-large-"+attr_suffix];for(let index=0;index<attr_names.length;index+=1){let attr_value=node_element.getAttribute(attr_names[index]);if(attr_value)return attr_value}return""}__name(getViewportHydrationAttr,"getViewportHydrationAttr");function hydrateViewportImage(node_element){if(!node_element||node_element.getAttribute("bv-viewport-hydrated")==="1")return;let hydrated=!1,device_name=getViewportImageDeviceName(),src_attr=getViewportHydrationAttr(node_element,"src",device_name),srcset_attr=getViewportHydrationAttr(node_element,"srcset",device_name);BV_VIEWPORT_IMAGE_SWAP_MODE==="srcset"&&srcset_attr&&(node_element.setAttribute("srcset",srcset_attr),hydrated=!0),src_attr&&(node_element.setAttribute("src",src_attr),hydrated=!0),hydrated&&node_element.setAttribute("bv-viewport-hydrated","1")}__name(hydrateViewportImage,"hydrateViewportImage");function hydrateViewportImages(){let img_tags=document.querySelectorAll("."+BV_VIEWPORT_IMAGE_CLASS);setTimeout(()=>{img_tags.forEach(img_tag=>{hydrateViewportImage(img_tag)})},0)}__name(hydrateViewportImages,"hydrateViewportImages"),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",hydrateViewportImages):hydrateViewportImages();
</script>

<script id="bv-dl-scripts-list" data-cfasync="false" bv-exclude="true">
var scriptAttrs = [{"attrs":{"src":"\\"https:\\/\\/cdnjs.cloudflare.com\\/ajax\\/libs\\/jspdf\\/2.5.1\\/jspdf.umd.min.js\\"","defer":true,"data-cfasync":false,"async":false,"bv_inline_delayed":false},"bv_unique_id":"Pk2GdyMP87Y1e10nRq4C","reference":0},{"attrs":{"defer":true,"data-cfasync":false,"async":false,"bv_inline_delayed":true},"bv_unique_id":"gySpVprEVh9P608OhlQv","reference":1},{"attrs":{"src":"data:text\/javascript;base64, ZnVuY3Rpb24gYnZfdHJpZ2dlcl9haXJsaWZ0X2V2ZW50KHRhcmdldCwgZXZlbnRfdHlwZSkgewoKICBpZiAoZXZlbnRfdHlwZSA9PT0gInJlYWR5c3RhdGVjaGFuZ2UiKSB7CiAgICBpZiAoYnZfc3RhdGVfY291bnRlciA9PT0gMCkgewogICAgICBidl9zdGF0ZV9jb3VudGVyICs9IDEKICAgICAgYnZfY3VzdG9tX3JlYWR5X3N0YXRlX3ZhbHVlID0gImludGVyYWN0aXZlIgogICAgfSBlbHNlIGlmKGJ2X3N0YXRlX2NvdW50ZXIgPT09IDEpIHsKICAgICAgYnZfc3RhdGVfY291bnRlciArPSAxCiAgICAgIGJ2X2N1c3RvbV9yZWFkeV9zdGF0ZV92YWx1ZSA9ICJjb21wbGV0ZSIKICAgIH0KICB9CgogIGxldCBldmVudF9uYW1lID0gIkFpcmxpZnQiICsgZXZlbnRfdHlwZTsKICBsZXQgc3ludGhldGljRXZlbnQgPSBuZXcgRXZlbnQoZXZlbnRfbmFtZSwgeyBidWJibGVzOiB0cnVlIH0pOwoKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ludGhldGljRXZlbnQsICJ0eXBlIiwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50X3R5cGU7IH0sIHNldDogZnVuY3Rpb24gKCkgeyB9IH0pOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzeW50aGV0aWNFdmVudCwgInRhcmdldCIsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0YXJnZXQ7IH0sIHNldDogZnVuY3Rpb24gKCkgeyB9IH0pOwoKICB0YXJnZXQuZGlzcGF0Y2hFdmVudChzeW50aGV0aWNFdmVudCk7Cn0KCmZ1bmN0aW9uIGJ2X2Rpc3BhdGNoRGVsYXllZEV2ZW50cygpIHsKICAgIGJ2X3RyaWdnZXJfYWlybGlmdF9ldmVudChkb2N1bWVudCwgInJlYWR5c3RhdGVjaGFuZ2UiKTsKICAgIGJ2X3RyaWdnZXJfYWlybGlmdF9ldmVudChkb2N1bWVudCwgIkRPTUNvbnRlbnRMb2FkZWQiKTsKCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBidl90cmlnZ2VyX2FpcmxpZnRfZXZlbnQoZG9jdW1lbnQsICJyZWFkeXN0YXRlY2hhbmdlIik7CgogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBidl90cmlnZ2VyX2FpcmxpZnRfZXZlbnQod2luZG93LCAibG9hZCIpOwogICAgICAgICAgICBidl90cmlnZ2VyX2FpcmxpZnRfZXZlbnQod2luZG93LCAicGFnZXNob3ciKTsKICAgICAgICB9LCAwKTsKICAgIH0sIDApOwp9Cgp2YXIgYnZfc3RhdGVfY291bnRlciA9IDAKCmJ2X2Rpc3BhdGNoRGVsYXllZEV2ZW50cygpOwoK","id":"bv-trigger-listener","type":"text\/javascript","defer":true,"async":false},"bv_unique_id":"d6fe9c24159ed4a27d224d91c70f8fdc","reference":100000000}];
</script>
<script id="bv-web-worker" type="javascript/worker" data-cfasync="false" bv-exclude="true">var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});var BV_DEBUG_MODE=!1;function bvDebugLog(...args){BV_DEBUG_MODE&&console.log(...args)}__name(bvDebugLog,"bvDebugLog"),self.onmessage=function(e){var counter=e.data.fetch_urls.length;e.data.fetch_urls.forEach(function(fetch_url){loadUrl(fetch_url,function(){bvDebugLog("DONE: "+fetch_url),counter=counter-1,counter===0&&self.postMessage({status:"SUCCESS"})})})};async function loadUrl(fetch_url,callback){try{var request=new Request(fetch_url,{mode:"no-cors",redirect:"follow"});await fetch(request),callback()}catch(fetchError){bvDebugLog("Fetch Error loading URL:",fetchError);try{var xhr=new XMLHttpRequest;xhr.onerror=callback,xhr.onload=callback,xhr.responseType="blob",xhr.open("GET",fetch_url,!0),xhr.send()}catch(xhrError){bvDebugLog("XHR Error loading URL:",xhrError),callback()}}}__name(loadUrl,"loadUrl");
</script>
<script id="bv-web-worker-handler" data-cfasync="false" bv-exclude="true">var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});if(typeof scriptAttrs<"u"&&Array.isArray(scriptAttrs)&&scriptAttrs.length>0){const lastElement=scriptAttrs[scriptAttrs.length-1];if(lastElement.attrs&&lastElement.attrs.id==="bv-trigger-listener"){var bv_custom_ready_state_value="loading";Object.defineProperty(document,"readyState",{get:__name(function(){return bv_custom_ready_state_value},"get"),set:__name(function(){},"set")})}}if(typeof scriptAttrs>"u"||!Array.isArray(scriptAttrs))var scriptAttrs=[];if(typeof linkStyleAttrs>"u"||!Array.isArray(linkStyleAttrs))var linkStyleAttrs=[];var BV_DEBUG_MODE=!1;function bvDebugLog(...args){BV_DEBUG_MODE&&console.log(...args)}__name(bvDebugLog,"bvDebugLog");function isMobileDevice(){return window.innerWidth<=500}__name(isMobileDevice,"isMobileDevice");var js_dom_loaded=!1;document.addEventListener("DOMContentLoaded",()=>{js_dom_loaded=!0});const EVENTS=["mousemove","click","keydown","wheel","touchmove","touchend"];var scriptUrls=[],styleUrls=[],bvEventCalled=!1,workerFinished=!1,functionExec=!1,scriptsInjected=!1,stylesInjected=!1,bv_load_event_fired=!1,autoInjectTimerStarted=!1;const BV_AUTO_INJECT_ENABLED=!0,BV_DESKTOP_AUTO_INJECT_DELAY=4e3,BV_MOBILE_AUTO_INJECT_DELAY=1e4,BV_WORKER_TIMEOUT_DURATION=3e3;scriptAttrs.forEach((scriptAttr,index)=>{scriptAttr.attrs.src&&!scriptAttr.attrs.src.includes("data:text/javascript")&&(scriptUrls[index]=scriptAttr.attrs.src)}),linkStyleAttrs.forEach((linkAttr,index)=>{styleUrls[index]=linkAttr.attrs.href});var fetchUrls=scriptUrls.concat(styleUrls);function addEventListeners(bvEventHandler2){EVENTS.forEach(function(event){document.addEventListener(event,bvEventFired,!0),document.addEventListener(event,bvEventHandler2,!0)})}__name(addEventListeners,"addEventListeners");function removeEventListeners(){EVENTS.forEach(function(event){document.removeEventListener(event,bvEventHandler,!0)})}__name(removeEventListeners,"removeEventListeners");function bvEventFired(){bvEventCalled||(bvEventCalled=!0,workerFinished=!0)}__name(bvEventFired,"bvEventFired");function bvGetElement(attributes,element){Object.keys(attributes).forEach(function(attr){attr==="async"?element.async=attributes[attr]:attr==="innerHTML"?element.innerHTML=atob(attributes[attr]):element.setAttribute(attr,attributes[attr])})}__name(bvGetElement,"bvGetElement");function bvAddElement(attr,element){var attributes=attr.attrs;if(attributes.bv_inline_delayed){let bvScriptId=attr.bv_unique_id,bvScriptElement=document.querySelector("[bv_unique_id='"+bvScriptId+"']");bvScriptElement?(!attributes.innerHTML&&!attributes.src&&bvScriptElement.textContent.trim()!==""&&(attributes.src="data:text/javascript;base64, "+btoa(unescape(encodeURIComponent(bvScriptElement.textContent)))),bvGetElement(attributes,element),bvScriptElement.after(element)):bvDebugLog(`Script not found for ${bvScriptId}`)}else{bvGetElement(attributes,element);var templateId=attr.bv_unique_id,targetElement=document.querySelector("[id='"+templateId+"']");targetElement&&targetElement.after(element)}}__name(bvAddElement,"bvAddElement");function injectStyles(){if(stylesInjected){bvDebugLog("Styles already injected, skipping");return}stylesInjected=!0,document.querySelectorAll('style[type="bv_inline_delayed_css"], template[id]').forEach(element=>{if(element.tagName.toLowerCase()==="style"){var new_style=document.createElement("style");new_style.type="text/css",new_style.textContent=element.textContent,element.after(new_style),new_style.parentNode?element.remove():bvDebugLog("PARENT NODE NOT FOUND")}else if(element.tagName.toLowerCase()==="template"){var templateId=element.id,linkStyleAttr=linkStyleAttrs.find(attr=>attr.bv_unique_id===templateId);if(linkStyleAttr){var link=document.createElement("link");bvAddElement(linkStyleAttr,link),element.parentNode&&element.parentNode.replaceChild(link,element),bvDebugLog("EXTERNAL STYLE ADDED")}else bvDebugLog(`No linkStyleAttr found for template ID ${templateId}`)}}),linkStyleAttrs.forEach((linkStyleAttr,index)=>{bvDebugLog("STYLE ADDED");var element=document.createElement("link");bvAddElement(linkStyleAttr,element)})}__name(injectStyles,"injectStyles");function injectScripts(){if(scriptsInjected){bvDebugLog("Scripts already injected, skipping");return}scriptsInjected=!0;let last_script_element;scriptAttrs.forEach((scriptAttr,index)=>{if(bv_custom_ready_state_value==="loading"&&scriptAttr.attrs&&scriptAttr.attrs.is_first_defer_element===!0)if(last_script_element){const readyStateScript=document.createElement("script");readyStateScript.src="data:text/javascript;base64, "+btoa(unescape(encodeURIComponent("bv_custom_ready_state_value = 'interactive';"))),readyStateScript.async=!1,last_script_element.after(readyStateScript)}else bv_custom_ready_state_value="interactive",bvDebugLog('Ready state manually set to "interactive"');bvDebugLog("JS ADDED");var element=document.createElement("script");last_script_element=element,bvAddElement(scriptAttr,element)})}__name(injectScripts,"injectScripts");function bvEventHandler(){bvDebugLog("EVENT FIRED"),js_dom_loaded&&bvEventCalled&&workerFinished&&!functionExec&&(functionExec=!0,injectStyles(),injectScripts(),removeEventListeners())}__name(bvEventHandler,"bvEventHandler");function autoInjectScriptsAfterLoad(){js_dom_loaded&&workerFinished&&!scriptsInjected&&!stylesInjected&&(bvDebugLog("Auto-injecting styles and scripts after timer"),injectStyles(),injectScripts())}__name(autoInjectScriptsAfterLoad,"autoInjectScriptsAfterLoad");function startAutoInjectTimer(){if(BV_AUTO_INJECT_ENABLED&&!autoInjectTimerStarted&&bv_load_event_fired&&!bvEventCalled){autoInjectTimerStarted=!0;var delay=isMobileDevice()?BV_MOBILE_AUTO_INJECT_DELAY:BV_DESKTOP_AUTO_INJECT_DELAY;bvDebugLog("Starting auto-inject timer with delay: "+delay+"ms"),setTimeout(function(){autoInjectScriptsAfterLoad()},delay)}}__name(startAutoInjectTimer,"startAutoInjectTimer"),addEventListeners(bvEventHandler);var requestObject=window.URL||window.webkitURL,bvWorker=new Worker(requestObject.createObjectURL(new Blob([document.getElementById("bv-web-worker").textContent],{type:"text/javascript"})));bvWorker.onmessage=function(e){e.data.status==="SUCCESS"&&(bvDebugLog("WORKER_FINISHED"),workerFinished=!0,bvEventHandler(),startAutoInjectTimer())},addEventListener("load",()=>{bvEventHandler(),bv_call_fetch_urls(),bv_load_event_fired=!0});function bv_call_fetch_urls(){!bv_load_event_fired&&!workerFinished&&(bvWorker.postMessage({fetch_urls:fetchUrls}),bv_initiate_worker_timer())}__name(bv_call_fetch_urls,"bv_call_fetch_urls"),setTimeout(function(){bv_call_fetch_urls()},5e3);function bv_initiate_worker_timer(){setTimeout(function(){workerFinished||(bvDebugLog("WORKER_TIMEDOUT"),workerFinished=!0,bvWorker.terminate()),bvEventHandler(),startAutoInjectTimer()},BV_WORKER_TIMEOUT_DURATION)}__name(bv_initiate_worker_timer,"bv_initiate_worker_timer");
</script>
\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Generador de Facturas<\/title>\n    <template id="Pk2GdyMP87Y1e10nRq4C"></template><\/script>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            padding: 20px;\n            min-height: 100vh;\n        }\n\n        .container {\n            max-width: 1000px;\n            margin: 0 auto;\n            background: white;\n            border-radius: 12px;\n            box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\n            padding: 30px;\n        }\n\n        h1 {\n            color: #333;\n            text-align: center;\n            margin-bottom: 10px;\n            font-size: 2rem;\n        }\n\n        .subtitle {\n            text-align: center;\n            color: #666;\n            margin-bottom: 30px;\n            font-size: 0.9rem;\n        }\n\n        .section {\n            margin-bottom: 30px;\n            padding: 20px;\n            border: 1px solid #e0e0e0;\n            border-radius: 8px;\n            background: #fafafa;\n        }\n\n        .section-title {\n            font-size: 1.3rem;\n            color: #007bff;\n            margin-bottom: 15px;\n            font-weight: 600;\n        }\n\n        .form-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n            gap: 15px;\n        }\n\n        .form-group {\n            display: flex;\n            flex-direction: column;\n        }\n\n        label {\n            font-weight: 600;\n            color: #555;\n            margin-bottom: 5px;\n            font-size: 0.9rem;\n        }\n\n        input[type=\"text\"],\n        input[type=\"email\"],\n        input[type=\"number\"],\n        textarea {\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 6px;\n            font-size: 0.95rem;\n            transition: border-color 0.3s, box-shadow 0.3s;\n        }\n\n        input:focus,\n        textarea:focus {\n            outline: none;\n            border-color: #007bff;\n            box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1);\n        }\n\n        textarea {\n            resize: vertical;\n            min-height: 60px;\n        }\n\n        .logo-upload {\n            margin-bottom: 15px;\n        }\n\n        .logo-preview {\n            max-width: 150px;\n            max-height: 100px;\n            margin-top: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            display: none;\n        }\n\n        .file-input-wrapper {\n            position: relative;\n            display: inline-block;\n            width: 100%;\n        }\n\n        .file-input-wrapper input[type=\"file\"] {\n            position: absolute;\n            opacity: 0;\n            width: 100%;\n            height: 100%;\n            cursor: pointer;\n        }\n\n        .file-input-label {\n            display: inline-block;\n            padding: 10px 15px;\n            background: #007bff;\n            color: white;\n            border-radius: 6px;\n            cursor: pointer;\n            font-weight: 600;\n            transition: background 0.3s;\n        }\n\n        .file-input-label:hover {\n            background: #0056b3;\n        }\n\n        .file-name {\n            display: inline-block;\n            margin-left: 10px;\n            color: #666;\n            font-size: 0.9rem;\n        }\n\n        .products-section {\n            background: white;\n        }\n\n        .products-table {\n            width: 100%;\n            overflow-x: auto;\n        }\n\n        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin-bottom: 15px;\n        }\n\n        th {\n            background: #007bff;\n            color: white;\n            padding: 12px;\n            text-align: left;\n            font-weight: 600;\n            font-size: 0.9rem;\n        }\n\n        td {\n            padding: 10px;\n            border-bottom: 1px solid #e0e0e0;\n        }\n\n        td input {\n            width: 100%;\n            padding: 8px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n        }\n\n        .btn {\n            padding: 10px 20px;\n            border: none;\n            border-radius: 6px;\n            cursor: pointer;\n            font-size: 0.95rem;\n            font-weight: 600;\n            transition: all 0.3s;\n            display: inline-flex;\n            align-items: center;\n            gap: 8px;\n        }\n\n        .btn-primary {\n            background: #007bff;\n            color: white;\n        }\n\n        .btn-primary:hover {\n            background: #0056b3;\n            transform: translateY(-2px);\n            box-shadow: 0 4px 12px rgba(0, 123, 255, 0.3);\n        }\n\n        .btn-success {\n            background: #28a745;\n            color: white;\n        }\n\n        .btn-success:hover {\n            background: #218838;\n            transform: translateY(-2px);\n            box-shadow: 0 4px 12px rgba(40, 167, 69, 0.3);\n        }\n\n        .btn-danger {\n            background: #dc3545;\n            color: white;\n            padding: 6px 12px;\n            font-size: 0.85rem;\n        }\n\n        .btn-danger:hover {\n            background: #c82333;\n        }\n\n        .btn-secondary {\n            background: #6c757d;\n            color: white;\n        }\n\n        .btn-secondary:hover {\n            background: #5a6268;\n            transform: translateY(-2px);\n            box-shadow: 0 4px 12px rgba(108, 117, 125, 0.3);\n        }\n\n        .totals {\n            margin-top: 20px;\n            padding: 20px;\n            background: #f8f9fa;\n            border-radius: 8px;\n            border: 2px solid #007bff;\n        }\n\n        .total-row {\n            display: flex;\n            justify-content: space-between;\n            margin-bottom: 10px;\n            font-size: 1.1rem;\n        }\n\n        .total-row.final {\n            font-size: 1.4rem;\n            font-weight: bold;\n            color: #007bff;\n            padding-top: 10px;\n            border-top: 2px solid #007bff;\n        }\n\n        .actions {\n            display: flex;\n            gap: 15px;\n            justify-content: center;\n            margin-top: 30px;\n            flex-wrap: wrap;\n        }\n\n        .error {\n            color: #dc3545;\n            font-size: 0.85rem;\n            margin-top: 5px;\n            display: none;\n        }\n\n        @media (max-width: 768px) {\n            .container {\n                padding: 20px;\n            }\n\n            h1 {\n                font-size: 1.5rem;\n            }\n\n            .form-grid {\n                grid-template-columns: 1fr;\n            }\n\n            table {\n                font-size: 0.85rem;\n            }\n\n            th, td {\n                padding: 8px 4px;\n            }\n\n            .actions {\n                flex-direction: column;\n            }\n\n            .btn {\n                width: 100%;\n                justify-content: center;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h1>\ud83d\udcc4 Generador de Facturas<\/h1>\n        <p class=\"subtitle\">Sistema profesional de facturaci\u00f3n gratuito<\/p>\n\n        \n        <div class=\"section\">\n            <h2 class=\"section-title\">Datos de la Empresa<\/h2>\n            <div class=\"logo-upload\">\n                <label>Logo de la Empresa (opcional)<\/label>\n                <div class=\"file-input-wrapper\">\n                    <input type=\"file\" id=\"logoInput\" accept=\"image\/*\">\n                    <label for=\"logoInput\" class=\"file-input-label\">\ud83d\udcc1 Buscar<\/label>\n                    <span class=\"file-name\" id=\"fileName\">Ning\u00fan archivo seleccionado<\/span>\n                <\/div>\n                <img id=\"logoPreview\" class=\"logo-preview\" alt=\"Vista previa del logo\">\n            <\/div>\n            <div class=\"form-grid\">\n                <div class=\"form-group\">\n                    <label>Nombre de la Empresa *<\/label>\n                    <input type=\"text\" id=\"empresaNombre\" placeholder=\"Ej: Mi Empresa S.A. de C.V.\">\n                    <span class=\"error\" id=\"errorEmpresaNombre\">Este campo es requerido<\/span>\n                <\/div>\n                <div class=\"form-group\">\n                    <label>RFC *<\/label>\n                    <input type=\"text\" id=\"empresaRFC\" placeholder=\"Ej: ABC123456XXX\">\n                    <span class=\"error\" id=\"errorEmpresaRFC\">Este campo es requerido<\/span>\n                <\/div>\n                <div class=\"form-group\">\n                    <label>Direcci\u00f3n *<\/label>\n                    <textarea id=\"empresaDireccion\" placeholder=\"Calle, N\u00famero, Colonia, Ciudad, Estado, CP\"><\/textarea>\n                    <span class=\"error\" id=\"errorEmpresaDireccion\">Este campo es requerido<\/span>\n                <\/div>\n                <div class=\"form-group\">\n                    <label>Email *<\/label>\n                    <input type=\"email\" id=\"empresaEmail\" placeholder=\"contacto@empresa.com\">\n                    <span class=\"error\" id=\"errorEmpresaEmail\">Este campo es requerido<\/span>\n                <\/div>\n                <div class=\"form-group\">\n                    <label>N\u00famero de Factura *<\/label>\n                    <input type=\"text\" id=\"facturaNumero\" placeholder=\"Ej: F-001\">\n                    <span class=\"error\" id=\"errorFacturaNumero\">Este campo es requerido<\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        \n        <div class=\"section\">\n            <h2 class=\"section-title\">Datos del Cliente<\/h2>\n            <div class=\"form-grid\">\n                <div class=\"form-group\">\n                    <label>Nombre del Cliente *<\/label>\n                    <input type=\"text\" id=\"clienteNombre\" placeholder=\"Nombre completo o raz\u00f3n social\">\n                    <span class=\"error\" id=\"errorClienteNombre\">Este campo es requerido<\/span>\n                <\/div>\n                <div class=\"form-group\">\n                    <label>Direcci\u00f3n *<\/label>\n                    <textarea id=\"clienteDireccion\" placeholder=\"Direcci\u00f3n completa del cliente\"><\/textarea>\n                    <span class=\"error\" id=\"errorClienteDireccion\">Este campo es requerido<\/span>\n                <\/div>\n                <div class=\"form-group\">\n                    <label>Email *<\/label>\n                    <input type=\"email\" id=\"clienteEmail\" placeholder=\"cliente@email.com\">\n                    <span class=\"error\" id=\"errorClienteEmail\">Este campo es requerido<\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        \n        <div class=\"section products-section\">\n            <h2 class=\"section-title\">Productos \/ Servicios<\/h2>\n            <div class=\"products-table\">\n                <table id=\"productosTable\">\n                    <thead>\n                        <tr>\n                            <th style=\"width: 40%;\">Descripci\u00f3n<\/th>\n                            <th style=\"width: 15%;\">Cantidad<\/th>\n                            <th style=\"width: 20%;\">Precio Unitario<\/th>\n                            <th style=\"width: 20%;\">Subtotal<\/th>\n                            <th style=\"width: 5%;\"><\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody id=\"productosBody\">\n                        <tr>\n                            <td><input type=\"text\" class=\"producto-desc\" placeholder=\"Descripci\u00f3n del producto\/servicio\"><\/td>\n                            <td><input type=\"number\" class=\"producto-cant\" min=\"1\" value=\"1\" step=\"1\"><\/td>\n                            <td><input type=\"number\" class=\"producto-precio\" min=\"0\" step=\"0.01\" placeholder=\"0.00\"><\/td>\n                            <td><input type=\"text\" class=\"producto-subtotal\" readonly value=\"$0.00\"><\/td>\n                            <td><button class=\"btn btn-danger\" onclick=\"eliminarProducto(this)\">\u2715<\/button><\/td>\n                        <\/tr>\n                    <\/tbody>\n                <\/table>\n            <\/div>\n            <button class=\"btn btn-primary\" onclick=\"agregarProducto()\">\u2795 Agregar Producto<\/button>\n            \n            <div class=\"totals\">\n                <div class=\"total-row\">\n                    <span>Subtotal:<\/span>\n                    <span id=\"subtotalGeneral\">$0.00<\/span>\n                <\/div>\n                <div class=\"total-row\">\n                    <span>IVA (16%):<\/span>\n                    <span id=\"ivaTotal\">$0.00<\/span>\n                <\/div>\n                <div class=\"total-row final\">\n                    <span>TOTAL:<\/span>\n                    <span id=\"totalFinal\">$0.00<\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        \n        <div class=\"actions\">\n            <button class=\"btn btn-secondary\" onclick=\"nuevoFormulario()\">\ud83d\udd04 Nuevo<\/button>\n            <button class=\"btn btn-success\" onclick=\"generarPDF()\">\ud83d\udce5 Generar PDF<\/button>\n        <\/div>\n    <\/div>\n\n    <script>\n        let logoDataURL = null;\n\n        \/\/ Manejo del logo\n        document.getElementById('logoInput').addEventListener('change', function(e) {\n            const file = e.target.files[0];\n            const fileNameSpan = document.getElementById('fileName');\n            \n            if (file) {\n                fileNameSpan.textContent = file.name;\n                const reader = new FileReader();\n                reader.onload = function(event) {\n                    logoDataURL = event.target.result;\n                    document.getElementById('logoPreview').src = logoDataURL;\n                    document.getElementById('logoPreview').style.display = 'block';\n                };\n                reader.readAsDataURL(file);\n            } else {\n                fileNameSpan.textContent = 'Ning\u00fan archivo seleccionado';\n                document.getElementById('logoPreview').style.display = 'none';\n            }\n        });\n\n        \/\/ Calcular subtotales\n        function calcularSubtotales() {\n            const filas = document.querySelectorAll('#productosBody tr');\n            let subtotalGeneral = 0;\n\n            filas.forEach(fila => {\n                const cantidad = parseFloat(fila.querySelector('.producto-cant').value) || 0;\n                const precio = parseFloat(fila.querySelector('.producto-precio').value) || 0;\n                const subtotal = cantidad * precio;\n                \n                fila.querySelector('.producto-subtotal').value = '$' + subtotal.toFixed(2);\n                subtotalGeneral += subtotal;\n            });\n\n            const iva = subtotalGeneral * 0.16;\n            const total = subtotalGeneral + iva;\n\n            document.getElementById('subtotalGeneral').textContent = '$' + subtotalGeneral.toFixed(2);\n            document.getElementById('ivaTotal').textContent = '$' + iva.toFixed(2);\n            document.getElementById('totalFinal').textContent = '$' + total.toFixed(2);\n        }\n\n        \/\/ Event listeners para c\u00e1lculos autom\u00e1ticos\n        document.addEventListener('input', function(e) {\n            if (e.target.classList.contains('producto-cant') || e.target.classList.contains('producto-precio')) {\n                calcularSubtotales();\n            }\n        });\n\n        function agregarProducto() {\n            const tbody = document.getElementById('productosBody');\n            const nuevaFila = document.createElement('tr');\n            nuevaFila.innerHTML = `\n                <td><input type=\"text\" class=\"producto-desc\" placeholder=\"Descripci\u00f3n del producto\/servicio\"><\/td>\n                <td><input type=\"number\" class=\"producto-cant\" min=\"1\" value=\"1\" step=\"1\"><\/td>\n                <td><input type=\"number\" class=\"producto-precio\" min=\"0\" step=\"0.01\" placeholder=\"0.00\"><\/td>\n                <td><input type=\"text\" class=\"producto-subtotal\" readonly value=\"$0.00\"><\/td>\n                <td><button class=\"btn btn-danger\" onclick=\"eliminarProducto(this)\">\u2715<\/button><\/td>\n            `;\n            tbody.appendChild(nuevaFila);\n        }\n\n        function eliminarProducto(btn) {\n            const tbody = document.getElementById('productosBody');\n            if (tbody.children.length > 1) {\n                btn.closest('tr').remove();\n                calcularSubtotales();\n            } else {\n                alert('Debe haber al menos un producto en la factura');\n            }\n        }\n\n        function validarFormulario() {\n            let valido = true;\n            const campos = [\n                'empresaNombre', 'empresaRFC', 'empresaDireccion', 'empresaEmail', 'facturaNumero',\n                'clienteNombre', 'clienteDireccion', 'clienteEmail'\n            ];\n\n            \/\/ Ocultar todos los errores primero\n            campos.forEach(campo => {\n                document.getElementById('error' + campo.charAt(0).toUpperCase() + campo.slice(1)).style.display = 'none';\n            });\n\n            \/\/ Validar campos\n            campos.forEach(campo => {\n                const input = document.getElementById(campo);\n                if (!input.value.trim()) {\n                    document.getElementById('error' + campo.charAt(0).toUpperCase() + campo.slice(1)).style.display = 'block';\n                    valido = false;\n                }\n            });\n\n            \/\/ Validar productos\n            const filas = document.querySelectorAll('#productosBody tr');\n            let productosValidos = true;\n            \n            filas.forEach(fila => {\n                const desc = fila.querySelector('.producto-desc').value.trim();\n                const cant = parseFloat(fila.querySelector('.producto-cant').value);\n                const precio = parseFloat(fila.querySelector('.producto-precio').value);\n\n                if (!desc || cant <= 0 || precio <= 0 || isNaN(cant) || isNaN(precio)) {\n                    productosValidos = false;\n                }\n            });\n\n            if (!productosValidos) {\n                alert('Por favor, complete todos los productos con valores v\u00e1lidos (descripci\u00f3n, cantidad > 0 y precio > 0)');\n                valido = false;\n            }\n\n            return valido;\n        }\n\n        function generarPDF() {\n            if (!validarFormulario()) {\n                return;\n            }\n\n            const { jsPDF } = window.jspdf;\n            const doc = new jsPDF();\n\n            let yPos = 20;\n\n            \/\/ Header\n            doc.setFillColor(0, 123, 255);\n            doc.rect(0, 0, 210, 15, 'F');\n            doc.setTextColor(255, 255, 255);\n            doc.setFontSize(10);\n            doc.text('Factura generada con Generador de Facturas (Gratis)', 105, 10, { align: 'center' });\n\n            yPos = 25;\n\n            \/\/ Logo si existe\n            if (logoDataURL) {\n                doc.addImage(logoDataURL, 'PNG', 15, yPos, 30, 20);\n            }\n\n            \/\/ Datos de la empresa\n            doc.setTextColor(0, 0, 0);\n            doc.setFontSize(16);\n            doc.setFont(undefined, 'bold');\n            doc.text(document.getElementById('empresaNombre').value, logoDataURL ? 50 : 15, yPos + 5);\n            \n            doc.setFontSize(10);\n            doc.setFont(undefined, 'normal');\n            doc.text('RFC: ' + document.getElementById('empresaRFC').value, logoDataURL ? 50 : 15, yPos + 12);\n            doc.text(document.getElementById('empresaDireccion').value, logoDataURL ? 50 : 15, yPos + 18, { maxWidth: 90 });\n            doc.text('Email: ' + document.getElementById('empresaEmail').value, logoDataURL ? 50 : 15, yPos + 24);\n\n            \/\/ N\u00famero de factura y fecha\n            doc.setFont(undefined, 'bold');\n            doc.text('FACTURA', 150, yPos + 5);\n            doc.setFont(undefined, 'normal');\n            doc.text('No: ' + document.getElementById('facturaNumero').value, 150, yPos + 12);\n            doc.text('Fecha: ' + new Date().toLocaleDateString('es-MX'), 150, yPos + 18);\n\n            yPos += 40;\n\n            \/\/ Datos del cliente\n            doc.setFillColor(240, 240, 240);\n            doc.rect(15, yPos, 180, 8, 'F');\n            doc.setFont(undefined, 'bold');\n            doc.text('DATOS DEL CLIENTE', 20, yPos + 5);\n            \n            yPos += 12;\n            doc.setFont(undefined, 'normal');\n            doc.text('Cliente: ' + document.getElementById('clienteNombre').value, 20, yPos);\n            yPos += 6;\n            doc.text('Direcci\u00f3n: ' + document.getElementById('clienteDireccion').value, 20, yPos, { maxWidth: 170 });\n            yPos += 6;\n            doc.text('Email: ' + document.getElementById('clienteEmail').value, 20, yPos);\n\n            yPos += 15;\n\n            \/\/ Tabla de productos\n            doc.setFillColor(0, 123, 255);\n            doc.rect(15, yPos, 180, 8, 'F');\n            doc.setTextColor(255, 255, 255);\n            doc.setFont(undefined, 'bold');\n            doc.text('Descripci\u00f3n', 20, yPos + 5);\n            doc.text('Cant.', 120, yPos + 5);\n            doc.text('Precio', 140, yPos + 5);\n            doc.text('Subtotal', 170, yPos + 5);\n\n            yPos += 12;\n            doc.setTextColor(0, 0, 0);\n            doc.setFont(undefined, 'normal');\n\n            const filas = document.querySelectorAll('#productosBody tr');\n            filas.forEach(fila => {\n                const desc = fila.querySelector('.producto-desc').value;\n                const cant = fila.querySelector('.producto-cant').value;\n                const precio = parseFloat(fila.querySelector('.producto-precio').value).toFixed(2);\n                const subtotal = fila.querySelector('.producto-subtotal').value;\n\n                doc.text(desc, 20, yPos, { maxWidth: 95 });\n                doc.text(cant, 120, yPos);\n                doc.text('$' + precio, 140, yPos);\n                doc.text(subtotal, 170, yPos);\n                yPos += 8;\n            });\n\n            yPos += 10;\n\n            \/\/ Totales\n            const subtotal = document.getElementById('subtotalGeneral').textContent;\n            const iva = document.getElementById('ivaTotal').textContent;\n            const total = document.getElementById('totalFinal').textContent;\n\n            doc.setDrawColor(200, 200, 200);\n            doc.line(130, yPos, 195, yPos);\n            yPos += 6;\n\n            doc.text('Subtotal:', 130, yPos);\n            doc.text(subtotal, 180, yPos, { align: 'right' });\n            yPos += 6;\n\n            doc.text('IVA (16%):', 130, yPos);\n            doc.text(iva, 180, yPos, { align: 'right' });\n            yPos += 6;\n\n            doc.setFont(undefined, 'bold');\n            doc.setFontSize(12);\n            doc.text('TOTAL:', 130, yPos);\n            doc.text(total, 180, yPos, { align: 'right' });\n\n            \/\/ Guardar PDF\n            const nombreArchivo = 'Factura_' + document.getElementById('facturaNumero').value + '.pdf';\n            doc.save(nombreArchivo);\n        }\n\n        function nuevoFormulario() {\n            if (confirm('\u00bfEst\u00e1 seguro de que desea limpiar el formulario?')) {\n                document.querySelectorAll('input[type=\"text\"], input[type=\"email\"], input[type=\"number\"], textarea').forEach(input => {\n                    input.value = '';\n                });\n                \n                document.getElementById('logoInput').value = '';\n                document.getElementById('fileName').textContent = 'Ning\u00fan archivo seleccionado';\n                document.getElementById('logoPreview').style.display = 'none';\n                logoDataURL = null;\n\n                \/\/ Limpiar tabla de productos excepto la primera fila\n                const tbody = document.getElementById('productosBody');\n                while (tbody.children.length > 1) {\n                    tbody.removeChild(tbody.lastChild);\n                }\n\n                \/\/ Resetear primera fila\n                tbody.children[0].querySelector('.producto-desc').value = '';\n                tbody.children[0].querySelector('.producto-cant').value = '1';\n                tbody.children[0].querySelector('.producto-precio').value = '';\n\n                calcularSubtotales();\n\n                \/\/ Ocultar mensajes de error\n                document.querySelectorAll('.error').forEach(error => {\n                    error.style.display = 'none';\n                });\n            }\n        }\n\n        \/\/ Calcular totales iniciales\n        calcularSubtotales();\n    <\/script>\n<\/body>\n<\/html>\n<\/div><\/div>\n\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Generador de Facturas \ud83d\udcc4 Generador de Facturas Sistema profesional de facturaci\u00f3n gratuito Datos de la Empresa Logo de la Empresa (opcional) \ud83d\udcc1 Buscar Ning\u00fan archivo seleccionado Nombre de la Empresa * Este campo es requerido RFC * Este campo es requerido Direcci\u00f3n * Este campo es requerido Email * Este campo es requerido N\u00famero de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":47620,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","slim_seo":{"title":"Generador de Facturas Gratuito","description":""},"iawp_total_views":2,"footnotes":""},"class_list":["post-47624","page","type-page","status-publish","hentry"],"blocksy_meta":{"has_hero_section":"disabled","styles_descriptor":{"styles":{"desktop":"[data-prefix=\"single_page\"] [class*=\"ct-container\"] > article[class*=\"post\"] {--has-boxed:var(--false);--has-wide:var(--true);}","tablet":"","mobile":""},"google_fonts":[],"version":6},"page_structure_type":"type-4","vertical_spacing_source":"custom","content_area_spacing":"none","content_style_source":"custom","disable_footer":"yes","disable_header":"yes","disable_featured_image":"yes","disable_share_box":"yes"},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"trp-custom-language-flag":false,"custom-1200":false,"custom-600":false,"custom-300":false,"woocommerce_archive_thumbnail":false,"woocommerce_thumbnail":false,"woocommerce_single":false,"woocommerce_gallery_thumbnail":false},"uagb_author_info":{"display_name":"fermagnet","author_link":"https:\/\/www.caninca.com\/en\/author\/fermagnet\/"},"uagb_comment_info":0,"uagb_excerpt":"Generador de Facturas \ud83d\udcc4 Generador de Facturas Sistema profesional de facturaci\u00f3n gratuito Datos de la Empresa Logo de la Empresa (opcional) \ud83d\udcc1 Buscar Ning\u00fan archivo seleccionado Nombre de la Empresa * Este campo es requerido RFC * Este campo es requerido Direcci\u00f3n * Este campo es requerido Email * Este campo es requerido N\u00famero de&hellip;","_links":{"self":[{"href":"https:\/\/www.caninca.com\/en\/wp-json\/wp\/v2\/pages\/47624","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.caninca.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.caninca.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.caninca.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.caninca.com\/en\/wp-json\/wp\/v2\/comments?post=47624"}],"version-history":[{"count":0,"href":"https:\/\/www.caninca.com\/en\/wp-json\/wp\/v2\/pages\/47624\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.caninca.com\/en\/wp-json\/wp\/v2\/pages\/47620"}],"wp:attachment":[{"href":"https:\/\/www.caninca.com\/en\/wp-json\/wp\/v2\/media?parent=47624"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}<!-- This website is optimized by Airlift. Learn more: https://airlift.net. Template:. Learn more: https://airlift.net. Template: 69f3f0b55612b7083f749601. Config Timestamp: 2026-05-01 00:15:48 UTC, Cached Timestamp: 2026-05-06 15:02:10 UTC -->