<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hovsep Arakelyan</title>
    <description>The latest articles on DEV Community by Hovsep Arakelyan (@pub404).</description>
    <link>https://dev.to/pub404</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4219480%2Faec76adf-a6dd-4625-af44-bf72cbe2ce4e.jpg</url>
      <title>DEV Community: Hovsep Arakelyan</title>
      <link>https://dev.to/pub404</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pub404"/>
    <language>en</language>
    <item>
      <title>How to Compress a Video Online for Free: Reduce MP4 File Size</title>
      <dc:creator>Hovsep Arakelyan</dc:creator>
      <pubDate>Sun, 01 Nov 2026 22:07:42 +0000</pubDate>
      <link>https://dev.to/pub404/how-to-compress-a-video-online-for-free-reduce-mp4-file-size-42fk</link>
      <guid>https://dev.to/pub404/how-to-compress-a-video-online-for-free-reduce-mp4-file-size-42fk</guid>
      <description>&lt;h2&gt;
  
  
  If you're not technical: use the free online tool
&lt;/h2&gt;

&lt;p&gt;If you're not a technical person and you're looking for a free way to make a video smaller, use my &lt;a href="https://quickconvertonline.com/tools/video-compressor" rel="noopener noreferrer"&gt;online video compressor&lt;/a&gt;. Choose your video, enter a target size or adjust the quality, then convert and download it. No installation or account is needed.&lt;/p&gt;

&lt;p&gt;For a strict upload limit, aim slightly below the maximum and check the downloaded file. Reducing the resolution can help, but keep text and important details readable.&lt;/p&gt;

&lt;p&gt;If you're technical and prefer a command-line workflow, I'll show an FFmpeg example after the browser steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to reduce a video's file size
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Video compressor and choose your video.&lt;/li&gt;
&lt;li&gt;Enter a target size in MB if you have a specific upload limit, or use the quality controls.&lt;/li&gt;
&lt;li&gt;Choose MP4 as the output if that suits the receiving service.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;More settings&lt;/strong&gt; and enable &lt;strong&gt;Resize during compression&lt;/strong&gt; if a smaller resolution is appropriate.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Convert&lt;/strong&gt; and wait for processing to finish.&lt;/li&gt;
&lt;li&gt;Check the downloaded video's size, picture and audio before sharing it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a service with a strict limit, aim a little below it. A target is an encoding goal, and container overhead and processing choices can affect the final size.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're technical: how it works
&lt;/h2&gt;

&lt;p&gt;If you're technical, you can re-encode a video locally with &lt;a href="https://ffmpeg.org/ffmpeg.html" rel="noopener noreferrer"&gt;FFmpeg&lt;/a&gt;. For an ordinary video with optional audio, and an FFmpeg build containing libx264 and AAC support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; input.mp4 &lt;span class="nt"&gt;-map&lt;/span&gt; 0:v:0 &lt;span class="nt"&gt;-map&lt;/span&gt; &lt;span class="s1"&gt;'0:a:0?'&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 26 &lt;span class="nt"&gt;-preset&lt;/span&gt; medium &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-b&lt;/span&gt;:a 128k &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This selects the first video stream and, if present, the first audio stream. It encodes H.264 video and AAC audio into MP4. It does not preserve additional streams such as subtitles.&lt;/p&gt;

&lt;p&gt;CRF controls the quality tradeoff; it does not request a fixed number of megabytes. With this encoder, increasing CRF generally reduces size and quality. Compare the output with the original rather than assuming every source will get smaller.&lt;/p&gt;

&lt;p&gt;For a size target, estimate the combined bitrate budget from duration, reserve some for audio and overhead, and use an appropriate bitrate-controlled workflow. My browser tool provides size-target controls so users do not need to calculate that manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why duration matters as much as resolution
&lt;/h3&gt;

&lt;p&gt;As a rough planning rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;file size ≈ duration × combined video-and-audio bitrate ÷ 8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, a 60-second video with a total bitrate of 2 megabits per second needs roughly 15 megabytes before container overhead.&lt;/p&gt;

&lt;p&gt;This explains why a long recording needs a much lower bitrate than a short clip to fit the same size limit. A target that looks reasonable for 30 seconds may look poor when spread across ten minutes.&lt;/p&gt;

&lt;p&gt;If only part of the recording is needed, trimming unnecessary time can help more than aggressive compression.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should you lower quality or resolution?
&lt;/h3&gt;

&lt;p&gt;Start with the content.&lt;/p&gt;

&lt;p&gt;A talking-head clip viewed on a phone may still look useful at 720p. A screen recording with tiny code or spreadsheet cells may need more resolution to keep the text readable.&lt;/p&gt;

&lt;p&gt;Lowering quality too far can create blocks, smearing and lost detail. Lowering resolution removes pixels, which can make small text unreadable even if the image looks smooth.&lt;/p&gt;

&lt;p&gt;Test a representative result. Check the most demanding moment: a busy scene, scrolling text or a frame with fine detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  MP4 alone does not mean a small file
&lt;/h3&gt;

&lt;p&gt;MP4 is a container, not a file-size setting.&lt;/p&gt;

&lt;p&gt;Two MP4 files with the same duration can differ greatly in size because their encoded bitrates, resolutions, frame rates and audio settings differ.&lt;/p&gt;

&lt;p&gt;Choose the output format for compatibility, then use the compression controls to manage size. Simply converting an existing video to MP4 does not guarantee a reduction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Browser processing has practical limits
&lt;/h3&gt;

&lt;p&gt;The video is processed on your device rather than submitted to a conversion server. The site uses browser media processing, including a WebAssembly-based FFmpeg path where needed.&lt;/p&gt;

&lt;p&gt;Large or lengthy videos can still take time and require substantial memory. Keep the tab open, and remember that local processing depends on your device's capabilities.&lt;/p&gt;

&lt;p&gt;Keep the original. Once you remove detail through lossy compression, the smaller file cannot bring it back.&lt;/p&gt;

&lt;p&gt;What do you compress most often: phone videos, screen recordings or clips for a website?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>video</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Convert JPG to PDF Online for Free: Combine Images into One File</title>
      <dc:creator>Hovsep Arakelyan</dc:creator>
      <pubDate>Sun, 01 Nov 2026 22:03:32 +0000</pubDate>
      <link>https://dev.to/pub404/how-to-convert-jpg-to-pdf-online-for-free-combine-images-into-one-file-53h</link>
      <guid>https://dev.to/pub404/how-to-convert-jpg-to-pdf-online-for-free-combine-images-into-one-file-53h</guid>
      <description>&lt;h2&gt;
  
  
  If you're not technical: use the free online tool
&lt;/h2&gt;

&lt;p&gt;If you're not a technical person and you're looking for a free way to turn JPG or PNG images into a PDF, use my &lt;a href="https://quickconvertonline.com/tools/image-to-pdf" rel="noopener noreferrer"&gt;online image to PDF converter&lt;/a&gt;. Add your pictures, arrange them, choose a page size and download one PDF. No installation or account is needed.&lt;/p&gt;

&lt;p&gt;It works well for collecting photographed pages, receipts or screenshots into one attachment, with one image per page.&lt;/p&gt;

&lt;p&gt;If you're technical, I'll explain how to calculate the image placement and build those pages after the steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to combine JPG images into a PDF
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Image to PDF and choose your images.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Add images&lt;/strong&gt; if you need to include more.&lt;/li&gt;
&lt;li&gt;Arrange them with the up and down arrows.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;A4&lt;/strong&gt;, &lt;strong&gt;US Letter&lt;/strong&gt; or &lt;strong&gt;Original&lt;/strong&gt; page size.&lt;/li&gt;
&lt;li&gt;Set the margin and choose landscape if appropriate.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Generate PDF&lt;/strong&gt;, inspect the preview and choose &lt;strong&gt;Download PDF&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The tool accepts up to 12 images per PDF, with a combined input limit of 60 MB.&lt;/p&gt;

&lt;p&gt;Before generating, check the sequence against the document itself. Camera file names do not always make the intended reading order obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're technical: how it works
&lt;/h2&gt;

&lt;p&gt;If you're technical, the basic workflow is to decode each image, embed it in a new PDF, and draw it on its own page. My implementation uses pdf-lib and fits each image inside the chosen margins.&lt;/p&gt;

&lt;p&gt;The fit calculation is straightforward. Given the source image's pixel dimensions and the PDF page's dimensions in points:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;availableWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pageWidth&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;availableHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pageHeight&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;availableWidth&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;imageWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;availableHeight&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;imageHeight&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;imageWidth&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;imageHeight&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pageWidth&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pageHeight&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the placement calculation, not a complete converter. Pass the resulting &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt;, &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; to the PDF image-drawing step. Taking the smaller scale factor keeps the whole image inside the page without cropping or stretching it.&lt;/p&gt;

&lt;p&gt;Validate dimensions and margins first. Image decoding, memory limits, orientation and download handling are additional parts of a usable browser tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  A4, Letter or Original: which should you choose?
&lt;/h3&gt;

&lt;p&gt;Use A4 or US Letter when the document is intended for printing on that paper size.&lt;/p&gt;

&lt;p&gt;Use Original when you want each PDF page to match its image's dimensions, which can suit screenshots and documents meant only for screens.&lt;/p&gt;

&lt;p&gt;For a wide image, landscape can make better use of a standard sheet. The tool fits the image within the available page area while keeping its proportions; it does not crop the image to fill the page.&lt;/p&gt;

&lt;p&gt;That means a differently shaped picture may have empty space beside it. Preserving all the content is usually more useful than filling every corner.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to remove the white border
&lt;/h3&gt;

&lt;p&gt;Choose &lt;strong&gt;Original&lt;/strong&gt; page size and set the margin to &lt;code&gt;0&lt;/code&gt; if you want the page boundary to follow the image without an added margin.&lt;/p&gt;

&lt;p&gt;This only removes the margin added by the converter. If your photo already includes a desk, a wall or a white border, that is part of the image. Crop the photo first if you want it removed.&lt;/p&gt;

&lt;p&gt;The converter packages the pictures; it does not automatically straighten a photographed sheet or recognize the text inside it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is the PDF larger than the photos?
&lt;/h3&gt;

&lt;p&gt;Turning photos into a PDF does not automatically compress them.&lt;/p&gt;

&lt;p&gt;This tool embeds images losslessly, so a PDF made from compressed JPG photos can be larger than the source images. If an upload limit matters, resize large photos first or use the &lt;a href="https://quickconvertonline.com/tools/compress-pdf" rel="noopener noreferrer"&gt;PDF compressor&lt;/a&gt; on the finished document.&lt;/p&gt;

&lt;p&gt;Always check small text after any size reduction. A smaller file is only useful if the recipient can still read it.&lt;/p&gt;

&lt;h3&gt;
  
  
  One file is easier to check and send
&lt;/h3&gt;

&lt;p&gt;The PDF is generated in your browser, without uploading the photos for conversion.&lt;/p&gt;

&lt;p&gt;Open the downloaded copy once before sharing it. Confirm that no page is missing, every image faces the right direction, and the final page order makes sense.&lt;/p&gt;

&lt;p&gt;What do you turn into PDFs most often: receipts, phone scans or screenshots?&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Convert PDF to Word Online for Free: Get an Editable DOCX</title>
      <dc:creator>Hovsep Arakelyan</dc:creator>
      <pubDate>Sun, 01 Nov 2026 18:27:41 +0000</pubDate>
      <link>https://dev.to/pub404/how-to-convert-pdf-to-word-online-for-free-get-an-editable-docx-1ek6</link>
      <guid>https://dev.to/pub404/how-to-convert-pdf-to-word-online-for-free-get-an-editable-docx-1ek6</guid>
      <description>&lt;h2&gt;
  
  
  If you're not technical: use the free online tool
&lt;/h2&gt;

&lt;p&gt;If you're not a technical person and you're looking for a free way to convert a PDF into an editable Word document, use my &lt;a href="https://quickconvertonline.com/tools/pdf-to-word" rel="noopener noreferrer"&gt;online PDF to Word converter&lt;/a&gt;. Choose your PDF, select DOCX and download the converted file. No installation or account is needed for the conversion.&lt;/p&gt;

&lt;p&gt;Open the result in Word, LibreOffice or Google Docs and check the layout before editing. Scanned pages remain images because this converter does not include OCR.&lt;/p&gt;

&lt;p&gt;If you're technical, I'll explain the document reconstruction pipeline after the steps. This is a more involved problem than changing a file extension.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to convert a PDF to an editable Word document
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open PDF to Word and choose your PDF.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;DOCX&lt;/strong&gt; as the output format.&lt;/li&gt;
&lt;li&gt;If you only need part of the document, enter a page range such as &lt;code&gt;1-3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Apply&lt;/strong&gt; and download the file.&lt;/li&gt;
&lt;li&gt;Open the DOCX in Word, LibreOffice or Google Docs and review it before editing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;DOCX is the best starting point for this workflow. The converter also offers other formats, but DOCX keeps the most detail for normal Word editing.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're technical: how it works
&lt;/h2&gt;

&lt;p&gt;If you're technical, the main challenge is reconstructing document structure from fixed page positions.&lt;/p&gt;

&lt;p&gt;My conversion pipeline extracts page content, groups text into a layout model, and passes that model to a DOCX writer. It handles text formatting, images and layout structures before generating the document package.&lt;/p&gt;

&lt;p&gt;The architecture can be summarized like this; this is a pipeline outline, not an executable API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PDF page content and text coordinates
    -&amp;gt; line and paragraph grouping
    -&amp;gt; column, table and image layout
    -&amp;gt; intermediate document model
    -&amp;gt; DOCX writer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A plain text extractor only solves part of the job. It may recover words while losing table structure or reading order. Conversely, placing a screenshot of each page in Word preserves the appearance but does not make the text editable.&lt;/p&gt;

&lt;p&gt;Scans introduce another stage: OCR. My converter does not include it, so scanned pages are reported and retained as images. Font availability and Word's own layout engine still affect how reconstructed documents render.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why converting PDF to Word is harder than it looks
&lt;/h3&gt;

&lt;p&gt;A PDF can describe where individual text fragments appear on a page without storing the same paragraph structure a word processor uses.&lt;/p&gt;

&lt;p&gt;The converter has to infer which fragments form paragraphs, which items belong in a table, and how columns should relate to one another.&lt;/p&gt;

&lt;p&gt;The tool rebuilds text and layout, including features such as ruled tables, columns, links and images. Results depend on the source document; those features are not a guarantee that every complex layout will convert perfectly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will the formatting stay exactly the same?
&lt;/h3&gt;

&lt;p&gt;Expect to review it, especially if the PDF has a complicated design.&lt;/p&gt;

&lt;p&gt;Start with these checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do headings and paragraphs wrap sensibly?&lt;/li&gt;
&lt;li&gt;Are table rows and columns aligned?&lt;/li&gt;
&lt;li&gt;Are images beside the correct text?&lt;/li&gt;
&lt;li&gt;Did any page breaks move?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fonts are a common reason for differences. If a font used in the PDF is unavailable to your word processor, substitution can change line wrapping and spacing.&lt;/p&gt;

&lt;p&gt;Make a small edit and see how the surrounding paragraph behaves. Looking correct on first opening is only part of being useful as an editable document.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can it convert a scanned PDF into editable text?
&lt;/h3&gt;

&lt;p&gt;This converter does not include OCR.&lt;/p&gt;

&lt;p&gt;If a page is a scan, the page remains an image in the output document. Putting it inside a DOCX does not make the photographed words editable. The tool reports pages affected by this limitation.&lt;/p&gt;

&lt;p&gt;For recognized text from scans, use an OCR workflow first and proofread the recognition results.&lt;/p&gt;

&lt;h3&gt;
  
  
  When direct PDF editing is quicker
&lt;/h3&gt;

&lt;p&gt;If you only need to fix a date or spelling mistake, &lt;a href="https://quickconvertonline.com/tools/edit-pdf" rel="noopener noreferrer"&gt;editing the PDF text directly&lt;/a&gt; may be a shorter route.&lt;/p&gt;

&lt;p&gt;Conversion makes more sense when you need paragraphs to reflow, want to add substantial content, or plan to keep working on the document in Word.&lt;/p&gt;

&lt;p&gt;The processing happens locally in your browser, without an account or an added watermark. Keep the source PDF alongside the converted file so you can compare them while reviewing.&lt;/p&gt;

&lt;p&gt;What tends to break first in your PDF conversions: tables, fonts or page breaks?&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Sign a PDF Online for Free Without Printing or Scanning</title>
      <dc:creator>Hovsep Arakelyan</dc:creator>
      <pubDate>Sun, 01 Nov 2026 18:27:09 +0000</pubDate>
      <link>https://dev.to/pub404/how-to-sign-a-pdf-online-for-free-without-printing-or-scanning-2kbd</link>
      <guid>https://dev.to/pub404/how-to-sign-a-pdf-online-for-free-without-printing-or-scanning-2kbd</guid>
      <description>&lt;h2&gt;
  
  
  If you're not technical: use the free online tool
&lt;/h2&gt;

&lt;p&gt;If you're not a technical person and you're looking for a free way to add your signature to a PDF, use my &lt;a href="https://quickconvertonline.com/tools/sign-pdf" rel="noopener noreferrer"&gt;online PDF signing tool&lt;/a&gt;. Draw your signature or choose an existing image, place it on the page and download the result. No installation or account is needed.&lt;/p&gt;

&lt;p&gt;This adds a visual signature. Check that the recipient accepts that format; the tool does not create a certificate-based digital signature.&lt;/p&gt;

&lt;p&gt;If you're technical, I'll explain how the drawing and PDF placement work after the steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to add a signature to a PDF
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Sign PDF and choose your document.&lt;/li&gt;
&lt;li&gt;Choose an ink color and draw in the signature box, or select &lt;strong&gt;Choose image&lt;/strong&gt; to use an existing signature image.&lt;/li&gt;
&lt;li&gt;Select the page where the signature belongs.&lt;/li&gt;
&lt;li&gt;Click or drag on the preview to position it.&lt;/li&gt;
&lt;li&gt;Adjust &lt;strong&gt;Scale&lt;/strong&gt;, &lt;strong&gt;Rotation&lt;/strong&gt; and &lt;strong&gt;Opacity&lt;/strong&gt; as needed.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Apply&lt;/strong&gt;, download the PDF and reopen it to check the placement.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep the signature inside the intended space. It should not cover a date field, nearby text or the edge of the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're technical: how it works
&lt;/h2&gt;

&lt;p&gt;If you're technical, this workflow has two main parts: capture a signature as an image, then embed that image on a PDF page.&lt;/p&gt;

&lt;p&gt;A transparent canvas is useful for capturing pointer strokes without adding an opaque rectangle. The drawing can be exported as PNG and embedded in the document. My PDF implementation uses pdf-lib for image placement.&lt;/p&gt;

&lt;p&gt;The coordinate conversion needs care. A browser preview commonly uses a top-left origin, while PDF drawing coordinates commonly use a bottom-left origin. Preview scale, page rotation and the signature's dimensions also affect the final position.&lt;/p&gt;

&lt;p&gt;The implementation therefore maps the preview placement into page coordinates, applies scale and rotation, and saves a new document. A robust UI should check the saved result rather than relying only on a draggable preview overlay.&lt;/p&gt;

&lt;p&gt;This pipeline changes page content. It does not create a cryptographic signature, an identity check or an audit trail.&lt;/p&gt;

&lt;h3&gt;
  
  
  A cleaner signature starts with a larger drawing
&lt;/h3&gt;

&lt;p&gt;Drawing a tiny signature with a mouse often produces cramped strokes.&lt;/p&gt;

&lt;p&gt;Try using more of the signature pad, then reduce its scale on the page. A phone, tablet or stylus may feel more natural than a touchpad.&lt;/p&gt;

&lt;p&gt;Choose the ink color before drawing. Existing strokes keep the color they were drawn with, so changing the picker afterward does not recolor the whole drawing.&lt;/p&gt;

&lt;p&gt;The drawn signature has a transparent background, which helps it sit on the page without an opaque white rectangle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visual signature versus digital signature
&lt;/h3&gt;

&lt;p&gt;These terms get mixed together, but the capabilities differ.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;This tool adds&lt;/th&gt;
&lt;th&gt;This tool does not add&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A visible image of your handwriting&lt;/td&gt;
&lt;td&gt;Certificate-based identity verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A signature positioned on a PDF page&lt;/td&gt;
&lt;td&gt;Cryptographic proof of who signed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A downloadable copy of the document&lt;/td&gt;
&lt;td&gt;A signing audit trail or a lock against later edits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Check the recipient's requirements. If they request a specific signing service or certificate workflow, a pasted signature image does not provide those features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fill the form before placing the signature
&lt;/h3&gt;

&lt;p&gt;If the PDF contains interactive fields, complete those in &lt;a href="https://quickconvertonline.com/tools/fill-pdf-forms" rel="noopener noreferrer"&gt;Fill PDF forms&lt;/a&gt; first. Open the completed copy in Sign PDF afterward.&lt;/p&gt;

&lt;p&gt;This makes it easier to inspect the final page as a whole: filled details, date and signature together.&lt;/p&gt;

&lt;p&gt;If the file already contains a digital signature, pay attention to the tool's warning. Editing the PDF can affect validation of that existing signature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your signature stays in the local workflow
&lt;/h3&gt;

&lt;p&gt;The PDF and signature are processed in your browser rather than uploaded to a conversion server. That was a useful constraint for a tool handling something as personal as a handwriting sample.&lt;/p&gt;

&lt;p&gt;The final check is still yours: open the downloaded file, confirm the correct page is signed, and make sure the recipient accepts this signature format.&lt;/p&gt;

&lt;p&gt;Do you find it easier to sign with a mouse, a finger or an existing image?&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Split a PDF Online for Free: Separate Pages or Page Ranges</title>
      <dc:creator>Hovsep Arakelyan</dc:creator>
      <pubDate>Sun, 01 Nov 2026 18:20:26 +0000</pubDate>
      <link>https://dev.to/pub404/how-to-split-a-pdf-online-for-free-separate-pages-or-page-ranges-31kb</link>
      <guid>https://dev.to/pub404/how-to-split-a-pdf-online-for-free-separate-pages-or-page-ranges-31kb</guid>
      <description>&lt;h2&gt;
  
  
  If you're not technical: use the free online tool
&lt;/h2&gt;

&lt;p&gt;If you're not a technical person and you're looking for a free way to split a PDF, use my &lt;a href="https://quickconvertonline.com/tools/split-pdf" rel="noopener noreferrer"&gt;online PDF splitter&lt;/a&gt;. Choose your document, select individual pages or custom ranges, and download the separate files. No installation or account is needed.&lt;/p&gt;

&lt;p&gt;For example, you can turn one large scan into three documents instead of sending every page to everyone.&lt;/p&gt;

&lt;p&gt;If you're technical and want to automate the same task, I'll show a JavaScript example after the steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to split a PDF into separate pages
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Split PDF and choose your document.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;One file per page&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Apply&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Download the individual PDFs or the offered ZIP bundles.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A 12-page source produces 12 PDFs, each containing one page. That works well when a scan contains separate receipts or individual forms.&lt;/p&gt;

&lt;p&gt;It is less convenient when each document spans several pages. For that, use ranges.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're technical: how it works
&lt;/h2&gt;

&lt;p&gt;If you're technical, splitting can use the same page-copying operation as merging, with a separate output document for each group.&lt;/p&gt;

&lt;p&gt;This example uses &lt;a href="https://pdf-lib.js.org/" rel="noopener noreferrer"&gt;pdf-lib&lt;/a&gt;. Install it with &lt;code&gt;npm install pdf-lib&lt;/code&gt;, save the code as &lt;code&gt;split.mjs&lt;/code&gt;, and run &lt;code&gt;node split.mjs&lt;/code&gt; beside an unencrypted &lt;code&gt;input.pdf&lt;/code&gt; containing at least six pages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdf-lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;writeFile&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:fs/promises&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]];&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copyPages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`part-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.pdf`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Library page indices start at zero. This example saves pages 1–3 and 4–6 into two files; it does not include later pages. A user-facing range parser needs validation so a typo does not silently omit intended content.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to split a PDF by page ranges
&lt;/h3&gt;

&lt;p&gt;Choose &lt;strong&gt;Custom ranges&lt;/strong&gt; and enter the pages belonging to each output. A semicolon starts a new file.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1-3; 4-6; 7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That creates three PDFs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first contains pages 1 through 3.&lt;/li&gt;
&lt;li&gt;The second contains pages 4 through 6.&lt;/li&gt;
&lt;li&gt;The third contains page 7.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also combine separated pages within one output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1, 4-6; 2-3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here the first PDF contains page 1 followed by pages 4, 5 and 6. The second contains pages 2 and 3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use the page position, not the printed number
&lt;/h3&gt;

&lt;p&gt;This is an easy mistake to make with reports and books.&lt;/p&gt;

&lt;p&gt;A document might have a cover, an unnumbered contents page and then a page labeled “1.” In the PDF, that labeled page is actually the third page.&lt;/p&gt;

&lt;p&gt;Use the positions shown under the tool's thumbnails when defining ranges. Check the first and last page of each downloaded part before sharing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Splitting versus extracting pages
&lt;/h3&gt;

&lt;p&gt;Use splitting when you want several output files from one document.&lt;/p&gt;

&lt;p&gt;If you only want one smaller PDF containing selected pages, &lt;a href="https://quickconvertonline.com/tools/extract-pdf-pages" rel="noopener noreferrer"&gt;Extract PDF pages&lt;/a&gt; is a more direct choice.&lt;/p&gt;

&lt;p&gt;For example, saving only pages 8–10 of a report is an extraction job. Breaking the report into separate chapters is a splitting job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will the pages lose quality?
&lt;/h3&gt;

&lt;p&gt;The splitter copies pages into new PDFs without rendering them as images. Text and graphics retain their existing quality.&lt;/p&gt;

&lt;p&gt;However, the sizes of all the parts added together can exceed the original file size. Separate PDFs may each need their own copy of shared resources such as fonts. Splitting is about separating content; it does not guarantee a particular file size.&lt;/p&gt;

&lt;p&gt;Processing takes place in your browser. Large documents still need enough device memory, and large sets of results may be offered in multiple ZIP bundles.&lt;/p&gt;

&lt;p&gt;Before splitting, decide where each document begins and ends. A clear page plan saves more time than sorting through a folder of incorrectly divided files afterward.&lt;/p&gt;

&lt;p&gt;Have you ever received one giant scan that should have been several documents?&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Merge PDF Files Online for Free Without Adobe Acrobat</title>
      <dc:creator>Hovsep Arakelyan</dc:creator>
      <pubDate>Sun, 01 Nov 2026 18:19:25 +0000</pubDate>
      <link>https://dev.to/pub404/how-to-merge-pdf-files-online-for-free-without-adobe-acrobat-2ba5</link>
      <guid>https://dev.to/pub404/how-to-merge-pdf-files-online-for-free-without-adobe-acrobat-2ba5</guid>
      <description>&lt;h2&gt;
  
  
  If you're not technical: use the free online tool
&lt;/h2&gt;

&lt;p&gt;If you're not a technical person and you're looking for a free way to combine PDF files, use my &lt;a href="https://quickconvertonline.com/tools/merge-pdf" rel="noopener noreferrer"&gt;online PDF merger&lt;/a&gt;. Add your files, put them in the right order and download one combined PDF. No installation or account is needed.&lt;/p&gt;

&lt;p&gt;It is useful when an application accepts one attachment, or when a report and its appendices need to travel together.&lt;/p&gt;

&lt;p&gt;If you're technical and would rather merge PDFs in your own script, I'll show the basic JavaScript approach after the browser steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to combine PDF files into one
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Merge PDF and select your documents.&lt;/li&gt;
&lt;li&gt;Check the first-page preview, file name and page count on each file card.&lt;/li&gt;
&lt;li&gt;Use the up and down arrows to put the files in the right order.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Apply&lt;/strong&gt; to create the combined document.&lt;/li&gt;
&lt;li&gt;Download the merged PDF and check the transitions between files.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are assembling an application, the order could be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Cover letter
2. Resume
3. Portfolio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The order inside each source PDF stays the same. Moving the portfolio card moves the entire portfolio, not individual pages inside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're technical: how it works
&lt;/h2&gt;

&lt;p&gt;If you're technical, the core operation is copying pages into a new document. Here is a minimal JavaScript example using &lt;a href="https://pdf-lib.js.org/" rel="noopener noreferrer"&gt;pdf-lib&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Install the package in a Node.js project with &lt;code&gt;npm install pdf-lib&lt;/code&gt;, save this as &lt;code&gt;merge.mjs&lt;/code&gt;, then run &lt;code&gt;node merge.mjs&lt;/code&gt; with &lt;code&gt;first.pdf&lt;/code&gt; and &lt;code&gt;second.pdf&lt;/code&gt; beside it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdf-lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;writeFile&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:fs/promises&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;first.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;second.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copyPages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPageIndices&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;merged.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example covers basic unencrypted documents. It omits the browser tool's previews, limits and extra form-field handling. Do not assume a small page-copying example preserves every document-level feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does merging PDFs reduce quality?
&lt;/h3&gt;

&lt;p&gt;This tool copies PDF pages rather than taking screenshots of them.&lt;/p&gt;

&lt;p&gt;That matters for documents with small text, vector graphics or selectable paragraphs. Combining the files does not require turning those elements into page-sized pictures.&lt;/p&gt;

&lt;p&gt;You should still inspect the downloaded copy. Check the first and last page of each section, especially when the originals use different page sizes or orientations.&lt;/p&gt;

&lt;p&gt;Different page sizes can coexist in one PDF. A landscape slide will not automatically become an A4 portrait page just because you merged it with a letter.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if the pages need rearranging too?
&lt;/h3&gt;

&lt;p&gt;Merging and reordering solve different problems.&lt;/p&gt;

&lt;p&gt;Merge PDF sets the order of whole files. If a signature page belongs between two pages of another document, merge first and then use &lt;a href="https://quickconvertonline.com/tools/reorder-pdf" rel="noopener noreferrer"&gt;Reorder PDF pages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This keeps the initial merge straightforward while still letting you adjust the final sequence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limits and details worth checking
&lt;/h3&gt;

&lt;p&gt;The merger accepts up to 12 PDFs per job. Each file can be up to 50 MB and 500 pages, with a combined limit of 100 MB and 1,000 pages.&lt;/p&gt;

&lt;p&gt;Source bookmarks are not carried into the merged document. Interactive form fields are copied, with names prefixed per file so matching names from different sources do not collide.&lt;/p&gt;

&lt;p&gt;If you enter a password to open a protected source, the merged output is saved without that password. Use &lt;a href="https://quickconvertonline.com/tools/protect-pdf" rel="noopener noreferrer"&gt;Protect PDF&lt;/a&gt; if the combined copy needs encryption.&lt;/p&gt;

&lt;h3&gt;
  
  
  One attachment, in the right order
&lt;/h3&gt;

&lt;p&gt;The practical benefit is simple: the recipient gets one document with a sequence you chose, and you keep the original files separately.&lt;/p&gt;

&lt;p&gt;Before sending it, check the total page count and the boundaries between sections. Those two checks catch many of the mistakes that are easy to miss in a folder full of similarly named PDFs.&lt;/p&gt;

&lt;p&gt;What do you combine most often: application documents, invoices or reports?&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Compress a PDF Online for Free: Reduce File Size Without Guesswork</title>
      <dc:creator>Hovsep Arakelyan</dc:creator>
      <pubDate>Sun, 01 Nov 2026 18:12:02 +0000</pubDate>
      <link>https://dev.to/pub404/how-to-compress-a-pdf-online-for-free-reduce-file-size-without-guesswork-m4a</link>
      <guid>https://dev.to/pub404/how-to-compress-a-pdf-online-for-free-reduce-file-size-without-guesswork-m4a</guid>
      <description>&lt;h2&gt;
  
  
  If you're not technical: use the free online tool
&lt;/h2&gt;

&lt;p&gt;If you're not a technical person and you're looking for a free way to make a PDF smaller, use my &lt;a href="https://quickconvertonline.com/tools/compress-pdf" rel="noopener noreferrer"&gt;online PDF compressor&lt;/a&gt;. Choose your document, start with Lossless mode, compare the size and download the result. There is no software to install or account to create.&lt;/p&gt;

&lt;p&gt;If a scanned document is still too large for an email or upload form, try Smaller scans mode and check that the text remains readable.&lt;/p&gt;

&lt;p&gt;If you're technical, I'll also show the command-line approach and explain why different PDFs need different compression strategies.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to reduce PDF file size
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the compressor and choose your PDF.&lt;/li&gt;
&lt;li&gt;Start with &lt;strong&gt;Lossless (preserve text and forms)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Apply&lt;/strong&gt; and compare the result size with the original.&lt;/li&gt;
&lt;li&gt;If a scanned PDF is still too large, try &lt;strong&gt;Smaller scans (flatten pages)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Adjust resolution and quality, apply again, then download and inspect the result.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For scanned documents, 144 DPI and 70% quality are reasonable starting settings to test. They are not a promise that every document will fit your upload limit.&lt;/p&gt;

&lt;p&gt;Check the smallest text, stamps and fine lines before sending the compressed copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're technical: how it works
&lt;/h2&gt;

&lt;p&gt;If you're technical, you can try a structural rewrite locally with &lt;a href="https://qpdf.readthedocs.io/en/stable/cli.html" rel="noopener noreferrer"&gt;QPDF&lt;/a&gt;. With QPDF installed, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qpdf input.pdf &lt;span class="nt"&gt;--object-streams&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;generate &lt;span class="nt"&gt;--stream-data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;compress &lt;span class="nt"&gt;--recompress-flate&lt;/span&gt; &lt;span class="nt"&gt;--compression-level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9 output.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a new file using compressed object streams and recompressed Flate data. It does not downsample photos, so compare the output size with the original rather than assuming it will shrink.&lt;/p&gt;

&lt;p&gt;My browser tool uses a WebAssembly QPDF workflow for lossless compression. Its Smaller scans mode is a separate rendering pipeline: render each page, encode the result as JPG, and build a PDF from those images.&lt;/p&gt;

&lt;p&gt;Those are different operations with different tradeoffs. A structural rewrite can preserve selectable text and form fields; rendering pages to images cannot preserve that interactive structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lossless compression versus smaller scans
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;What changes&lt;/th&gt;
&lt;th&gt;Main tradeoff&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lossless&lt;/td&gt;
&lt;td&gt;The PDF's internal storage is rewritten more efficiently&lt;/td&gt;
&lt;td&gt;An already optimized file may barely shrink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smaller scans&lt;/td&gt;
&lt;td&gt;Each page becomes a JPG image inside a PDF&lt;/td&gt;
&lt;td&gt;Detail can soften, and selectable text and interactive elements are lost&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Lossless mode uses QPDF to rewrite the file structure and recompress data. It does not reduce image resolution, so the document's appearance stays the same.&lt;/p&gt;

&lt;p&gt;Smaller scans mode takes a different approach: render each page at your chosen resolution and image quality. This can help with photo-heavy PDFs, but it changes what the document contains.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why did my PDF barely get smaller?
&lt;/h3&gt;

&lt;p&gt;Compression is not a fixed percentage discount.&lt;/p&gt;

&lt;p&gt;If the source app already compressed the document well, there may be little left for a lossless rewrite to remove. A PDF full of compressed images can also remain large because lossless mode does not downsample them.&lt;/p&gt;

&lt;p&gt;If the proposed result is not smaller, the tool keeps the original and tells you. You can then decide whether the visual tradeoff of Smaller scans is acceptable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I compress a PDF below 1 MB?
&lt;/h3&gt;

&lt;p&gt;Sometimes, but no setting can guarantee that for every document while preserving readability.&lt;/p&gt;

&lt;p&gt;A two-page letter and a 100-page scan have different requirements. Lower DPI and quality gradually, then look at the downloaded file at a useful reading size.&lt;/p&gt;

&lt;p&gt;If only a few pages are needed, &lt;a href="https://quickconvertonline.com/tools/extract-pdf-pages" rel="noopener noreferrer"&gt;extracting those pages&lt;/a&gt; may solve the problem without degrading the whole document.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the version you can still work with
&lt;/h3&gt;

&lt;p&gt;Compression runs in the browser, so the PDF is not uploaded for processing. Keep your original, especially when flattening pages: the smaller copy will not retain the original's editable or interactive structure.&lt;/p&gt;

&lt;p&gt;My rule is simple: start with lossless, measure the result, and sacrifice detail only when the file-size requirement actually calls for it.&lt;/p&gt;

&lt;p&gt;Which is usually the bigger problem for you: upload limits or unreadable scans?&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Edit PDF Text Online for Free Without Adobe Acrobat</title>
      <dc:creator>Hovsep Arakelyan</dc:creator>
      <pubDate>Sun, 01 Nov 2026 18:09:34 +0000</pubDate>
      <link>https://dev.to/pub404/how-to-edit-pdf-text-online-for-free-without-adobe-acrobat-54mi</link>
      <guid>https://dev.to/pub404/how-to-edit-pdf-text-online-for-free-without-adobe-acrobat-54mi</guid>
      <description>&lt;h2&gt;
  
  
  If you're not technical: use the free online tool
&lt;/h2&gt;

&lt;p&gt;If you're not a technical person and you're looking for a free way to edit a PDF, use my &lt;a href="https://quickconvertonline.com/tools/edit-pdf" rel="noopener noreferrer"&gt;online PDF text editor&lt;/a&gt;. Open your file, select the line you want to change, type the replacement and save the result. You do not need to install software or create an account.&lt;/p&gt;

&lt;p&gt;It is built for small corrections to existing text, such as a name, date or typo. Scanned pages need a different workflow because they contain pictures of text.&lt;/p&gt;

&lt;p&gt;If you're technical and want to understand how existing PDF text can be changed, I'll explain the implementation after the steps below.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to edit text in a PDF
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the PDF editor and choose your PDF, or drop it onto the page.&lt;/li&gt;
&lt;li&gt;Navigate to the page you want to change.&lt;/li&gt;
&lt;li&gt;Select a line of text and type the replacement.&lt;/li&gt;
&lt;li&gt;Press Enter and inspect the updated page.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Save PDF&lt;/strong&gt; to download your edited copy.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, you could change &lt;code&gt;Delivery date: 12 November&lt;/code&gt; to &lt;code&gt;Delivery date: 14 November&lt;/code&gt; without rebuilding the whole document.&lt;/p&gt;

&lt;p&gt;The editor accepts a PDF up to 50 MB. Your original file stays available, so keep it until you have checked the downloaded result.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're technical: how it works
&lt;/h2&gt;

&lt;p&gt;If you're technical, the interesting part is replacing the original text instead of drawing another text box on top of it.&lt;/p&gt;

&lt;p&gt;In my implementation, the preview layer identifies text lines and their page coordinates. A separate editing layer reads the page's content streams, tracks text operators and font resources, and rewrites the instructions associated with the selected line.&lt;/p&gt;

&lt;p&gt;The simplified implementation flow looks like this; it is an architectural outline, not runnable code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read text lines and their coordinates
Find the matching text instructions in the page content
Encode replacement characters using an available font
Rewrite the matching instructions
Save, render again, and check the edited result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Searching the raw PDF bytes for a word is not enough. Streams may be compressed, and font character codes do not necessarily match ordinary Unicode text. My editor also checks for missing lines after a rewrite so changing one line does not silently remove neighboring text.&lt;/p&gt;

&lt;p&gt;If you're building something similar, start with a narrow correction workflow and explicit failure messages. Supporting arbitrary PDF text is substantially harder than adding a new text overlay.&lt;/p&gt;

&lt;h3&gt;
  
  
  Changing existing text versus adding a text box
&lt;/h3&gt;

&lt;p&gt;These are two different jobs.&lt;/p&gt;

&lt;p&gt;If a line already says the wrong thing, you want to replace that line. This editor rewrites the PDF's text instructions rather than placing a white rectangle over the old wording.&lt;/p&gt;

&lt;p&gt;If you need to type a new note into an empty area, use &lt;a href="https://quickconvertonline.com/tools/add-text-to-pdf" rel="noopener noreferrer"&gt;Add text to PDF&lt;/a&gt; instead.&lt;/p&gt;

&lt;p&gt;Choosing the right operation saves time. Adding a text box on top of an incorrect line can make the page look fixed while leaving the underlying wording in place.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why a scanned PDF cannot be edited this way
&lt;/h3&gt;

&lt;p&gt;A PDF can contain actual text, pictures of text, or both.&lt;/p&gt;

&lt;p&gt;A scanned page is often just an image. There is no text line for this editor to replace. It reports when a page has no editable text; it does not include optical character recognition, or OCR.&lt;/p&gt;

&lt;p&gt;For a scan, you need an OCR workflow before you can work with recognized text. For a small correction to a PDF exported from a document or design app, direct text editing may be enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep replacements close to the original length
&lt;/h3&gt;

&lt;p&gt;PDF lines have fixed positions. They do not automatically reflow like paragraphs in a word processor.&lt;/p&gt;

&lt;p&gt;A short replacement usually fits more naturally than turning a five-word line into a long sentence. Check the right edge of the line and anything beside it.&lt;/p&gt;

&lt;p&gt;Fonts can also need attention. Some PDFs embed only the characters used in the original document. If your replacement needs a missing character, the editor may substitute a standard font and show a notice.&lt;/p&gt;

&lt;h3&gt;
  
  
  A small correction should stay a small job
&lt;/h3&gt;

&lt;p&gt;The file processing happens on your device. The website still loads its normal resources, but the PDF is not submitted to a conversion server.&lt;/p&gt;

&lt;p&gt;For a full rewrite, return to the source document or convert to an editable format. For a typo, date or name, direct editing gives you a much shorter route.&lt;/p&gt;

&lt;p&gt;What is the smallest PDF correction that has ever taken you far too long?&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Free QR Codes for Businesses: No Subscription, No Expiration</title>
      <dc:creator>Hovsep Arakelyan</dc:creator>
      <pubDate>Sat, 31 Oct 2026 18:05:08 +0000</pubDate>
      <link>https://dev.to/pub404/my-free-qr-code-stopped-working-so-i-built-my-own-5fn2</link>
      <guid>https://dev.to/pub404/my-free-qr-code-stopped-working-so-i-built-my-own-5fn2</guid>
      <description>&lt;p&gt;If you're not a technical person and simply want to create a QR code for your restaurant menu, business website, shop, business card, or anything else, you don't need to read all the technical details below.&lt;/p&gt;

&lt;p&gt;You can use my free tools:&lt;br&gt;
&lt;a href="https://quickconvertonline.com/tools/qr-code-generator" rel="noopener noreferrer"&gt;Free Online QR Code Generator&lt;/a&gt; – Create and customize QR codes directly in your browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://quickconvertonline.com/tools/bulk-qr" rel="noopener noreferrer"&gt;Bulk QR Code Generator&lt;/a&gt; – Generate multiple QR codes for your business.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.free.qr" rel="noopener noreferrer"&gt;Android QR Code Generator&lt;/a&gt; – Create QR codes directly from your phone.&lt;/p&gt;

&lt;p&gt;No programming knowledge required.&lt;/p&gt;

&lt;p&gt;If you're a developer or just curious about how QR codes actually work, keep reading. There's an interesting technical detail about static and dynamic QR codes that could save you or your business from unexpected subscription fees.&lt;/p&gt;

&lt;p&gt;A while ago I needed a simple QR code that opened a website. I found a free generator on Google, pasted my URL, downloaded the image and started using it.&lt;/p&gt;

&lt;p&gt;A few days later, the code stopped working.&lt;/p&gt;

&lt;p&gt;That made no sense to me at first. A QR code is just a picture of some data. How can a picture stop working?&lt;/p&gt;
&lt;h2&gt;
  
  
  The code never contained my URL
&lt;/h2&gt;

&lt;p&gt;When I checked, I found the code didn't point to my website at all. It pointed to the generator's own short URL, which redirected people to my site.&lt;/p&gt;

&lt;p&gt;So the service controlled the redirect, and it could turn that redirect off. Then came the catch: &lt;strong&gt;they wanted me to pay to keep it working.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Static vs dynamic QR codes
&lt;/h2&gt;

&lt;p&gt;This is the difference that caught me out:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Static QR code&lt;/th&gt;
&lt;th&gt;Dynamic QR code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What the pattern stores&lt;/td&gt;
&lt;td&gt;Your actual content&lt;/td&gt;
&lt;td&gt;A short link to someone's server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Depends on a third party&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can be changed after printing&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can track scans&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stops if the service stops&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dynamic codes are useful when you really need scan stats or want to change the destination after printing. But if all you want is a code that opens a URL, there's no reason for a server to sit in the middle.&lt;/p&gt;
&lt;h2&gt;
  
  
  A static code takes a few lines
&lt;/h2&gt;

&lt;p&gt;As a software engineer, I found it hard to justify paying a subscription for this. Generating a static code is a small job. Here's a working example with the &lt;a href="https://www.npmjs.com/package/qrcode-generator" rel="noopener noreferrer"&gt;&lt;code&gt;qrcode-generator&lt;/code&gt;&lt;/a&gt; npm package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;qrcode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;qrcode-generator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 0 picks the smallest version that fits; 'M' is the error correction level&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;qr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;qrcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;qr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;qr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;qr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createSvgTag&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;cellSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;scalable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The URL is written straight into the pattern. No server, no redirect, and nothing that can be switched off later. The link only stops working if the website itself goes away.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;First I made an &lt;a href="https://play.google.com/store/apps/details?id=com.free.qr&amp;amp;hl=en" rel="noopener noreferrer"&gt;Android QR code generator&lt;/a&gt;, so people could generate and customize codes without unexpected payments.&lt;/p&gt;

&lt;p&gt;Then I thought: why should anyone install an app just to make a QR code? So I built a web version too, as a &lt;a href="https://quickconvertonline.com/tools/qr-code-generator" rel="noopener noreferrer"&gt;free QR code generator&lt;/a&gt; and a &lt;a href="https://quickconvertonline.com/tools/bulk-qr" rel="noopener noreferrer"&gt;bulk QR generator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The rule for both is simple: &lt;strong&gt;your QR code should point directly to your URL, without depending on someone else's redirect service.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It grew from there
&lt;/h2&gt;

&lt;p&gt;Later I started adding tools for PDFs, images, video and audio, and that became &lt;a href="https://quickconvertonline.com/" rel="noopener noreferrer"&gt;QuickConvertOnline&lt;/a&gt;. I'm still improving it and adding features.&lt;/p&gt;

&lt;p&gt;The funny part is that all of this started because I just wanted one free QR code. 😄&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before you print one:&lt;/strong&gt; scan it and look at the URL it opens. If it goes through a domain you don't recognize, your code depends on that service staying online and staying free.&lt;/p&gt;

&lt;p&gt;Have you been caught out by a "free" tool like this? I'd like to hear about it in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
      <category>android</category>
    </item>
  </channel>
</rss>
