<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java PDF Blog</title>
	<atom:link href="https://blog.idrsolutions.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.idrsolutions.com/</link>
	<description>PDF tips and JPedal highlights</description>
	<lastBuildDate>Thu, 23 Apr 2026 11:29:07 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.idrsolutions.com/app/uploads/2018/12/idr-logo-150x150.jpg</url>
	<title>Java PDF Blog</title>
	<link>https://blog.idrsolutions.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Working with PDF Files in Java: A Complete Guide to Solving Common Tasks</title>
		<link>https://blog.idrsolutions.com/working-with-pdf-files-in-java/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Thu, 23 Apr 2026 11:29:07 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[edit]]></category>
		<category><![CDATA[extract]]></category>
		<category><![CDATA[jpedal]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[manipulate]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[rasterize]]></category>
		<category><![CDATA[render]]></category>
		<category><![CDATA[sdk]]></category>
		<category><![CDATA[toolkit]]></category>
		<category><![CDATA[view]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38792</guid>

					<description><![CDATA[<p>Portable Document Format (PDF) files are the standard for sharing and preserving documents across the internet and other platforms, but working with them programmatically in Java is not straightforward. Java does not natively support the PDF file format, so to interact with them you will need to either build your own custom parsing engine, or [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/working-with-pdf-files-in-java/">Working with PDF Files in Java: A Complete Guide to Solving Common Tasks</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Portable Document Format (PDF) files are the standard for sharing and preserving documents across the internet and other platforms, but working with them programmatically in Java is not straightforward. Java does not natively support the PDF file format, so to interact with them you will need to either build your own custom parsing engine, or use an off-the-shelf library.</p>
<p>Building your own PDF library can take years if not decades due to the sheer complexity of the format and the fact that there are many non-conforming and badly produced files that exist. The good news is that with an off-the-shelf solution you do not have to face any of these challenges, and you can build a proof of concept for your application in a matter of days. We have been building and maintaining the PDF library JPedal, which allows you to get started immediately and solve the problems that actually matter.</p>
<p>This guide provides an overview of common problems that developers face when working with PDFs and how to solve them using the JPedal PDF library.</p>
<h2>What is JPedal?</h2>
<p><a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal</a> is a pure Java PDF Library that makes it easy for Java developers to work with PDF Documents. JPedal is developed and maintained by a team with over 20 years of experience with Java and the <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">PDF file format</a>. It has a comprehensive feature set which includes viewing, rendering, printing, processing, manipulating, extracting content, interaction, and debugging.</p>
<h2>Viewer</h2>
<p>Rendering PDFs within an application requires a viewer capable of displaying pages accurately while supporting navigation, zooming, and other interactions. Developers typically embed PDF viewers into desktop applications.</p>
<p>Common challenges include ensuring high fidelity rendering, and handling large documents with ease. The following tutorials demonstrate how to implement and customize PDF viewing functionality in Java applications.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-view-pdf-files-in-java/">How to view PDF files</a></li>
</ul>
<h2>Render and rasterize</h2>
<p>Rendering and rasterization involves converting PDFs into images. This process is commonly used for generating thumbnails or previews.</p>
<p>Developers often use these workflows in content management systems and document pipelines. Key considerations include image quality, resolution (DPI), performance, and memory usage. The following tutorials show how to convert PDF pages into different image formats.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-convert-a-pdf-to-image-in-java/">How to convert a PDF file to an image</a></li>
<li><a href="https://blog.idrsolutions.com/generate-pdf-thumbnails-in-java-tutorial/">How to generate thumbnails of a PDF</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-rasterize-pdf-files/">How to rasterize PDF files</a></li>
</ul>
<h2>Print</h2>
<p>Printing PDF documents from Java applications involves using the Java Print Service.</p>
<p>Typical use cases include newspaper creation, batch printing workflows, and  document distribution. The following tutorial shows how to configure and execute PDF printing from Java.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-print-pdf-files-from-java/">How to print a PDF file</a></li>
</ul>
<h2>Process</h2>
<p>PDF processing refers to automated operations applied to documents, often in bulk. These tasks include merging, splitting, sanitizing, digital signing, and transforming files as part of larger workflows.</p>
<p>Developers encounter these requirements in document pipelines and backend services. Challenges include maintaining document integrity, handling broken files, and ensuring performance at scale. The tutorials below cover common processing operations and how to implement them.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-sign-pdf-files-in-java-tutorial/">How to sign PDF files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-extract-embedded-files-from-a-pdf-in-java-tutorial/">How to extract embedded files from a PDF in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-attach-files-to-a-pdf-in-java-tutorial/">How to attach files to a PDF in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/pdf-merge-in-java-tutorial/">PDF Merge in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-remove-unused-objects-from-a-pdf-file/">How to remove unused objects from PDF file (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-sanitize-pdf-files-removing-hidden-risks/">How to sanitize PDF files: Removing Hidden Risks</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-translate-pdf-files-in-java-tutorial/">How to translate PDF files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-split-pdf-files-in-java/">How to split a PDF file in Java</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-remove-blank-pages-from-a-pdf-in-java-tutorial/">How to remove blank pages from a PDF</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-flatten-pdf-layers-in-java">How to flatten PDF layers</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-crop-a-pdf-file-in-java-tutorial/">How to crop a PDF file in Java</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-remove-text-from-a-pdf-in-java-using-jpedal-tutorial/">How to remove text from a PDF file in Java</a></li>
</ul>
<h2>Manipulate</h2>
<p>PDF manipulation involves modifying the structure or content of a PDF document. This includes adding or removing elements, rearranging pages, and updating existing content.</p>
<p>These operations are common in document editing tools and workflow automation systems. The tutorials below demonstrate how to perform common modification tasks.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-add-images-to-pdf-files-in-java-tutorial/">How to Add Images to PDF files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-draw-shapes-in-pdf-files-in-java-tutorial/">How to draw shapes in PDF files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-copy-bookmarks-from-one-pdf-to-another/">How to copy bookmarks from one PDF to another</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-remove-a-page-from-a-pdf-file-in-java/">How to remove a page from a PDF file in Java</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-duplicate-pages-in-a-pdf-in-java-tutorial/">How to Duplicate Pages in a PDF in Java</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-n-up-pages-in-pdf-files-in-java-tutorial/">How to N-up Pages in PDF Files in Java</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-manipulate-pdf-documents-in-java-tutorial/">How to manipulate PDF documents in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-reorder-pages-in-a-pdf-in-java-tutorial/">How to reorder pages in a PDF</a></li>
</ul>
<h2>Extract content</h2>
<p>PDF content extraction focuses on retrieving structured or unstructured data from PDF documents, including text, images, metadata, and marked content.</p>
<p>This is a common requirement in data processing pipelines, document analysis, and format conversion (i.e, PDF to Markdown). Developers often need to handle inconsistent layouts and text encoding issues. The tutorials below show how to extract and transform PDF content into common interchange formats.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-extract-images-from-pdf-in-java/">How to extract images from a PDF file</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-extract-clipped-images-from-pdf-file-in-java/">How to extract clipped Images from a PDF file</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-extract-text-from-pdf-files-in-java/">How to extract text from PDF files</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-convert-pdf-files-to-epub/">How to convert PDF files to ePUB</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-extract-structured-text-from-pdf-files/">How to extract structured text from PDF files</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-extract-text-from-a-pdf-as-markdown/">How to extract text from a PDF as Markdown</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-extract-text-from-a-pdf-as-json/">How to extract text from a PDF as JSON</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-extract-text-from-pdf-files-as-yaml-tutorial/">How to extract text from PDF files as YAML (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-pdf-metadata-in-java/">How to read PDF metadata</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-search-a-pdf-file-in-java/">How to search a PDF file</a></li>
</ul>
<h2>Interaction</h2>
<p>PDF interaction includes working with annotations, form fields, and navigational elements such as bookmarks. These features enable user input and dynamic document behaviour.</p>
<p>Developers implement these capabilities in applications that require user feedback such as form processing or document reviewing. The following tutorials explain how to create, modify, and extract interactive elements from PDFs.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-create-or-edit-pdf-annotations">How to create or edit Annotations in a PDF file</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-extract-data-from-pdf-forms-in-java/">How to extract PDF file form data</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-add-bookmarks-to-pdf-files-in-java-tutorial/">How to add bookmarks to PDF files in Java</a></li>
</ul>
<h2>Debug</h2>
<p>Debugging PDF files involves inspecting their internal structure, content streams, and rendering behavior to identify issues. This is useful for when dealing with broken files or unexpected behaviour.</p>
<p>Typical scenarios include troubleshooting rendering errors using single step debugging, validating COS syntax, and inspecting the internal structure of a file. The tutorials below provide useful ways to inspect and diagnose PDFs that do not render correctly.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/pdf-inspector-now-available-on-jpedal/">JPedal PDF Inspector/Debugger</a></li>
<li><a href="https://blog.idrsolutions.com/improvements-to-our-pdf-inspector/">JPedal PDF Inspector/Debugger pt. 2</a></li>
<li><a href="https://blog.idrsolutions.com/debug-pdf-files/">How to debug PDF files</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-find-pdf-page-size-in-java/">How to find PDF page size</a></li>
</ul>
<h2>Download JPedal</h2>
<p>Download a <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">JPedal trial jar</a> to see how it works.</p>
<p>The post <a href="https://blog.idrsolutions.com/working-with-pdf-files-in-java/">Working with PDF Files in Java: A Complete Guide to Solving Common Tasks</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PDF vs HTML5 for Web Publishing: Which Is Better?</title>
		<link>https://blog.idrsolutions.com/pdf-vs-html5-for-web-publishing-which-is-better/</link>
		
		<dc:creator><![CDATA[chika]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 14:39:27 +0000</pubDate>
				<category><![CDATA[BuildVu]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38796</guid>

					<description><![CDATA[<p>TL;DR PDFs are not ideal for digital publishing platforms They are slow to load and render in web applications They do not work well on mobile devices They are difficult to scale as content libraries grow HTML5 is a better alternative for faster, scalable and responsive web content Fix PDF performance and scalability issues by [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/pdf-vs-html5-for-web-publishing-which-is-better/">PDF vs HTML5 for Web Publishing: Which Is Better?</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/chika/">chika</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>TL;DR</h2>
<ul>
<li><strong>PDFs are not ideal for digital publishing platforms</strong></li>
<li>They are slow to load and render in web applications</li>
<li>They do not work well on mobile devices</li>
<li>They are difficult to scale as content libraries grow</li>
<li><strong>HTML5 is a better alternative</strong> for faster, scalable and responsive web content</li>
<li><a href="https://www.idrsolutions.com/buildvu/your-trial?mtm_campaign=PublishingICP" target="_blank" rel="noopener">Fix PDF performance and scalability issues</a> by converting PDFs into <strong>fast, web-native HTML5 content</strong> for your publishing platform.</li>
</ul>
<p>If you’re running a digital publishing platform, PDFs can start to cause performance issues as your platform scales.</p>
<p>They work well for distribution but in the browser, they create <strong>performance, UX and scalability issues</strong>, especially as your content library grows.</p>
<h2>What Is PDF vs HTML5 in Web Publishing?</h2>
<p>PDF is a fixed-format document designed for print and distribution. HTML5 is a web-native format that allows content to be responsive, interactive and optimised for browser delivery.</p>
<h2>PDF vs HTML5 for Web Publishing: Key Differences</h2>
<table>
<thead>
<tr>
<th>Feature</th>
<th>PDF</th>
<th>HTML5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Performance</td>
<td>Slow to load and render in browsers</td>
<td>Fast, optimised for web delivery</td>
</tr>
<tr>
<td>Responsiveness</td>
<td>Fixed layout, poor on mobile</td>
<td>Fully responsive across devices</td>
</tr>
<tr>
<td>Control</td>
<td>Limited UI and interaction control</td>
<td>Full control over UX and features</td>
</tr>
<tr>
<td>Scalability</td>
<td>Hard to manage at large scale</td>
<td>Scales efficiently with content growth</td>
</tr>
</tbody>
</table>
<h2>How Publishing Platforms Typically Use PDFs in Web Applications</h2>
<p>Most teams either:</p>
<ul>
<li>Embed PDFs using browser viewers or iframes</li>
<li>Or build custom PDF rendering workflows in their web app</li>
</ul>
<p>Both approaches seem quick and cost-effective upfront.</p>
<h2>Problems with Using PDFs in Web Publishing Platforms</h2>
<p>But over time, problems appear:</p>
<h3>Why PDFs Are Slow to Load in Web Applications</h3>
<p>PDFs are <strong>slow to load and render</strong> in web applications, especially as file sizes increase. This impacts performance and user experience.</p>
<h3>Why PDFs Don’t Work Well on Mobile Devices</h3>
<p>PDFs do not adapt well to different screen sizes, leading to a <strong>poor mobile experience</strong> and difficult navigation.</p>
<h3>Limitations of PDF Viewers in Web Applications</h3>
<p>You have <strong>limited control over UI and interactions</strong>, making it harder to customise the experience or integrate features like analytics and search.</p>
<h3>Why PDFs Don’t Scale for Large Content Libraries</h3>
<p>As document volumes and users grow, <strong>performance and consistency become harder to manage</strong>, especially across different devices.</p>
<p>This is because PDFs were designed for print, not <strong>web-native delivery</strong>.</p>
<h2>Why HTML5 Is Better Than PDF for Digital Publishing</h2>
<p>Converting PDFs into HTML5 or SVG allows content to behave like part of your application.</p>
<p>This is why many teams are moving from <strong>PDF to HTML5 for digital publishing platforms</strong>.</p>
<ul>
<li>Faster load times</li>
<li>Fully responsive layouts</li>
<li>Greater control over UX and features</li>
<li>Easier integration into your publishing platform</li>
</ul>
<p>For development teams, tools like <strong>BuildVu</strong> automate this conversion while preserving layout accuracy.</p>
<h2>How Digital Publishing Platforms Handle Large PDF Libraries</h2>
<p>Publishing platforms with large libraries, such as academic or magazine platforms, often move away from embedded PDFs to <strong>web-native formats</strong> to improve performance and user experience at scale.</p>
<h2>Should You Use PDF or HTML5 for Your Publishing Platform?</h2>
<p>If you’re building or scaling a publishing platform, the question isn’t just how you display PDFs but whether PDFs are the right format at all.</p>
<h2>
  <a href="https://www.idrsolutions.com/buildvu/your-trial?mtm_campaign=PublishingICP" target="_blank" rel="noopener"><br />
    Try BuildVu for Free<br />
  </a><br />
</h2>
<p>Convert PDFs into HTML5 and deliver <strong>faster, more scalable web content</strong>.</p>
<p>The post <a href="https://blog.idrsolutions.com/pdf-vs-html5-for-web-publishing-which-is-better/">PDF vs HTML5 for Web Publishing: Which Is Better?</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/chika/">chika</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PDF Form Automation: HTML vs PDF</title>
		<link>https://blog.idrsolutions.com/pdf-form-automation-html-vs-pdf/</link>
		
		<dc:creator><![CDATA[Daniel Warren]]></dc:creator>
		<pubDate>Mon, 20 Apr 2026 13:03:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[FormVu]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[PDF forms]]></category>
		<category><![CDATA[AcroForms]]></category>
		<category><![CDATA[data extraction]]></category>
		<category><![CDATA[digital transformation]]></category>
		<category><![CDATA[document workflow]]></category>
		<category><![CDATA[formvu]]></category>
		<category><![CDATA[HTML5 forms]]></category>
		<category><![CDATA[JSON submission]]></category>
		<category><![CDATA[PDF automation]]></category>
		<category><![CDATA[Web Forms]]></category>
		<category><![CDATA[XFA forms]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38790</guid>

					<description><![CDATA[<p>TLDR; PDF forms compromise automation with data loss, whereas HTML provides the reliable standard workflows need. FormVu bridges this gap by converting legacy PDF templates into modern, web-ready HTML5 forms. If your document automation workflow still depends on fillable PDFs, you are processing data with a format designed for print. That mismatch has a cost, [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/pdf-form-automation-html-vs-pdf/">PDF Form Automation: HTML vs PDF</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/daniel-warren/">Daniel Warren</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>TLDR;</h2>
<p>PDF forms compromise automation with data loss, whereas HTML provides the reliable standard workflows need. FormVu bridges this gap by converting legacy PDF templates into modern, web-ready HTML5 forms.</p>
<p>If your document automation workflow still depends on fillable PDFs, you are processing data with a format designed for print. That mismatch has a cost, in engineering hours, in error handling, and in the fragility of every integration downstream.</p>
<p>This post covers why PDF-based form collection breaks at scale and how FormVu bridges the gap when you inherit legacy PDF workflows you can&#8217;t immediately abandon.</p>
<h2>The Core Problem with PDF Forms in Automated Workflows</h2>
<p>PDF forms (<a href="https://blog.idrsolutions.com/what-are-acroforms/">AcroForms</a> and XFA forms) were designed to be filled in by a human and printed. When developers try to slot them into a modern document workflow automation pipeline, three things break consistently.</p>
<h3>Data extraction Not Reliable</h3>
<p>Two PDFs that look identical on screen can have completely different internal structures. A parser that works on one fails silently on another. This is not a bug in your parser, it is the nature of the format.</p>
<p>For example, Chrome&#8217;s PDF viewer used by roughly 65% of desktop users on any given form submission flattens AcroForm fields on print-to-PDF. Your automation pipeline receives a PDF with no extractable form data. You have received a picture of a form.</p>
<h3>XFA Forms Not Supported</h3>
<p><a href="https://blog.idrsolutions.com/what-are-xfa-forms/">XFA</a> (XML Forms Architecture) was Adobe&#8217;s attempt to add dynamic form logic to PDFs. It was never adopted outside Adobe&#8217;s own ecosystem, was deprecated in the PDF 2.0 specification, and is not supported by any browser-native PDF renderer. </p>
<p>If you are maintaining an XFA workflow, you are running code that depends on a format with no active specification development and a shrinking set of compatible runtimes.</p>
<h3>The Version Control Nightmare</h3>
<p>HTML forms are just code. When a developer adds a new field or changes a validation rule, it is tracked in Git, peer-reviewed and deployed seamlessly. PDF forms, on the other hand, are opaque binary files. Updating a PDF form workflow usually means more overhead on version control and CI/CD best practices.</p>
<h2>The HTML Form Approach: What Changes</h2>
<p>When you move data collection off PDFs and onto HTML forms, your automation pipeline simplifies considerably. Here is what a typical data flow looks like on each side.</p>
<p><strong>PDF Workflow</strong></p>
<p><em>User fills PDF > Uploads it > Backend receives binary file > PDF parser attempts field extraction > Data cleaned and validated > Record stored</em></p>
<p><strong>HTML Form Workflow</strong></p>
<p><em>User fills HTML form > Submits > Backend Receives JSON > Record stored</em></p>
<p>The validation runs in the browser before submission. The data arrives clean. There is no binary to parse.</p>
<p>The table below shows the main differences of PDF vs HTML form workflows:</p>
<table border="1">
<thead>
<tr>
<th>Dimension</th>
<th>PDF Form Workflow</th>
<th>HTML Form Workflow</th>
</tr>
</thead>
<tbody>
<tr>
<td>Submission format</td>
<td>Binary file requiring a parsing library (pypdf, iTextSharp) before data is usable</td>
<td>JSON or form-encoded POST body readable by any web framework directly</td>
</tr>
<tr>
<td>Data reliability</td>
<td>Fields silently empty if PDF was flattened (e.g. printed from Chrome)</td>
<td>Every field present and typed as defined in the schema</td>
</tr>
<tr>
<td>Conditional logic</td>
<td>AcroForm JavaScript with an inconsistent runtime across PDF viewers</td>
<td>Standard JavaScript with full, predictable browser runtime support</td>
</tr>
<tr>
<td>Versioning</td>
<td>Template changes require redistributing a new PDF file to all users</td>
<td>Template changes deploy server-side and take effect immediately</td>
</tr>
</tbody>
</table>
<h2>Where FormVu Fits In</h2>
<p>Switching to HTML forms is straightforward for new workflows. The problem is the workflows you inherit: internal tools built on existing PDF templates, government-mandated forms that must match an approved PDF layout or client-facing processes.</p>
<p><a href="https://www.idrsolutions.com/formvu/">FormVu</a> handles this transition case. It takes a PDF form definition and renders it as a responsive HTML form that submits the data, preserving the field layout and logic of the original PDF while giving you a standard web form submission on the backend.</p>
<p><a href="https://www.idrsolutions.com/formvu/">FormVu</a> offers the following advantages over PDF form workflows:</p>
<ul>
<li>No PDF parsing library required. Submitted data arrives as JSON (for AcroForms) regardless of how complex the original PDF template is.</li>
<li>Works with existing PDF templates. No need to rebuild forms from scratch or get a new template approved.</li>
<li>Webhook delivery on submission. Your backend receives structured data the same way it would from any HTML form POST.</li>
<li>Session-based rendering with prefill support. Pre-populate fields from your system of record before the user sees the form.</li>
<li>Handles the Chrome flattening problem. Because the user submits via HTML, the data is never at risk of being lost through a print-to-PDF step.</li>
</ul>
<p>Ready to stop fighting with PDF parsers? You can <a href="https://www.idrsolutions.com/formvu/your-trial">test FormVu</a> in your own automation workflows for free today to see how easily it converts your legacy templates into reliable, web-native data collectors.</p>
<p>The post <a href="https://blog.idrsolutions.com/pdf-form-automation-html-vs-pdf/">PDF Form Automation: HTML vs PDF</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/daniel-warren/">Daniel Warren</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Why choose a pure Java PDF library?</title>
		<link>https://blog.idrsolutions.com/why-choose-a-pure-java-pdf-library/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Thu, 16 Apr 2026 14:23:58 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[100 percent java]]></category>
		<category><![CDATA[pdf library]]></category>
		<category><![CDATA[PDF SDK]]></category>
		<category><![CDATA[pdf toolkit]]></category>
		<category><![CDATA[pure java]]></category>
		<category><![CDATA[why choose]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38819</guid>

					<description><![CDATA[<p>TL;DR Choosing a pure Java PDF library ensures seamless cross-platform deployment and enhanced security through JVM-managed memory. This strategy minimizes technical debt by simplifying distribution, debugging, and licensing for robust enterprise document processing. What are the benefits of a pure Java PDF library and why does it matter? PDF processing sits at the core of [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/why-choose-a-pure-java-pdf-library/">Why choose a pure Java PDF library?</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>TL;DR</h2>
<p>Choosing a pure Java PDF library ensures seamless cross-platform deployment and enhanced security through JVM-managed memory. This strategy minimizes technical debt by simplifying distribution, debugging, and licensing for robust enterprise document processing.</p>
<h2>What are the benefits of a pure Java PDF library and why does it matter?</h2>
<p>PDF processing sits at the core of many enterprise systems, and the Java PDF library you choose to build your system have significant implications.<br />
If you are building a new system then here is why you should choose a pure Java PDF library.</p>
<p>Whether you are selecting a PDF generation library in Java, for high-volume document creation, evaluating a Java PDF editor library for annotation workflows or integrating a Java PDF API into an existing microservice, the pure Java constraint narrows the field considerably, and for good reason.</p>
<h2>Write once, run anywhere</h2>
<p>Java&#8217;s slogan &#8220;write once, run anywhere&#8221; is particularly valuable in PDF processing. A pure Java library runs on any platform/operating system which removes the need for recompilation or platform-specific code. You can deploy the same code that you wrote on your Macbook to a Linux or Windows server. This effectively removes any concerns for environment specific bugs or cross platform issues.</p>
<h2>Simplified distribution and deployment</h2>
<p>With a pure Java solution, the burden of managing different native binaries compiled for different architectures does not exist. You no longer need to maintain multiple builds for x86 or ARM. This makes distribution much simpler, especially if you are shipping to end users. If deploying to the cloud then you only need to create a single container image.</p>
<h2>Improved security and stability</h2>
<p>Security is a critical concern in PDF processing. The PDF file format is very complex and has been a frequent target for vulnerabilities and exploits. This is especially common in native libraries written in low level code. (See <a href="https://en.wikipedia.org/wiki/FORCEDENTRY" target="_blank">this scary example</a>!). Running code entirely within the JVM introduces a strong safetly layer:</p>
<ul>
<li>Memory management is handled automatically by the garbage collection, reducing risks like buffer overflow exploits</li>
<li>There is no direct memory access which removes the risk of segmentation faults or other similar memory corruption errors</li>
<li>Java&#8217;s security model ensures that execution is isolated and controlled</li>
</ul>
<h2>Easier debugging and maintenance</h2>
<p>Java has a very mature ecosystem of development tools, including debuggers, profilers and refactoring utilities which are widely available and well integrated into modern IDEs. This has several benefits:</p>
<ul>
<li>Identify and resolve issues faster</li>
<li>Easier to maintain codebase</li>
<li>More efficient refactoring</li>
</ul>
<p>In contrast, debugging native code involves more complex tooling and can pose some platform specific challenges.</p>
<h2>Simpler licensing</h2>
<p>When a library has no external dependencies it makes the licensing very straightforward. This can reduce the legal complexity of procurement and lowers the risk of compliance issues.</p>
<h2>Conclusion</h2>
<p>In conclusion, choosing a pure Java PDF library can be a strategic decision. By leveraging Java&#8217;s portability, security and ecosystem, enterprises can create large systems with much less technical debt in the long term. In the intricate field of PDF processing, this reduced complexity pays dividends across the entire software lifecycle.</p>
<p>The table below outlines the differences between a pure Java PDF SDK versus one that was written using native code and Java:</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Pure Java Library</th>
<th>Java Library with native code/JNI</th>
</tr>
</thead>
<tbody>
<tr>
<td>Platform compatibility</td>
<td>Runs on any OS/platform without changes</td>
<td>May require platform-specific builds or recompilation</td>
</tr>
<tr>
<td>Distribution</td>
<td>Single build for all architectures</td>
<td>Multiple binaries needed for x86, ARM, etc.</td>
</tr>
<tr>
<td>Container deployment</td>
<td>Single container image</td>
<td>Multiple images per target architecture</td>
</tr>
<tr>
<td>Memory management</td>
<td>JVM garbage collection handles it automatically</td>
<td>Manual memory management; risk of buffer overflows</td>
</tr>
<tr>
<td>Memory safety</td>
<td>No direct memory access; no segfaults</td>
<td>Risk of segmentation faults and memory corruption</td>
</tr>
<tr>
<td>Security isolation</td>
<td>JVM security model isolates execution</td>
<td>Native code can bypass JVM security boundaries</td>
</tr>
<tr>
<td>Debugging tools</td>
<td>Full Java ecosystem (debuggers, profilers, IDEs)</td>
<td>Complex native tooling; platform-specific challenges</td>
</tr>
<tr>
<td>Maintenance</td>
<td>Easier refactoring and codebase upkeep</td>
<td>More complex, harder to maintain</td>
</tr>
<tr>
<td>Licensing</td>
<td>Straightforward; no external native dependencies</td>
<td>More complex; additional native lib licenses to manage</td>
</tr>
<tr>
<td>Technical debt</td>
<td>Lower long-term</td>
<td>Higher due to platform and compatibility concerns</td>
</tr>
</tbody>
</table>
<h2>Resources</h2>
<ul>
<li>Looking for a pure Java PDF library to handle processing your documents? Check out <a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal</a>.</li>
<li>Want to <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">learn more about the PDF file format</a>? We have been developing PDF software for over 20 years!</li>
</ul>
<p>The post <a href="https://blog.idrsolutions.com/why-choose-a-pure-java-pdf-library/">Why choose a pure Java PDF library?</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to remove text from a PDF in Java using JPedal (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-remove-text-from-a-pdf-in-java-using-jpedal-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Thu, 09 Apr 2026 09:31:57 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Content Sanitization]]></category>
		<category><![CDATA[Data Privacy]]></category>
		<category><![CDATA[GDPR Compliance]]></category>
		<category><![CDATA[jpedal]]></category>
		<category><![CDATA[pdf library]]></category>
		<category><![CDATA[PDF Redaction]]></category>
		<category><![CDATA[Secure Document Sharing]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Text Removal]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38703</guid>

					<description><![CDATA[<p>TL;DR True PDF redaction in Java requires two things: hiding the text visually and removing it from the content stream. This tutorial shows how to do both with JPedal in under 20 lines of code. Why remove text from a PDF file? Removing text from a PDF in Java is a common requirement when dealing [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-remove-text-from-a-pdf-in-java-using-jpedal-tutorial/">How to remove text from a PDF in Java using JPedal (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>TL;DR</h2>
<p>True PDF redaction in Java requires two things: hiding the text visually and removing it from the content stream. This tutorial shows how to do both with JPedal in under 20 lines of code.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-08-at-14.17.27-scaled.png"><img fetchpriority="high" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-08-at-14.17.27-300x191.png" alt="redacted text" width="300" height="191" class="aligncenter size-medium wp-image-38773" srcset="https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-08-at-14.17.27-300x191.png 300w, https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-08-at-14.17.27-1024x652.png 1024w, https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-08-at-14.17.27-768x489.png 768w, https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-08-at-14.17.27-1536x979.png 1536w, https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-08-at-14.17.27-2048x1305.png 2048w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h2>Why remove text from a PDF file?</h2>
<p>Removing text from a PDF in Java is a common requirement when dealing with sensitive information, names, email addresses, phone numbers, and other personally identifiable information. Whether you are meeting GDPR redaction obligations, preparing documents for external sharing, or sanitising files before archiving, this tutorial explains how to do it using the <a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal PDF library</a>.</p>
<h2>What redaction actually means</h2>
<p>Removing text from a PDF is a two-part problem. First, you find the text. Then you redact it, which itself has two layers:</p>
<ol>
<li>Hide the text visually, usually done by drawing an opaque box over it</li>
<li>Remove it from the underlying content stream so it cannot be extracted by a PDF reader or copy-paste</li>
</ol>
<p>Both steps are critical. Drawing a black box without editing the content stream is not true redaction. The text is still there, just invisible, and people will be able to copy and paste it. JPedal handles both steps, and together these are called <strong>redaction</strong>.</p>
<h2>Choosing a Java PDF library for text removal</h2>
<p>Most developers reach for Apache PDFBox first, but programmatically removing text from a PDF in Java, rather than just drawing over it, requires direct access to the content stream. JPedal exposes this through a clean API, handling both the search and the redaction in a few lines of code without manual stream manipulation.</p>
<h2>Find, delete and redact text from a PDF in Java using JPedal</h2>
<p>Open the PDF, scan each page for the target text, redact every match, then write out the modified document. The key methods are <code>findTextOnPage()</code> to locate matches and <code>redact()</code> to remove them. <code>pdf.apply()</code> commits the redaction operations to the document before writing.</p>
<ol>
<li><a href="https://www.idrsolutions.com/jpedal/#why-buy">Download</a> JPedal trial jar.</li>
<li>Create a File handle to the PDF file</li>
<li>Include a password if file password protected</li>
<li>Open the PDF file</li>
<li>Scan the pages for text</li>
<li>Redact each match</li>
<li>Write the output and close</li>
</ol>
<p><pre class='line-numbers' data-ad=JPedal><code class='language-java'>final File inputFile = new File(&quot;inputFile.pdf&quot;);<br />
final FindTextInRectangle extract = new FindTextInRectangle(inputFile);<br />
final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(inputFile);<br />
if (extract.openPDFFile()) {<br />
    final int pageCount = extract.getPageCount();<br />
    for (int page = 1; page &lt;= pageCount; page++) {<br />
        final float[] coords = extract.findTextOnPage(page, &quot;the&quot;, SearchType.MUTLI_LINE_RESULTS);<br />
        for (int val = 0; val &lt; coords.length; val = val + 5) {<br />
            pdf.redact(page, new float[] {coords[val], coords[val + 1], coords[val + 2], coords[val + 3]});<br />
        }<br />
    }<br />
}<br />
extract.closePDFfile();

<br />//apply changes and write out<br />
pdf.apply();<br />
final File outputFile = new File(&quot;redactedFile.pdf&quot;);<br />
pdf.writeDocument(outputFile);<br />
pdf.closeDocument();<br />
</code></pre><br />
<code>findTextOnPage()</code> returns a flat float array of coordinates for each match, x1, y1, x2, y2, plus a fifth value (magic number documented <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/search/find-text-in-a-pdf-file">here</a>) at index 4, which is why the loop increments by 5. The output is a new PDF with every instance of the search term permanently removed from both the visual layer and the content stream.<br />
&nbsp;<br />
The original file is not modified unless you overwrite it. Add try-catch blocks around the file operations and PDF calls for production use. For other PDF text manipulation tasks in Java, extracting, searching, or modifying content programmatically, see the <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/">JPedal tutorials</a>.<br />
&nbsp;<br />
You can expand your <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/">understanding of the PDF format</a> by reading our other articles. Similarly, if there is a specific term for PDF you would like to know more about, our <a href="https://blog.idrsolutions.com/glossary-of-pdf-terms/">PDF Glossary</a> has an extensive list of common terms.</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-remove-text-from-a-pdf-in-java-using-jpedal-tutorial/">How to remove text from a PDF in Java using JPedal (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to redact PDF text with the JPedal Viewer</title>
		<link>https://blog.idrsolutions.com/how-to-redact-pdf-text-with-the-jpedal-viewer/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Thu, 02 Apr 2026 13:05:09 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[clean]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[hide]]></category>
		<category><![CDATA[private]]></category>
		<category><![CDATA[redact]]></category>
		<category><![CDATA[redaction]]></category>
		<category><![CDATA[remove]]></category>
		<category><![CDATA[sanitize]]></category>
		<category><![CDATA[secret]]></category>
		<category><![CDATA[sensitive]]></category>
		<category><![CDATA[Text]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38708</guid>

					<description><![CDATA[<p>TL;DR The JPedal PDF Viewer can be used to redact text in PDF documents. Select &#8216;Redact&#8217; from the tools menu and draw a rectangle over the desired text. What is redaction and why should you use it? Redaction is the process of removing sensitive information from a document so that it is suitable for publishing. [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-redact-pdf-text-with-the-jpedal-viewer/">How to redact PDF text with the JPedal Viewer</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>TL;DR</h2>
<p>The <a href="https://www.idrsolutions.com/jpedal/java-pdf-viewer" target="_blank">JPedal PDF Viewer</a> can be used to redact text in PDF documents. Select &#8216;Redact&#8217; from the tools menu and draw a rectangle over the desired text.</p>
<h2>What is redaction and why should you use it?</h2>
<p>Redaction is the process of removing sensitive information from a document so that it is suitable for publishing. It is commonly used in legal or government processes when documents are made available to the public while keeping certain details hidden.</p>
<p>If you want to publish parts of a document and have certain secrets remain secrets, then redaction is the right tool to use.</p>
<h2>How Redaction in PDFs Works</h2>
<p>Redaction typically consists of a black rectangle which covers up the text you want hidden. Traditionally, this was done by drawing over text with a black marker and then scanning it back in.</p>
<p>In the age of digital media, the concept is the same, but care must be taken to ensure that the content is actually removed and cannot be recovered through some sneaky techniques.</p>
<h3>Pitfalls of Weak Digital Redaction Tools</h3>
<ul>
<li>One common mistake with low-quality redaction tools is drawing a black box over the text, but leaving the text remaining underneath. Other tools may then allow people to remove the boxes and see the text that was there, or you may just see that large characters like <code>j</code> may poke out of top or bottom of the black box.</li>
<li>Another mistake is replacing the text with empty characters of the same width. This is done to preserve the layout of subsequent characters, however it is possible to reserver engineer what text used to be there by looking at the widths of the blank characters and comparing them with the widths from the font. Ideally, any blank spacing should be accumulated so not to leak any information.</li>
<li>Finally, a common pitfall to be aware of is that sometimes you can simply figure out what used to be there based on context e.g. &#8220;Jane ■■■&#8221; appears in one place, but &#8220;Jane Doe&#8221; appears nearby.</li>
</ul>
<h2>How to redact text using the JPedal Viewer</h2>
<p>The <a href="https://www.idrsolutions.com/jpedal/java-pdf-viewer" target="_blank">JPedal Viewer</a> has a tools menu which contains various <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/viewer/manipulate-files-from-the-viewer" target="_blank">operations you can perform on the currently opened document</a>.</p>
<p>The tools menu is hidden by default, so you will need to enable it by going to edit -> preferences -> menu, and selecting tools.</p>
<p>Now that the tools menu is visible, you can open a PDF document in the JPedal Viewer, navigate to the desired page, and select redact from the tools menu.</p>
<p><img decoding="async" src="https://blog.idrsolutions.com/app/uploads/2026/03/Screenshot-2026-04-01-at-11.17.37.png" alt="redact text in the jpedal viewer" width="612" height="587" class="aligncenter size-full wp-image-38734" srcset="https://blog.idrsolutions.com/app/uploads/2026/03/Screenshot-2026-04-01-at-11.17.37.png 612w, https://blog.idrsolutions.com/app/uploads/2026/03/Screenshot-2026-04-01-at-11.17.37-300x288.png 300w" sizes="(max-width: 612px) 100vw, 612px" /></p>
<p>This will bring up a dialog box to confirm which page you want to draw over, press OK to confirm.</p>
<p>You can now drag a rectangle over the area you want to redact. Any text that intersects this rectangle will be removed and a black box will take its place.</p>
<p><img decoding="async" src="https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-01-at-11.39.49-scaled.png" alt="redacted pdf" width="2672" height="1458" class="aligncenter size-full wp-image-38739" srcset="https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-01-at-11.39.49-scaled.png 2672w, https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-01-at-11.39.49-300x164.png 300w, https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-01-at-11.39.49-1024x559.png 1024w, https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-01-at-11.39.49-768x419.png 768w, https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-01-at-11.39.49-1536x838.png 1536w, https://blog.idrsolutions.com/app/uploads/2026/04/Screenshot-2026-04-01-at-11.39.49-2048x1118.png 2048w" sizes="(max-width: 2672px) 100vw, 2672px" /></p>
<h2>Download JPedal</h2>
<p>You can download a copy of <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">the JPedal jar</a> from our website and get started using the <a href="https://www.idrsolutions.com/jpedal/java-pdf-viewer" target="_blank">JPedal Viewer as a PDF redaction tool</a>.</p>
<h2>Resources</h2>
<p><ui></p>
<li><a href="https://www.idrsolutions.com/docs/jpedal/tutorials/viewer/manipulate-files-from-the-viewer" target="_blank">How to manipulate PDF files from the JPedal Viewer.</a></li>
<li><a href="https://www.idrsolutions.com/docs/jpedal/tutorials/viewer/view-pdf-in-java" target="_blank">Learn more about Viewing PDF files in Java.</a></li>
<li><a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">We can help you better understand the PDF format as developers who have been working with the format for more than 2 decades!</a></li>
</ul>
<p>The post <a href="https://blog.idrsolutions.com/how-to-redact-pdf-text-with-the-jpedal-viewer/">How to redact PDF text with the JPedal Viewer</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to remove unused objects from PDF file (Tutorial)</title>
		<link>https://blog.idrsolutions.com/remove-unused-objects-from-pdf-file-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Mon, 23 Mar 2026 18:12:00 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Gemini said Guide]]></category>
		<category><![CDATA[java pdf library]]></category>
		<category><![CDATA[jpedal]]></category>
		<category><![CDATA[optimise]]></category>
		<category><![CDATA[optimize]]></category>
		<category><![CDATA[PDF file]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38690</guid>

					<description><![CDATA[<p>PDF files sometimes contain objects which are never used. This increases the file size and is wasteful. This tutorial shows you how to reduce the file size by removing unused objects from PDF in Java or using the command line. The PDF file format is not natively supported by Java, so to remove unused objects [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/remove-unused-objects-from-pdf-file-tutorial/">How to remove unused objects from PDF file (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>PDF files sometimes contain objects which are never used. This increases the file size and is wasteful. This tutorial shows you how to reduce the file size by removing unused objects from PDF in Java or using the command line.</p>
<p>The PDF file format is not natively supported by Java, so to remove unused objects from a PDF file you will need to download an external library. This tutorial uses <a href="https://www.idrsolutions.com/jpedal/">JPedal</a>. JPedal is the best Java PDF library for developers.</p>
<h2>How to remove unwanted objects from a PDF file programmatically</h2>
<ol>
<li>Add JPedal to your class or module path (download the <a href="https://www.idrsolutions.com/jpedal/#why-buy" target="_blank" rel="noopener">trial jar</a>)</li>
<li>Create a File handle pointing to the PDF file</li>
<li>Run the below code:<br />
<pre class='line-numbers' data-ad=JPedal><code class='language-java'>PdfOptimizer.optimizePDF(<br />
        new File(&quot;/path/to/input.pdf&quot;),<br />
        new File(&quot;/path/to/output.pdf&quot;),<br />
        PdfOptimizer.Optimization.REMOVEUNUSEDOBJECTS<br />
);<br />
</code></pre></li>
</ol>
<p>&nbsp;</p>
<h2>Using the command line</h2>
<ol>
<li>Download the JPedal <a href="https://www.idrsolutions.com/jpedal/#why-buy" target="_blank" rel="noopener">trial jar</a></li>
<li>Run the following command:<br />
<pre class='line-numbers' ><code class='language-bash'><pre>java -cp jpedal.jar org.jpedal.tools.PdfOptimizer --removeUnusedObjects inputFile outputFile</pre>

<br /></code></pre></li>
</ol>
<p>You can expand your <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank" rel="noopener">understanding of the PDF format</a> by reading our other articles. Similarly, if there is a specific term for PDF you would like to know more about, our <a href="https://blog.idrsolutions.com/glossary-of-pdf-terms/" target="_blank" rel="noopener">PDF Glossary</a> has an extensive list of common terms.</p>
<p>The post <a href="https://blog.idrsolutions.com/remove-unused-objects-from-pdf-file-tutorial/">How to remove unused objects from PDF file (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to extract text from a PDF as JSON</title>
		<link>https://blog.idrsolutions.com/extract-text-from-a-pdf-as-json/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Mon, 23 Mar 2026 18:07:51 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Text]]></category>
		<category><![CDATA[extract]]></category>
		<category><![CDATA[jpedal]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[marked]]></category>
		<category><![CDATA[marked content]]></category>
		<category><![CDATA[semantics]]></category>
		<category><![CDATA[structure]]></category>
		<category><![CDATA[structured content]]></category>
		<category><![CDATA[tagged]]></category>
		<category><![CDATA[tagged pdf]]></category>
		<category><![CDATA[wtpdf]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38688</guid>

					<description><![CDATA[<p>Some PDF files can be &#8220;tagged&#8221; which means they contain information about the structure of the file. This structure is embedded as metadata within the PDF and is made up of a hierarchy of tags that label elements such as headings, paragraphs, lists, tables, and images. This is very similar to HTML where text is [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/extract-text-from-a-pdf-as-json/">How to extract text from a PDF as JSON</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Some PDF files can be &#8220;tagged&#8221; which means they contain information about the structure of the file. This structure is embedded as metadata within the PDF and is made up of a hierarchy of tags that label elements such as headings, paragraphs, lists, tables, and images.</p>
<p>This is very similar to HTML where text is contained within elements that have meaning, such as <code>&lt;p&gt;</code> for paragraph, or <code>&lt;table&gt;</code> for table.</p>
<p>If a PDF file does contain structured content (also known as marked content), then it can be processed and converted into other formats.</p>
<h2>What is JSON?</h2>
<p>A JSON file (short for JavaScript Object Notation) is a lightweight, text-based format used for storing and exchanging structured data between systems.</p>
<p>It represents data as key-value pairs and arrays, making it easy for both machines and developers to read and write. JSON is commonly used in web applications to transmit data between server and a client, and is natively supported by most programming languages.</p>
<p>Despite its origin in JavaScript, JSON is language-independent and has become a universal data format across APIs and software systems.</p>
<h2>PDF vs JSON</h2>
<p>Both formats serve distinct purposes, PDF preserves the fixed visual layout of a document, making it ideal for sharing print-ready content like reports, contracts and official documents. It is widely used when consistent appearance and layout across devices are critical, and is one of the most universally supported document formats.</p>
<p>In contrast, JSON is designed for data exchange and storage, not presentation. JSON is commonly used in web development, APIs, and software applications to sent structured data like user profiles, settings, or real-time content between servers and clients.</p>
<p>JSON can be imported directly in text editors like VS studio without affecting the format, with PDFs that is not the case. JSON is also best suited to be crawled by AI technologies like LLMs due to its structural nature.</p>
<h2>Converting Structured PDF files to JSON</h2>
<p>Recently, we added <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/extract-text/extract-structured-content-from-structured-pdf-files" target="_blank">PDF to JSON support</a> to <a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal</a>. If your PDF file contains structured content (<a href="https://blog.idrsolutions.com/how-to-find-out-if-a-pdf-file-has-structured-content/" target="_blank">how do I know?</a>), then JPedal will be able to convert it to JSON using the following code snippet:</p>
<p><pre class='line-numbers' data-ad=JPedal><code class='language-java'>ExtractStructuredTextProperties properties = new ExtractStructuredTextProperties();<br />
properties.setFileOutputMode(OutputModes.JSON);

<br />ExtractStructuredText.<br />
        writeAllStructuredTextOutlinesToDir(&quot;inputFile.pdf&quot;, password, &quot;outputFolder&quot;, null, null);<br />
</code></pre><br />
&nbsp;<br />
<a href="https://blog.idrsolutions.com/what-is-tagged-pdf/" target="_blank">Learn more about tagged PDF files.</a><br />
<a href="https://www.idrsolutions.com/jpedal/" target="_blank">Learn more about JPedal, our powerful PDF toolkit.</a></p>
<p>&nbsp;</p>
<p>This guide demonstrated how to convert structured PDF files into JSON format using just a few lines of Java code. It also highlighted the key differences between PDF and JSON to help you determine which format best suits your needs.</p>
<p>For more in-depth <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/">insights into PDFs</a>, feel free to explore our other articles — we’ve been working with the format for over a decade!</p>
<p>The post <a href="https://blog.idrsolutions.com/extract-text-from-a-pdf-as-json/">How to extract text from a PDF as JSON</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to add a CMYK image to a PDF in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-add-a-cmyk-image-to-a-pdf-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Mon, 23 Mar 2026 15:40:18 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[add]]></category>
		<category><![CDATA[append]]></category>
		<category><![CDATA[byte]]></category>
		<category><![CDATA[bytes]]></category>
		<category><![CDATA[CMYK]]></category>
		<category><![CDATA[color space]]></category>
		<category><![CDATA[colour space]]></category>
		<category><![CDATA[content]]></category>
		<category><![CDATA[insert]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38671</guid>

					<description><![CDATA[<p>TL;DR Printers operate in CMYK colour space rather than RGB, so adding a CMYK image to a PDF will ensure printing accuracy. The JPedal Java PDF library supports this using the addImage() method. What are image colour spaces? A colour space is a way of representing pixels using a combination of different channels. Each channel [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-add-a-cmyk-image-to-a-pdf-in-java-tutorial/">How to add a CMYK image to a PDF in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>TL;DR</h2>
<p>Printers operate in CMYK colour space rather than RGB, so adding a CMYK image to a PDF will ensure printing accuracy. The <a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal Java PDF library</a> supports this using the <a href="https://javadoc.idrsolutions.com/org/jpedal/manipulator/PdfManipulator.html#addImage(int,byte%5B%5D,int,int,org.jpedal.manipulator.AddImage.ColorSpace,float%5B%5D)" target="_blank"><code>addImage()</code> method</a>.</p>
<h2>What are image colour spaces?</h2>
<p>A colour space is a way of representing pixels using a combination of different channels. Each channel represents a colour and an intensity. The most common colour space is RGB (red, green, blue) which is used on computer monitors and phone screens, but there are many other options like CMYK (cyan, magenta, yellow, key AKA black) which is used for printing, or YCbCr (luma, blue, red) which is commonly used in highly compressed image formats.</p>
<h2>Why would you insert a CMYK image into a PDF?</h2>
<p>Commercial printers use the CMYK colour space so if you add images into your PDF as CMYK then you will ensure a greater accuracy when printing the documents.</p>
<h2>Can PDF support CMYK images?</h2>
<p>Yes, PDF supports CMYK and is the industry standard for professional printing because of it. While web-based PDFs usually use RGB, the PDF format can natively store four-colour CMYK data, embed specific colour profiles (like Fogra or GRACoL), and handle &#8220;spot colours&#8221; (Pantone).</p>
<h2>How to set up JPedal</h2>
<p>To get started using the JPedal PDF library, <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download the JPedal trial jar</a> from our website, and <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/add-jpedal-as-a-maven-dependency" target="_blank">add it to your Java project</a>.</p>
<h2>How to add a CMYK image to a PDF in Java</h2>
<p>By using the code snippet below you can flatten the target PDF. Using JPedal’s <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">PDF Manipulator</a> class:</p>
<ol>
<li>Load the document</li>
<li>Call the <code>addImage()</code> method and choose the CMYK colour space.</li>
<li>Save the result</li>
</ol>
<p><pre class='line-numbers' data-ad=jpedal><code class='language-java'>final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));

<br />// The bytes should be in the same format as the colour space you are trying to add.<br />
final byte[] imgBytes = &#8230;;<br />
pdf.addImage(new PageRanges(&quot;1&quot;), imgBytes, 100, 100, AddImage,ColorSpace,CMYK, new float[] {0, 0, 100, 100});

<br />pdf.apply();<br />
pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.reset();<br />
pdf.closeDocument();<br />
</code></pre><br />
&nbsp;</p>
<h2>Download JPedal</h2>
<p>You can <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download a JPedal trial jar</a> to see how it works.</p>
<h2>Resources</h2>
<p>Learn more about <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">manipulating PDF files in Java</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-add-a-cmyk-image-to-a-pdf-in-java-tutorial/">How to add a CMYK image to a PDF in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Developer’s Guide to XFA Hell: Why Convert Forms to HTML</title>
		<link>https://blog.idrsolutions.com/the-developers-guide-to-xfa-hell-why-convert-forms-to-html/</link>
		
		<dc:creator><![CDATA[Daniel Warren]]></dc:creator>
		<pubDate>Mon, 23 Mar 2026 14:01:28 +0000</pubDate>
				<category><![CDATA[FormVu]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PDF forms]]></category>
		<category><![CDATA[XFA]]></category>
		<category><![CDATA[AcroForms]]></category>
		<category><![CDATA[Adobe XFA]]></category>
		<category><![CDATA[browser compatibility]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[digital transformation]]></category>
		<category><![CDATA[fillable PDF]]></category>
		<category><![CDATA[formvu]]></category>
		<category><![CDATA[HTML5 conversion]]></category>
		<category><![CDATA[HTML5 forms]]></category>
		<category><![CDATA[JSON extraction]]></category>
		<category><![CDATA[legacy software]]></category>
		<category><![CDATA[mobile PDF forms]]></category>
		<category><![CDATA[PDF 2.0]]></category>
		<category><![CDATA[PDF data extraction]]></category>
		<category><![CDATA[PDF Forms]]></category>
		<category><![CDATA[PDF to HTML5]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[XFA conversion]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38615</guid>

					<description><![CDATA[<p>If you’re reading this as a developer, there’s a good chance you’ve just lost a lot of time trying to get a standard PDF library to extract data from a government form, only to find that your library thinks the document is empty. Or maybe your client just called, furious that their customers can&#8217;t fill [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/the-developers-guide-to-xfa-hell-why-convert-forms-to-html/">The Developer’s Guide to XFA Hell: Why Convert Forms to HTML</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/daniel-warren/">Daniel Warren</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>If you’re reading this as a developer, there’s a good chance you’ve just lost a lot of time trying to get a standard PDF library to extract data from a government form, only to find that your library thinks the document is empty. Or maybe your client just called, furious that their customers can&#8217;t fill out your onboarding form on their iPhones.</p>
<p><strong>Welcome to XFA Hell. You aren&#8217;t alone!</strong></p>
<p>XFA (XML Forms Architecture) is a proprietary XML-based template format developed by JetForm for creating interactive and dynamic PDF forms. You can read more about XFA forms <a href="https://blog.idrsolutions.com/what-are-xfa-forms/">here</a>.</p>
<p>Across the internet, developers are struggling to create workarounds for XFA&#8217;s problem. Take this reddit post from weary developer<a href="https://www.reddit.com/r/pdf/comments/1q4si25/burned_through_thousands_of_ai_tokens_and_still/"> struggling with German government XFA forms titled</a>:</p>
<blockquote><p><strong>&#8220;Burned Through Thousands of AI Tokens and Still Can&#8217;t Beat This German Government PDF&#8221;</strong></p></blockquote>
<p>These aren&#8217;t just minor compatibility bugs. They are symptoms of a deprecated, proprietary and inherently non-web-friendly document architecture. With business implications, these forms become technical debt and are a pain for developers!</p>
<p>Users also have trouble displaying XFA forms on iOS and Android devices as stated in <a href="https://experienceleague.adobe.com/en/docs/experience-manager-65/content/forms/troubleshooting/xfa-pdf-forms-policy-protected-documents-not-displayed">this Adobe Experience Experience guide</a>. More often, people will see this dreaded error pop up on Acrobat:<br />
&nbsp;<br />
<a href="https://blog.idrsolutions.com/app/uploads/2026/03/Adobe-Acrobat-error-window-displays-the-following-.webp"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2026/03/Adobe-Acrobat-error-window-displays-the-following--300x101.webp" alt="Acrobat XFA form error" width="300" height="101" class="aligncenter size-medium wp-image-38625" srcset="https://blog.idrsolutions.com/app/uploads/2026/03/Adobe-Acrobat-error-window-displays-the-following--300x101.webp 300w, https://blog.idrsolutions.com/app/uploads/2026/03/Adobe-Acrobat-error-window-displays-the-following-.webp 490w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><br />
&nbsp;</p>
<p>In this post, we’ll look at why XFA is fundamentally broken for the modern web and why converting these forms to HTML with <a href="https://www.idrsolutions.com/formvu/">FormVu</a> isn&#8217;t just a workaround, it’s the definitive solution.</p>
<h2>Why XFA forms Fail Developers</h2>
<p>XFA was <a href="https://en.wikipedia.org/wiki/XFA">was added to the PDF 1.5 spec</a>, to handle dynamic, complex forms that traditional PDF (AcroForms) couldn&#8217;t. Think forms that add rows automatically, change entire sections based on user input or calculate complex formulas on the fly.</p>
<p>It accomplished this by embedding a complete XML-based form specification <em>inside</em> the PDF wrapper. While useful for its time, this architecture creates several critical, unsolvable problems for modern developers:</p>
<h3>Zero Mobile or Native Browser Support</h3>
<p>Modern web browsers (Chrome, Firefox, Safari) have built-in PDF viewers. Because XFA is proprietary and immensely complex, <a href="https://experienceleague.adobe.com/en/docs/experience-manager-65/content/forms/troubleshooting/xfa-based-forms-in-chrome-firefox-ie-internet-explorter-safari-edge">most popular browsers do not support it</a> by default. Trying to display on Mobile devices is even worse. </p>
<p>If your users try to open an XFA form, they’ll see a static one-page PDF with a message telling them to download Adobe Reader. In an era of mobile-first development, XFA forms are a dead end.</p>
<h3>Deprecated by the ISO Standard</h3>
<p>When PDF became an open standard (<a href="https://developer.adobe.com/document-services/docs/assets/5b15559b96303194340b99820d3a70fa/PDF_ISO_32000-2.pdf">ISO 32000</a>), XFA was included for compatibility. However, realizing its proprietary limitations, the ISO officially <a href="https://pdfa.org/pdf-2-0-the-worldwide-standard-for-electronic-documents-has-evolved/">deprecated XFA in the PDF 2.0 standard</a>.</p>
<p>If you are developing new workflows around XFA, you are investing in a technology that has already been declared dead by the custodians of the PDF format.</p>
<h2>The Solution: Convert XFA Forms to HTML5</h2>
<p>You don&#8217;t need another niche PDF library. You need to bridge the gap between 20-year-old proprietary tech and the modern web. The answer is HTML.</p>
<p>By converting your PDF forms to HTML, you will not only make your forms web-friendly and mobile-friendly, but have more granular control over the content.</p>
<h2>How FormVu Turns XFA into Native Web Experience</h2>
<p><a href="https://www.idrsolutions.com/formvu/">FormVu</a> is not a generic PDF to HTML converter. It is a specialised SDK designed by developers, specifically to handle the complexities of fillable PDF forms.</p>
<p>Here is how <a href="https://www.idrsolutions.com/formvu/">FormVu</a> solves the specific problems that are costing you development time:</p>
<ul>
<li>In addition to desktop, converted forms work seamlessly across all mobile devices. Using HTML, CSS and JavaScript, the forms can also be filled out offline.</li>
<li>FormVu provides powerful APIs across multiple languages (Java, command line, cloud-based). It fits into your existing workflow rather than forcing you to adopt an entire Adobe ecosystem (like AEM or LiveCycle).</li>
<li>FormVu offers self-hosted options, allowing you to convert and host the files on your own secure servers.</li>
</ul>
<h2>Stop Patching Legacy Tech: Ship Native HTML5 with FormVu</h2>
<p>If you are a developer, your job is to build efficient, scalable, and user-friendly systems. XFA is an obstacle to all three of those goals.</p>
<p>You can continue to struggle with standard PDF libraries to understand proprietary XML, or you can use <a href="https://www.idrsolutions.com/formvu/">FormVu</a> to convert them into HTML so you have greater control over your forms.</p>
<p>If you&#8217;re unsure, you can run test conversions using our <a href="https://www.idrsolutions.com/online-pdfform-to-html-converter">free online PDF form to HTML converter</a>, it uses the same tech as our API!</p>
<p><H2>FAQs</h2>
<details>
<summary>Q: How do I programmatically detect an XFA form?</summary>
<p>A: Check your PDF&#8217;s <code>/AcroForm</code> dictionary. If it contains an <code>/XFA</code> key pointing to a data stream, it’s an XFA form. Standard PDF forms only use the <code>/Fields</code> array.</p>
</details>
<details>
<summary>Q: What’s the difference between Static and Dynamic XFA?</summary>
<p>A: Static XFA forms have a fixed, unchanging layout. Dynamic XFA forms re-render on the fly, adding rows, hiding sections, and flowing across pages based on user input.</p>
</details>
<details>
<summary>Q: Does XFA use standard JavaScript?</summary>
<p>A: It supports standard JS, but heavily relies on FormCalc, Adobe’s proprietary scripting language. To migrate successfully, you need a tool that translates FormCalc logic into standard web JavaScript so your calculations don&#8217;t break.</p>
</details>
<details>
<summary>Q: Can I just &#8220;flatten&#8221; an XFA form to fix compatibility?</summary>
<p>A: Usually, no. Standard PDFs flatten easily, but attempting to programmatically flatten a dynamic XFA form often breaks the layout entirely or results in a blank page.</p>
</details>
<p>The post <a href="https://blog.idrsolutions.com/the-developers-guide-to-xfa-hell-why-convert-forms-to-html/">The Developer’s Guide to XFA Hell: Why Convert Forms to HTML</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/daniel-warren/">Daniel Warren</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to convert PDF files to ePUB</title>
		<link>https://blog.idrsolutions.com/convert-pdf-files-to-epub/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Mon, 23 Mar 2026 10:38:04 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Text]]></category>
		<category><![CDATA[epub]]></category>
		<category><![CDATA[extract]]></category>
		<category><![CDATA[jpedal]]></category>
		<category><![CDATA[marked]]></category>
		<category><![CDATA[marked content]]></category>
		<category><![CDATA[semantics]]></category>
		<category><![CDATA[structured content]]></category>
		<category><![CDATA[tagged pdf]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38669</guid>

					<description><![CDATA[<p>Not all PDFs are created equally. Some go beyond simple visual layouts and include internal tags that describe the document’s structure. These are known as structured or tagged PDFs. The Anatomy of a Tagged PDF Think of it like HTML—where a paragraph or table isn’t just visual, but defined by semantic tags like &#60;p&#62; or [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/convert-pdf-files-to-epub/">How to convert PDF files to ePUB</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Not all PDFs are created equally. Some go beyond simple visual layouts and include internal tags that describe the document’s structure. These are known as structured or tagged PDFs.</p>
<h2>The Anatomy of a Tagged PDF</h2>
<p>Think of it like HTML—where a paragraph or table isn’t just visual, but defined by semantic tags like <code>&lt;p&gt;</code> or <code>&lt;table&gt;</code>. In a similar way, a structured PDF includes markers that tell software what each part of the content represents.</p>
<p>If a PDF file does contain structured content (also known as marked content), then it can be processed and converted into other formats.</p>
<h2>What is an ePUB file?</h2>
<p>An EPUB file (short for Electronic Publication) is a widely-used eBook format designed for reflowable content, allowing text to adapt to different screen sizes. </p>
<p>It supports text, images, styles, multimedia, and interactivity, making it ideal for digital reading on devices like phones, tablets, and e-readers—though not natively supported by Kindle. EPUB is an open standard maintained by the W3C and is essentially a ZIP archive containing HTML, CSS, and metadata files.</p>
<h2>PDF vs ePUB</h2>
<p>Both formats have different use cases, where PDF preserves the fixed layout of the document, making it optimal for print-ready files like contracts, reports and official forms. PDFs are often used where consistent formatting is critical and is one the most widely supported file format.</p>
<p>On the other hand ePUB was made specifically for a better reading experience as it adapts to different screen sizes. It was primarily made for eReaders, though it does support multimedia as well in ePUB 3.</p>
<p>EPUB uses a reflowable layout that adapts to different screen sizes for flexible reading, while PDF uses a fixed layout that preserves the original design regardless of the device.</p>
<h2>Converting Structured PDF files to ePUB</h2>
<p>Recently, we added <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/extract-text/extract-structured-text-as-epub" target="_blank">PDF to ePUB support</a> to <a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal</a>. If your PDF file contains structured content (<a href="https://blog.idrsolutions.com/how-to-find-out-if-a-pdf-file-has-structured-content/" target="_blank">how do I know?</a>), then JPedal will be able to convert it to ePUB using the following code snippet:</p>
<pre class='line-numbers' data-ad=JPedal><code class='language-java'>final ExtractStructuredTextProperties properties = new ExtractStructuredTextProperties();<br />
properties.setFileOutputMode(OutputModes.EPUB);<br />
properties.setEpubTitle(&quot;My EPUB&quot;);

<br />ExtractStructuredText.<br />
        writeAllStructuredTextOutlinesToDir(&quot;inputFileOrFolder&quot;, password, &quot;outputFolder&quot;, null, null);<br />
</code></pre>
<p><a href="https://blog.idrsolutions.com/what-is-tagged-pdf/" target="_blank">Learn more about tagged PDF files.</a><br />
<a href="https://www.idrsolutions.com/jpedal/" target="_blank">Learn more about JPedal, our powerful PDF toolkit.</a></p>
<p>This guide helped you find the differences between PDF and ePUB, which one might be suited to your needs. It also showed how you can convert structured PDF files to ePUB using a few lines of Java code. </p>
<p>You can read our other articles to <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format">learn more about PDFs</a> as we have been working on the format for more than a decade!</p>
<p>The post <a href="https://blog.idrsolutions.com/convert-pdf-files-to-epub/">How to convert PDF files to ePUB</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to flatten PDF layers in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-flatten-pdf-layers-in-java</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Wed, 18 Mar 2026 16:21:08 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[combine layers]]></category>
		<category><![CDATA[flatten]]></category>
		<category><![CDATA[layers]]></category>
		<category><![CDATA[merge layers]]></category>
		<category><![CDATA[OC]]></category>
		<category><![CDATA[OCG]]></category>
		<category><![CDATA[OCMD]]></category>
		<category><![CDATA[optional content]]></category>
		<category><![CDATA[squash]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38648</guid>

					<description><![CDATA[<p>TL;DR Flattening PDF layers in Java is a way to lock a document&#8217;s appearance, ensure cross-device compatibility, and reduce file size by merging optional content into a single layer. Using the JPedal library, the process involves three main steps: Load: Initialize the PdfManipulator and load your PDF file. Flatten: Call the .flattenLayers() method to merge [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-flatten-pdf-layers-in-java">How to flatten PDF layers in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>TL;DR</h2>
<p>Flattening PDF layers in Java is a way to lock a document&#8217;s appearance, ensure cross-device compatibility, and reduce file size by merging optional content into a single layer.</p>
<p>Using the <a href="https://www.idrsolutions.com/jpedal/">JPedal</a> library, the process involves three main steps:</p>
<ol>
<li>Load: Initialize the <code>PdfManipulator</code> and load your PDF file.</li>
<li>Flatten: Call the <code>.flattenLayers()</code> method to merge the content.</li>
<li>Save: Use <code>.apply()</code> and <code>.writeDocument()</code> to export the final, simplified PDF.</li>
</ol>
<h2>What does it mean to flatten a PDF?</h2>
<p>Flattening a PDF merges all of its separate interactive layers, like signatures and annotations into a single, non-editable visual layer. This locks the content in place, preventing any further changes and ensuring the document looks exactly the same on every device or printer.</p>
<h2>Why would you flatten PDF layers?</h2>
<p>A common reason for wanting to flatten layers is that it will preserve the document&#8217;s appearance across devices. PDF files with complicated visibility rules may expose bugs in different software implementations, so flattening the optional content removes this risk. </p>
<p>Additionally, a draft version of a document may use layers to experiment with different appearances or content. The document would then be flattened into the final version so that these draft layers would be removed. This also has the benefit of reducing the file size.</p>
<h2>How to set up JPedal</h2>
<p>To get started using the JPedal PDF library, <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download the JPedal trial jar</a> from our website, and <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/add-jpedal-as-a-maven-dependency" target="_blank">add it to your Java project</a>.</p>
<h2>How to flatten layers in a PDF in Java</h2>
<p>By using the code snippet below you can flatten the target PDF. Using JPedal&#8217;s <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">PDF Manipulator</a> class:</p>
<ol>
<li>Load the document</li>
<li>Call the <code>flattenLayers()</code> method</li>
<li>Save the result</li>
</ol>
<p><pre class='line-numbers' data-ad=jpedal><code class='language-java'>final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));

<br />pdf.flattenLayers();

<br />pdf.apply();<br />
pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.reset();<br />
pdf.closeDocument();<br />
</code></pre><br />
&nbsp;</p>
<h2>Download JPedal</h2>
<p>You can download a <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">JPedal trial</a> jar to see how it works.</p>
<h2>Resources</h2>
<p>Learn more about <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">manipulating PDF files in Java</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<h2>FAQs</h2>
<details>
<summary>Q: Does flattening a PDF remove hidden layers?</summary>
<p>A: Yes. Any layers set to &#8220;hidden&#8221; or &#8220;invisible&#8221; are permanently discarded during the flattening process, while only the currently visible content is merged into the final background layer.</p>
</details>
<details>
<summary>Q: Can I undo the flattening process later?</summary>
<p>A: No. Once a PDF is flattened and saved, the layers are permanently merged into a single image-like layer. To make future changes, you must keep a backup of the original layered file.</p>
</details>
<details>
<summary>Q: Will flattening affect the text searchability of my PDF?</summary>
<p>A: Generally, no. Flattening specifically targets the structural layers and interactive elements (like annotations); the underlying text usually remains searchable unless it is within a hidden layer or you specifically choose to convert the entire page to an image.</p>
</details>
<p>The post <a href="https://blog.idrsolutions.com/how-to-flatten-pdf-layers-in-java">How to flatten PDF layers in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Java PDF to AVIF conversion (Tutorial)</title>
		<link>https://blog.idrsolutions.com/java-pdf-to-avif-conversion-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Wed, 11 Mar 2026 10:49:11 +0000</pubDate>
				<category><![CDATA[AVIF]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[aom]]></category>
		<category><![CDATA[av1]]></category>
		<category><![CDATA[conversion]]></category>
		<category><![CDATA[convert]]></category>
		<category><![CDATA[jpedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[rasterize]]></category>
		<category><![CDATA[render]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38608</guid>

					<description><![CDATA[<p>Why convert PDF files to AVIF images? A PDF is a vector image (so it is rendered when you display it at whatever size you specify). An AVIF is a modern image format that uses AV1 compresion. So to convert a PDF to a AVIF file we need to create a blank image and then [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/java-pdf-to-avif-conversion-tutorial/">Java PDF to AVIF conversion (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2026/03/Screenshot-2026-03-11-at-10.42.59.png" alt="pdf to avif" width="934" height="518" class="aligncenter wp-image-38610" srcset="https://blog.idrsolutions.com/app/uploads/2026/03/Screenshot-2026-03-11-at-10.42.59.png 934w, https://blog.idrsolutions.com/app/uploads/2026/03/Screenshot-2026-03-11-at-10.42.59-300x166.png 300w, https://blog.idrsolutions.com/app/uploads/2026/03/Screenshot-2026-03-11-at-10.42.59-768x426.png 768w" sizes="auto, (max-width: 934px) 100vw, 934px" /></p>
<h2>Why convert PDF files to AVIF images?</h2>
<p>A PDF is a vector image (so it is rendered when you display it at whatever size you specify). An AVIF is a modern image format that uses AV1 compresion. So to convert a PDF to a AVIF file we need to create a blank image and then draw the PDF onto this.</p>
<p>This process is usually done with a PDF tool such as Acrobat however, <a href="https://www.idrsolutions.com/jpedal/convert-pdf-to-image">our Java PDF library</a> includes added functionality. There are lots of Open Source and commercial tools in most major languages. If you are using Java, it is not a function that is built into Java &#8211; you will need an external application to do this such as our JPedal PDF library. JPedal is the best Java PDF library for developers.</p>
<h2>How to convert PDF to AVIF in Java</h2>
<ol>
<li>Download a <a href="https://www.idrsolutions.com/jpedal/#why-buy">trial copy</a> of JPedal and add it to your IDE.</li>
<li>Create a File handle, InputStream or URL pointing to the PDF file</li>
<li>Include a password if file password protected</li>
<li>Open the PDF file</li>
<li>Iterate over the pages</li>
</ol>
<h3>and the Java code to convert PDF to AVIF…</h3>
<pre class='line-numbers' data-ad=JPedal><code class='language-java'>ConvertPagesToImages convert = new ConvertPagesToImages(&quot;inputFile.pdf&quot;);<br />
//convert.setPassword(&quot;password&quot;);<br />
if (convert.openPDFFile()) {<br />
    for (int page = 1; page &lt;= convert.getPageCount(); page++) {<br />
        final BufferedImage bi = convert.getPageAsImage(page);<br />
        final File out = new File(&quot;outputFolder&quot; + page + &quot;.avif&quot;);<br />
        JDeli.write(bi, OutputFormat.AVIF, out);<br />
    }<br />
}

<br />convert.closePDFfile();<br />
</code></pre>
<h2>Key points to remember</h2>
<p>The usual reason for doing this conversion is to display the content as an image (e.g. a thumbnail on a website). However, there are things so remember:</p>
<p><strong>1.</strong> Bitmapped images do not scale very well (unlike Vector formats like PDF). So you need to get the size correct. If you make it too small you will not be able to zoom in without pixelation. If you make it too big you will make the download slower and need more memory.</p>
<p><strong>2.</strong> Bitmapped images do not have some of the other advantages of PDF files (like text search).  You may need to add manual functionality to your application if you wish to have things like text highlighting.</p>
<p><strong>3.</strong> If you are doing it to print the PDF you will need a very large image to get a quality print at 300 or 600 dpi (what looks good on screen at 72dpi will not appear as crisp on a printout).</p>
<p>So long as you remember these, Java PDF to AVIF conversion is a straightforward process with a tool such as <a href="https://www.idrsolutions.com/jpedal/">JPedal</a>.</p>
<p>&nbsp;</p>
<p>The post <a href="https://blog.idrsolutions.com/java-pdf-to-avif-conversion-tutorial/">Java PDF to AVIF conversion (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Reorder Pages in a PDF Using Java (Step-by-Step Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-reorder-pages-in-a-pdf-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Wed, 25 Feb 2026 12:38:07 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[edit]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[manipulate]]></category>
		<category><![CDATA[modify]]></category>
		<category><![CDATA[move]]></category>
		<category><![CDATA[page]]></category>
		<category><![CDATA[pages]]></category>
		<category><![CDATA[reorder]]></category>
		<category><![CDATA[shuffle]]></category>
		<category><![CDATA[swap]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38586</guid>

					<description><![CDATA[<p>TL;DR The JPedal Java PDF toolkit can reorder pages in a PDF file. Motivation In document processing workflows, page order is everything. Whether you are correcting a scanned document, organizing a business proposal, or programmatically building a report, the ability to move, swap, or reverse pages is a critical requirement for Java developers. While the [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-reorder-pages-in-a-pdf-in-java-tutorial/">How to Reorder Pages in a PDF Using Java (Step-by-Step Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>TL;DR</h2>
<p>The <a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal Java PDF toolkit</a> can reorder pages in a PDF file.</p>
<h2>Motivation</h2>
<p>In document processing workflows, page order is everything. Whether you are correcting a scanned document, organizing a business proposal, or programmatically building a report, the ability to move, swap, or reverse pages is a critical requirement for Java developers.</p>
<p>While the PDF format is notoriously difficult to manipulate directly, the <a href="https://www.idrsolutions.com/jpedal">JPedal</a> Java PDF Library provides a high-level <code>PdfManipulator</code> class that makes these changes in just a few lines of code.</p>
<h2>Why Reorder Pages Programmatically?</h2>
<p>You may want to reorder pages in a PDF to improve the structure or clarity of the document. For example, you might want to modify the order of steps in a business proposal. Page order can affect how people understand your document so a misplaced page should be corrected. Other reasons can include:</p>
<ul>
<li>Batch Processing: You need to fix the page order of thousands of documents.</li>
<li>Dynamic Assembly: You are merging documents and need to ensure the Table of Contents or Appendices are in the correct position.</li>
<li>Correction Logic: You need to reverse pages that were scanned in the wrong order.</li>
</ul>
<h2>Step-by-Step: Reordering PDF Pages in Java</h2>
<ol>
<li>First, you will need to download the JPedal jar. You can <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">get a trial jar</a> from our website.</li>
<li>Next, you need to add JPedal to your Java project. We have lots of guides on our support site for how to add JPedal to different types of projects. For example: <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/add-jpedal-as-a-maven-dependency" target="_blank">how to add JPedal to a maven project</a>.</li>
<li>Finally, you can add the code to reorder pages using the <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">PDF Manipulator</a> class.</li>
</ol>
<p><pre class='line-numbers' data-ad=jpedal><code class='language-java'>// Load the PDF file<br />
final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));

<br />// Move page 1 to just before page 5<br />
pdf.movePage(1, 5);

<br />// Swap pages 3 and 4<br />
pdf.swapPages(3, 4);

<br />// Reverse the order of all pages in the document<br />
pdf.reversePages();

<br />// You can also remove pages<br />
pdf.removePage(new PageRanges(&quot;10-20&quot;));

<br />// Apply the queued manipulations and write the file to disk<br />
pdf.apply();<br />
pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.closeDocument();<br />
pdf.reset();<br />
</code></pre><br />
&nbsp;</p>
<h2>Download JPedal</h2>
<p>You can download a <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">JPedal trial</a> jar to see how it works.</p>
<h2>Resources</h2>
<p>Learn more about <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">manipulating PDF files in Java</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-reorder-pages-in-a-pdf-in-java-tutorial/">How to Reorder Pages in a PDF Using Java (Step-by-Step Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to remove blank pages from a PDF in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-remove-blank-pages-from-a-pdf-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Thu, 12 Feb 2026 16:51:57 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[blank]]></category>
		<category><![CDATA[clean]]></category>
		<category><![CDATA[clear]]></category>
		<category><![CDATA[edit]]></category>
		<category><![CDATA[empty]]></category>
		<category><![CDATA[gap]]></category>
		<category><![CDATA[manipulate]]></category>
		<category><![CDATA[pages]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38578</guid>

					<description><![CDATA[<p>The JPedal Java PDF library can remove blank pages from documents. Rationale But why might you want to do this? A common reason would be for saving paper when printing documents. Or perhaps you want to remove empty gaps from a presentation. How to remove blank pages using Java Since Java does not provide any [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-remove-blank-pages-from-a-pdf-in-java-tutorial/">How to remove blank pages from a PDF in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The <a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal Java PDF library</a> can remove blank pages from documents.</p>
<h2>Rationale</h2>
<p>But why might you want to do this? A common reason would be for saving paper when printing documents. Or perhaps you want to remove empty gaps from a presentation.</p>
<h2>How to remove blank pages using Java</h2>
<p>Since Java does not provide any native ways to interact with PDF files, you will need a PDF library. We have been developing <a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal</a> for over 20 years and it contains a powerful <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">PDF Manipulator</a>.</p>
<p>Using the following code, we can scan the whole document and write out a version of it that does not contain any blank pages.</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));<br />
pdf.removeBlankPages();<br />
pdf.apply();<br />
pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.closeDocument();<br />
pdf.reset();<br />
</code></pre>
<h2>Download JPedal</h2>
<p>You can download a <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">JPedal trial</a> jar to see how it works.</p>
<h2>Resources</h2>
<p>Learn more about <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">manipulating PDF files in Java</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-remove-blank-pages-from-a-pdf-in-java-tutorial/">How to remove blank pages from a PDF in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>25 years of Heretical Thinking: Our Playbook</title>
		<link>https://blog.idrsolutions.com/25-years-of-heretical-thinking-our-playbook/</link>
		
		<dc:creator><![CDATA[chika]]></dc:creator>
		<pubDate>Wed, 11 Feb 2026 12:33:11 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<category><![CDATA[Autonomy]]></category>
		<category><![CDATA[Better Not Bigger]]></category>
		<category><![CDATA[Bootstrapping]]></category>
		<category><![CDATA[business of software]]></category>
		<category><![CDATA[Business Strategy]]></category>
		<category><![CDATA[company culture]]></category>
		<category><![CDATA[Customer Success]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Sustainable Growth]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38567</guid>

					<description><![CDATA[<p>Watch our BoS 2025 Talk: 25 Years of Heretical Thinking Consistency After 25 years in business, IDR Solutions has grown by doing things differently. We don&#8217;t chase VCs, scale unnecessarily or jump on trends. Instead, we&#8217;ve built a sustainable business through autonomy, deep customer relationships, and thinking long term while openly questioning the assumptions the [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/25-years-of-heretical-thinking-our-playbook/">25 years of Heretical Thinking: Our Playbook</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/chika/">chika</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em><a href="https://businessofsoftware.org/talks/25-years-of-heretical-thinking/">Watch our BoS 2025 Talk: 25 Years of Heretical Thinking</a> </em></p>
<h2>Consistency</h2>
<p>After 25 years in business, IDR Solutions has grown by doing things differently. We don&#8217;t chase VCs, scale unnecessarily or jump on trends. Instead, we&#8217;ve built a sustainable business through autonomy, deep customer relationships, and thinking long term while openly questioning the assumptions the software industry treats as default.</p>
<p>This approach is often described as heretical and focuses on choosing autonomy over hierarchy, relationships over rapid expansion and prioritising long term sustainable growth which ensure quality is maintained all around. </p>
<p>In this post, we want to unpack two perspectives from that journey. One looks inward, at how autonomy, trust and culture shape the way a small company operates day to day. The other looks outward, at why resisting “scale at all costs” and applying first principles thinking, encouraging questions and experimentation has been critical to building a resilient business.</p>
<p>This may not be every company&#8217;s winning formula but it presents an alternative lens that invites founders and teams to reflect on what &#8220;better, not bigger&#8221; might look like for them.</p>
<h2>Culture &#038; autonomy</h2>
<p>One of the principles that has shaped how we work at IDR Solutions is autonomy. As a small company, we’ve deliberately avoided heavy hierarchies and rigid processes. Instead, each member of our team is trusted to take ownership of their work, make decisions and act with the wider business in mind. This trust creates accountability naturally, not through layers of approval and signatures but instead through shared responsibility.</p>
<p>During our talk, I summed it up simply, “As a small company, there’s a lot of autonomy within each individual and we’re able to take action and make real impact&#8221; That autonomy has a direct effect on how we operate day to day. People aren’t waiting to be told what to do or how to do it. Problems are identified early, decisions are made promptly and progress happens without unnecessary friction.</p>
<p>It also influences how we grow. Growth at IDR hasn’t been about speed for its own sake. Instead, it’s been intentionally shaped by long term thinking, relationships with our customers, partners and colleagues and a commitment to quality. When people feel trusted and empowered, they care deeply about the outcomes of their work, not just the outputs.</p>
<p>Over time, this way of working has strengthened relationships across the company and with our customers. It’s helped us maintain a consistent culture, even as the business has evolved and ensured that quality is upheld across everything we do. Autonomy is a long term commitment that requires trust, clarity and patience. It’s been a key reason why IDR Solutions has been able to grow sustainably while staying true to our values. This culture of autonomy has also shaped our approach to growth itself—which brings us to one of our most deliberate choices, resisting the pressure to scale at all costs.</p>
<h2>(Do not) Scale at all Costs!</h2>
<p>One of the cornerstones of IDR Solutions&#8217; strategy has been prioritising sustainable growth over the &#8216;scale at all costs&#8217; mantra. Unlike many VC backed tech firms that burn cash to capture market share, we focus on maintaining a lean and profitable business model.</p>
<p>By not scaling the team or product suite too rapidly, we maintain a level of depth in technical expertise in our industry. This is primarily why customers like Academia have used our solutions to work with over 60 million PDFs!</p>
<p>What we see with a lot VC backed companies is the pursuit of hyper-growth. Some customers specifically chose IDR Solutions because they were small and could provide better, more personalized service compared to VC backed giants.</p>
<h2>Relationships over Transactions</h2>
<p>Our strategy is about long term partnerships, not just closing the next deal. By moving away from a one off sales mindset, we’ve built relationships that have lasted over 20 years. Because we aren&#8217;t chasing quarterly targets for investors, we can actually focus on what makes our clients successful over the long haul.</p>
<p>We&#8217;ve found that being small is our superpower. Many of our clients come to us specifically because they’re tired of the impersonal, bureaucratic feel of $100 million corporate giants. They want a dedicated, agile team that can promptly respond, not a transactional one where they’re just another number in a database.</p>
<p>At the end of the day, business is personal. We’d rather be a great product company than a commercially obsessed one. By focusing on solving real problems, we get to grow better alongside our users. It’s a shared journey where we aim to improve with our customers, not just get bigger at their expense.</p>
<h2>Why Communities Like Business of Software Are Essential</h2>
<p>A community like Business of Software is essential because it offers a real world reality-check. It&#8217;s easy to get lost in your own bubble, but these conferences create space for honest, informal conversations with people who actually face similar struggles. </p>
<p>We value these spaces because they focus on the messy truth of running a company rather than the polished versions you see in press releases. They&#8217;re also a reminder that there is no single playbook for success and that learning from each other is the best way to stay grounded.</p>
<h2>The Future of IDR Solutions</h2>
<p>Looking ahead, we are not interested in chasing a massive growth curve just for the sake of it. Our goal is to keep refining our craft and solving the tough technical problems our clients face as they move toward modern web environments. </p>
<p>We want to remain a company that is easy to talk to and quick to move. By staying lean and focusing on quality, we ensure we can keep doing work we are proud of for another 25 years without losing the personal touch that got us here. Are you curious about our approach? Whether you&#8217;re evaluating PDF solutions or simply interested in how a 25 year old company operates without VC funding, we&#8217;re happy to talk. That&#8217;s what being small and accessible means, real conversations.</p>
<p>The post <a href="https://blog.idrsolutions.com/25-years-of-heretical-thinking-our-playbook/">25 years of Heretical Thinking: Our Playbook</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/chika/">chika</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Convert PDF to HTML5: Preserving Layout</title>
		<link>https://blog.idrsolutions.com/convert-pdf-to-html5-preserving-layout/</link>
		
		<dc:creator><![CDATA[Leon Atherton]]></dc:creator>
		<pubDate>Fri, 23 Jan 2026 16:23:32 +0000</pubDate>
				<category><![CDATA[BuildVu]]></category>
		<category><![CDATA[Fonts]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[buildvu]]></category>
		<category><![CDATA[digital publishing]]></category>
		<category><![CDATA[Document Conversion]]></category>
		<category><![CDATA[fixed-layout HTML]]></category>
		<category><![CDATA[layout preservation]]></category>
		<category><![CDATA[PDF to HTML5]]></category>
		<category><![CDATA[SVG conversion]]></category>
		<category><![CDATA[web development tools]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38535</guid>

					<description><![CDATA[<p>Whether you’re a developer building a web application or a business looking to digitize a massive archive, you’ve likely struggled to choose the best way to display your documents. So you convert a beautifully designed document to HTML, only to find the fonts are missing, the images have shifted, and the tables are a jumbled [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/convert-pdf-to-html5-preserving-layout/">Convert PDF to HTML5: Preserving Layout</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/leon/">Leon Atherton</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Whether you’re a developer building a web application or a business looking to digitize a massive archive, you’ve likely struggled to choose the best way to display your documents. So you convert a beautifully designed document to HTML, only to find the fonts are missing, the images have shifted, and the tables are a jumbled mess.</p>
<p>If layout <em>fidelity</em> is your top priority, there is one solution that stands head and shoulders above the rest: BuildVu.</p>
<p>Here is why BuildVu is the industry-leading choice for converting PDF to HTML while keeping your document&#8217;s layout intact.</p>
<h2>The Challenge: Why Most Solutions Fail</h2>
<p>Most PDF-to-HTML tools are not specialised for conversions. They attempt to guess where paragraphs end and where columns begin. Because PDF is a fixed-layout format, this &#8220;guessing&#8221; leads to:</p>
<ul>
<li><strong>Broken Layouts:</strong> Overlapping text and misaligned images. The content (sometimes even the text) gets flattened to an image.</li>
<li><strong>Font Substitution:</strong> Your carefully chosen brand fonts are replaced by generic Arial or Times New Roman. This causes additional problems like text overlapping and incorrect line lengths.</li>
<li><strong>Bloated Code:</strong> Messy, unreadable HTML that is impossible to maintain. The HTML output also has larger file size, becoming slower to load in the browser.</li>
</ul>
<h2>Pixel-Perfect Layout Preservation</h2>
<p>BuildVu doesn&#8217;t try to guess your layout. It treats the PDF as a visual blueprint. By using a sophisticated conversion engine, it reproduces the exact coordinates of every element.</p>
<h3>Precision Mapping for Any Industry</h3>
<p>Whether you are converting complex architectural drawings, high-end magazines, or technical manuals with intricate diagrams, the HTML output is visually indistinguishable from the original PDF.</p>
<p><a href="https://www.idrsolutions.com/buildvu/#examples">Click here to see some samples of the BuildVu conversions.</a></p>
<h2>Advanced Font Conversion</h2>
<p>Fonts are one of the biggest hurdle in document conversion. When creating PDF files, authors may choose which fonts to embed inside the PDF file. </p>
<p>Most PDF files contain embedded fonts because it ensures a consistent appearance across platforms, though it is also common to avoid embedding common fonts such as Times New Roman because it reduces the PDF file size.</p>
<h3>Navigating Font Licensing and Compliance</h3>
<p>Some font licenses are permissive (such as <a href="https://openfontlicense.org/open-font-license-official-text/">SIL Open Font License</a>), whilst other licenses are more restrictive. There is no reliable way to tell programmatically what license a font has. </p>
<p>Many font licenses pre-date the internet, which means there is often no clear answer as to what is or is not allowed. BuildVu is designed to help you navigate these legal grey areas through specialized output settings.</p>
<h3>Customizable Text Modes</h3>
<p>BuildVu handles fonts differently depending on which Text Mode is used:</p>
<ul>
<li><code>shapetext_nonselectable</code> modes: BuildVu displays a flattened version of the fonts which avoids writing out any font files. Text selection is not possible in this mode.</li>
<li><code>shapetext_selectable</code> modes: BuildVu displays a flattened version of the fonts in addition to writing out a license-safe version of the fonts which is used for text selection purposes. The license-safe version of the fonts contains only width information.</li>
<li><code>realtext</code> modes: BuildVu writes out any embedded font files as part of the conversion.</li>
</ul>
<h3>Intelligent Fallback System</h3>
<p>When PDF files use fonts that are not embedded, BuildVu ensures your document remains readable and professional by using high-quality open-source fallback fonts, including:</p>
<ul>
<li>Liberation Serif &#038; Liberation Sans</li>
<li>Noto Sans Condensed &#038; Noto Sans Symbols2</li>
<li>Tex Gyre Cursor</li>
<li>GNU Unifont</li>
<li>Anton</li>
</ul>
<h3>Efficient Asset Management</h3>
<p>To keep file sizes small and performance high, BuildVu uses smart logic for font output:</p>
<ul>
<li><strong>Shared Fonts:</strong> When embedded fonts are shared by multiple pages in the PDF file, BuildVu will only write out a single copy of the font.</li>
<li><strong>Versioning and Mapping:</strong> If BuildVu writes out multiple font files with similar names, it is because the PDF file stores different versions of the font with the same name or because the font maps multiple glyphs onto the same extraction value (which requires a new copy of the font).</li>
</ul>
<h2>High Performance with Small File Sizes</h2>
<p>A common fear with high-fidelity conversion is massive file sizes. BuildVu uses an optimized SVG/HTML5 hybrid approach.</p>
<h3>Optimization Through Hybrid Tech</h3>
<ul>
<li><strong><a href="https://developer.mozilla.org/en-US/docs/Web/SVG">SVG</a> for Graphics:</strong> Vector graphics stay crisp at any zoom level.</li>
<li><strong>HTML for Text:</strong> Text remains real text, making it SEO-friendly and searchable without the weight of a giant image file.</li>
</ul>
<h2>Standard Converters vs BuildVu</h2>
<p>The table below shows the main differences between any standard converter and a developer tool like BuildVu:</p>
<table>
<tr>
<th>Feature</th>
<th>Standard Converters</th>
<th>BuildVu</th>
</tr>
<tr>
<td>Layout Accuracy</td>
<td>Low (Tries to reflow)</td>
<td>High (Fixed Layout)</td>
</tr>
<tr>
<td>Searchability</td>
<td>Often lost in &#8220;Image Mode&#8221;</td>
<td>100% Searchable Text</td>
</tr>
<tr>
<td>Fonts</td>
<td>Substitutes with generic fonts</td>
<td>Converts/Embeds original fonts</td>
</tr>
<tr>
<td>Mobile Support</td>
<td>Often breaks on small screens</td>
<td>Built-in Responsive Viewers</td>
</tr>
</table>
<h2>Built for Developers</h2>
<p>Unlike black-box online tools, BuildVu is a developer-first library. It integrates seamlessly into your existing stack.</p>
<h3>Enterprise-Grade Integration</h3>
<ul>
<li>Java SDK / REST API: Automate conversions at scale.</li>
<li>Self-Hosted: Keep your data secure on your own servers—no need to send sensitive documents to a third-party cloud.</li>
<li>Customizable Viewer: Use the IDRViewer to provide a professional magazine-style or continuous scroll reading experience directly in the browser.</li>
</ul>
<h2>Trial BuildVu for free</h2>
<p>If you need your web-based documents to look exactly like their printed counterparts, <a href="https://www.idrsolutions.com/buildvu/">BuildVu</a> is the tool that delivers the necessary precision. It bridges the gap between the rigid structure of a PDF and the flexibility of the modern web.</p>
<p>The post <a href="https://blog.idrsolutions.com/convert-pdf-to-html5-preserving-layout/">Convert PDF to HTML5: Preserving Layout</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/leon/">Leon Atherton</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Google Reverses Course: Chromium to Restore JPEG XL Support</title>
		<link>https://blog.idrsolutions.com/google-reverses-course-chromium-to-restore-jpeg-xl-support/</link>
		
		<dc:creator><![CDATA[Nadir]]></dc:creator>
		<pubDate>Wed, 14 Jan 2026 13:00:15 +0000</pubDate>
				<category><![CDATA[JDeli]]></category>
		<category><![CDATA[JPEGXL]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Google Chromium]]></category>
		<category><![CDATA[Image Compression]]></category>
		<category><![CDATA[JPEG XL]]></category>
		<category><![CDATA[pdf association]]></category>
		<category><![CDATA[Rust Programming]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Web Standards]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38475</guid>

					<description><![CDATA[<p>TL;DR Google has reversed its 2022 decision and will bring JPEG XL back to Chromium, driven by developer pressure and growing adoption, using a memory-safe Rust implementation. The long-standing battle over the future of web imagery has reached a stunning conclusion. Google’s Chromium team, the gatekeepers for Chrome, Edge, and Brave, has officially announced plans [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/google-reverses-course-chromium-to-restore-jpeg-xl-support/">Google Reverses Course: Chromium to Restore JPEG XL Support</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/nadir/">Nadir</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>TL;DR</h2>
<p>Google has reversed its 2022 decision and will bring <a href="https://jpegxl.info/">JPEG XL</a> back to Chromium, driven by developer pressure and growing adoption, using a memory-safe Rust implementation.</p>
<p>The long-standing battle over the future of web imagery has reached a stunning conclusion. Google’s Chromium team, the gatekeepers for Chrome, Edge, and Brave, has officially <a href="https://issues.chromium.org/issues/40168998">announced plans</a> to integrate a JPEG XL (JXL) decoder, effectively killing the &#8220;obsolete&#8221; tag that has dogged the format since 2022.</p>
<p>The move marks a rare and high-profile retreat for Google, which previously claimed the format lacked &#8220;ecosystem interest&#8221; despite a vocal outcry from photographers, developers, and open-source advocates.</p>
<h2>The &#8220;Memory-Safe&#8221; Path Forward</h2>
<p>While the previous experimental support for JXL relied on a C++ decoder, Google is setting a higher bar for its return. Rick Byers, a Chrome tech lead, emphasized that the team is looking for a &#8220;memory-safe&#8221; implementation.</p>
<p>This points directly toward Rust, a programming language designed to prevent the memory vulnerabilities common in C++. A proposal is already underway, led by Chromium committer Helmut Januschka, to utilize jxl-rs—a <a href="https://github.com/libjxl/jxl-rs">Rust-based decoder</a> born out of Google’s own research department. </p>
<p>This approach addresses the security concerns previously cited by other browser vendors like Mozilla.</p>
<h2>Why the Change of Heart?</h2>
<p>What changed Google’s mind after three years of silence? Several factors appear to have created a &#8220;perfect storm&#8221; for JXL’s comeback:</p>
<ul>
<li><strong>The PDF Factor:</strong> The recent decision by the PDF Association to make JXL a <a href="https://pdfa.org/pdf-errata-makeover/">preferred solution</a> made it nearly impossible for Chromium to ignore the format, as Chrome serves as a primary PDF viewer for millions.</li>
<li><strong>The Interop 2026 Survey:</strong> Results from the <a href="https://2025.stateofhtml.com/en-US/features/graphics-multimedia/">State of HTML survey</a> showed that JXL support was a top priority for web developers, signalling that ecosystem interest was actually at an all-time high.</li>
<li><strong>The Safari Precedent:</strong> With Apple already offering partial support in Safari, Google faced the risk of being the odd man out in the race for high-fidelity, high-efficiency web content.</li>
</ul>
<h2>A New Era for Web Media</h2>
<p>JPEG XL is widely considered superior to both the aging JPEG and the newer AVIF in several key areas. It offers lossless transcoding of old JPEGs (reducing file size by 20% without losing a single pixel of data) and supports massive resolutions and high bit-depths essential for professional HDR photography.</p>
<h2>Seamless JPEG XL Integration with JDeli</h2>
<p>For developers and organizations looking to capitalize on this resurgence immediately, <a href="https://www.idrsolutions.com/jdeli/">JDeli</a> provides a robust, high-performance image library that simplifies JPEG XL adoption. </p>
<p>Our pure java library allows Java applications to read JXL files with ease, offering a reliable bridge for legacy systems transitioning to modern standards. </p>
<p>Its high-speed processing and support for complex image metadata make it an ideal choice for enterprise environments that require the ultra-high resolution and HDR capabilities the PDF Association now champions.</p>
<h2>What’s Next?</h2>
<p>The &#8220;chicken and egg&#8221; problem that has plagued JPEG XL, where browsers won&#8217;t support it because there&#8217;s no content, and creators won&#8217;t use it because there&#8217;s no browser support, is effectively over. </p>
<p>With Chromium on board, Adobe and other software giants are expected to fast-track native JXL export tools.</p>
<p>The post <a href="https://blog.idrsolutions.com/google-reverses-course-chromium-to-restore-jpeg-xl-support/">Google Reverses Course: Chromium to Restore JPEG XL Support</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/nadir/">Nadir</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to add a table of contents to a PDF in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-add-a-table-of-contents-to-a-pdf-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Tue, 13 Jan 2026 16:32:52 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[bookmarks]]></category>
		<category><![CDATA[manipulator]]></category>
		<category><![CDATA[outlines]]></category>
		<category><![CDATA[table of contents]]></category>
		<category><![CDATA[toc]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38469</guid>

					<description><![CDATA[<p>To add a table of contents to a PDF file in Java, you can use our PDF toolkit JPedal. Once you have downloaded the JPedal jar, you can use the following lines of code to generate a table of contents based on the bookmarks that already exist in the file. See our other blog post [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-add-a-table-of-contents-to-a-pdf-in-java-tutorial/">How to add a table of contents to a PDF in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>To add a table of contents to a PDF file in Java, you can use our <a href="https://www.idrsolutions.com/jpedal/" target="_blank">PDF toolkit JPedal</a>.</p>
<p>Once you have downloaded the <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">JPedal jar</a>, you can use the following lines of code to generate a table of contents based on the bookmarks that already exist in the file. See our other blog post on <a href="https://blog.idrsolutions.com/how-to-add-bookmarks-to-pdf-files-in-java-tutorial/" target="_blank">how to add bookmarks to a PDF file</a>.</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));<br />
pdf.addTableOfContents(1, PaperSize.A4_PORTRAIT, BaseFont.Helvetica, 14, new float[] {0, 0, 0});<br />
pdf.apply();<br />
pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.closeDocument();<br />
</code></pre>
<p>You can customise the page dimensions, font, font size, and font color. <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator#generate-a-table-of-contents" target="_blank">Learn more on our support site</a>.</p>
<h2>Resources</h2>
<p>JPedal contains a powerful <a href="https://www.idrsolutions.com/jpedal/manipulate-pdf-pages-in-java" target="_blank">PDF Manipulator</a> which you can use to perform bulk edits to your documents. </p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-add-a-table-of-contents-to-a-pdf-in-java-tutorial/">How to add a table of contents to a PDF in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JPEG XL Finds New Life in PDF Standards</title>
		<link>https://blog.idrsolutions.com/jpeg-xl-finds-new-life-in-pdf-standards/</link>
		
		<dc:creator><![CDATA[Nadir]]></dc:creator>
		<pubDate>Tue, 13 Jan 2026 12:30:48 +0000</pubDate>
				<category><![CDATA[JDeli]]></category>
		<category><![CDATA[JPEGXL]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[JPEG XL]]></category>
		<category><![CDATA[jpeg xl compatibility]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[pdf jpeg xl]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38444</guid>

					<description><![CDATA[<p>TL;DR: Despite being sidelined by Google’s Chrome team years ago, the JPEG XL (JXL) image format has secured a major win. The PDF Association has announced it will integrate JXL into the official PDF specification as the &#8220;preferred solution&#8221; for high-end imaging, potentially forcing tech giants to reconsider the format’s &#8220;obsolete&#8221; status. The &#8220;format wars&#8221; [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/jpeg-xl-finds-new-life-in-pdf-standards/">JPEG XL Finds New Life in PDF Standards</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/nadir/">Nadir</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>TL;DR:</h2>
<p>Despite being sidelined by Google’s Chrome team years ago, the JPEG XL (JXL) image format has secured a major win. <a href="https://youtu.be/DjUPSfirHek?si=Ay5G6AF2OEHY3e2F">The PDF Association has announced</a> it will integrate JXL into the official PDF specification as the &#8220;preferred solution&#8221; for high-end imaging, potentially forcing tech giants to reconsider the format’s &#8220;obsolete&#8221; status.</p>
<p>The &#8220;format wars&#8221; just took an unexpected turn. In a move that breathed fresh air into a supposedly dying technology, the PDF Association has officially thrown its weight behind JPEG XL, expanding its scope for <a href="https://caniuse.com/jpegxl">compatibility</a>.</p>
<p>During a recent European conference, <a href="https://www.linkedin.com/in/peter-v-wyatt/">Peter Wyatt</a>, CTO of the PDF Association, confirmed that the organization, which manages the ISO standards for PDF, will adopt JPEG XL to modernize how documents handle high-quality imagery. The decision marks a significant pivot point for a format that has spent the last three years in a state of digital limbo.</p>
<h2>Why PDF Chose JXL?</h2>
<p>While the web industry has been hesitant, the PDF Association sees JXL as the answer to several long-standing technical hurdles. Wyatt highlighted the format&#8217;s ability to handle <strong>HDR (High Dynamic Range)</strong> content and its staggering scalability.</p>
<p>Key technical advantages cited include:</p>
<ul>
<li><strong>Massive Resolution:</strong> Support for images exceeding 1 billion pixels.</li>
<li><strong>Deep Color:</strong> Up to 32 bits per channel across 4,099 channels.</li>
<li><strong>Efficiency:</strong> Superior compression compared to traditional JPEGs without losing image metadata.</li>
</ul>
<h2>The Chrome Controversy</h2>
<p>The adoption is a direct challenge to the narrative set by Google. In late 2022, the Chromium team famously stripped JXL support from the world’s most popular browser, labeling it &#8220;obsolete&#8221; and claiming a lack of ecosystem interest.</p>
<p>This move sparked a firestorm among developers and photographers who argued that JXL was being sacrificed to favor AVIF, a rival format backed by Google. Critics, including the original creators of JXL, have long maintained that the format’s technical superiority was being ignored for corporate strategy.</p>
<h2>A Fragmented Landscape</h2>
<p>While the PDF Association&#8217;s endorsement is a massive endorsement, the road to mainstream use remains bumpy:</p>
<ul>
<li><strong>Apple:</strong> Currently provides <a href="https://developer.apple.com/documentation/avfoundation/avvideocodectype/jpegxl">partial support</a> across iOS and macOS, though features like animated JXLs remain restricted.</li>
<li><strong>Mozilla:</strong> Firefox developers are open to the format but are waiting for a more secure, <a href="https://github.com/libjxl/jxl-rs">Rust-based decoder</a> to mitigate the risks associated with the current C++ implementation.</li>
<li><strong>Microsoft:</strong> Windows 11 users currently require a <a href="https://apps.microsoft.com/detail/9mzprth5c0tb">separate extension</a> to view the files natively.</li>
</ul>
<h2>Effortless JPEG XL Support with JDeli</h2>
<p>As JPEG XL gains traction within the PDF standard, <a href="https://www.idrsolutions.com/jdeli/">JDeli</a> provides a seamless bridge for Java developers looking to stay ahead of the curve. Our high-performance image library offers robust support for reading and writing JXL files, ensuring your applications can handle the massive resolutions and deep color profiles mentioned above without complex native dependencies.</p>
<p>By integrating <a href="https://www.idrsolutions.com/jdeli/">JDeli</a>, you can automatically convert JXL images for use in legacy PDF workflows or generate modern, JXL-encoded PDFs that meet the latest industry specifications.</p>
<h2>The Bottom Line</h2>
<p>By making JPEG XL a &#8220;preferred solution&#8221; for the world’s most ubiquitous document format, the PDF Association is making it much harder for browser engines to ignore. If Chrome users begin opening PDFs containing JXL data, Google may find its &#8220;obsolete&#8221; label increasingly difficult to defend.</p>
<p>For now, JPEG XL remains an <a href="https://cloudinary.com/blog/the-case-for-jpeg-xl">efficient choice for developers</a>, a high-performance tool waiting for the rest of the web to catch up.</p>
<p>The post <a href="https://blog.idrsolutions.com/jpeg-xl-finds-new-life-in-pdf-standards/">JPEG XL Finds New Life in PDF Standards</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/nadir/">Nadir</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>New options for our PDF merger</title>
		<link>https://blog.idrsolutions.com/new-options-for-our-pdf-merger/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Thu, 08 Jan 2026 11:52:08 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[Merge]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[combine]]></category>
		<category><![CDATA[concatenate]]></category>
		<category><![CDATA[divider]]></category>
		<category><![CDATA[footer]]></category>
		<category><![CDATA[interleave]]></category>
		<category><![CDATA[merge]]></category>
		<category><![CDATA[mergning]]></category>
		<category><![CDATA[normalise]]></category>
		<category><![CDATA[normalize]]></category>
		<category><![CDATA[page]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38418</guid>

					<description><![CDATA[<p>In the latest release of our PDF library JPedal, we added some new features to our PDF merging tool. These new settings allow for greater control over the output when merging two or more PDF files. How to use each new feature First, you will need to create a list of MergeOptions and add each [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/new-options-for-our-pdf-merger/">New options for our PDF merger</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In the latest release of our <a href="https://www.idrsolutions.com/jpedal/" target="_blank">PDF library JPedal</a>, we added some new features to our <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/merge-pdfs" target="_blank">PDF merging tool</a>. These new settings allow for greater control over the output when merging two or more PDF files.</p>
<h2>How to use each new feature</h2>
<p>First, you will need to create a list of <a href="https://javadoc.idrsolutions.com/org/jpedal/tools/PdfMerge.MergeOption.html" target="_blank"><code>MergeOption</code>s</a> and add each option to the list.</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>final ArrayList&lt;MergeOption&gt; options = new ArrayList&lt;&gt;();<br />
options.add(MergeOption.INTERLEAVE);<br />
</code></pre>
<p>Then you can call <code>PdfMerge.mergeFiles()</code> and pass the options list.</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>PdfMerge.mergeFiles(new File[] {new File(&quot;inputFile1.pdf&quot;), &#8230;}, new File(&quot;outputFile.pdf&quot;), options);<br />
</code></pre>
<p>

</p>
<p>&nbsp;</p>
<p>

</p>
<h3>Add a dividing page</h3>
<p>To add a blank page in between each input document, you can use <code>MergeOption.ADD_DIVIDING_PAGE</code>.</p>
<h3>Add a footer</h3>
<p>To add a footer to all pages which includes the original filename and page number, you can use <code>MergeOption.ADD_FOOTER</code>.</p>
<p>You can customise the appearance of the footer using <a href="https://javadoc.idrsolutions.com/org/jpedal/tools/PdfMergeAttributes.html" target="_blank"><code>PdfMergeAttributes</code></a>.</p>
<h3>Interleave</h3>
<p>To merge documents by alternating pages from each input document, you can use <code>MergeOption.INTERLEAVE</code>.</p>
<p>Learn more about <a href="https://blog.idrsolutions.com/how-to-interleave-merge-pdfs-in-java-tutorial/" target="_blank">interleave merging</a>.</p>
<h3>Normalize page size</h3>
<p>To ensure all pages in the output document are the same dimensions as the first page, you can use <code>MergeOption.NORMALISE_PAGE_SIZE_TO_MATCH_FIRST</code>.</p>
<h3>Normalize page rotation</h3>
<p>To ensure all pages in the output document have the same orientation as the first page, you can use <code>MergeOption.NORMALISE_ROTATION_TO_MATCH_FIRST</code>.</p>
<p>

</p>
<p>&nbsp;</p>
<p>

</p>
<h2>Download JPedal to get started</h2>
<p>Download a <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">JPedal jar</a> from our website to instantly start merging PDF files.</p>
<h2>Resources</h2>
<p>Learn more about <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/merge-pdfs" target="_blank">how to merge PDFs in Java</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/new-options-for-our-pdf-merger/">New options for our PDF merger</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Manipulate PDF files in the JPedal Viewer</title>
		<link>https://blog.idrsolutions.com/manipulate-pdf-files-in-the-jpedal-viewer/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Wed, 24 Dec 2025 11:44:16 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[edit]]></category>
		<category><![CDATA[manipulate]]></category>
		<category><![CDATA[modify]]></category>
		<category><![CDATA[page]]></category>
		<category><![CDATA[pages]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[view]]></category>
		<category><![CDATA[viewer]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38263</guid>

					<description><![CDATA[<p>The PDF library JPedal contains a &#8216;tools&#8217; menu in the Viewer which allows you to make quick edits to PDF files, such as copying, rotating, cropping, and many more. The menu is hidden by default so you will need to update your preferences to see it. You can either do this in the Viewer&#8217;s preferences [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/manipulate-pdf-files-in-the-jpedal-viewer/">Manipulate PDF files in the JPedal Viewer</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The <a href="https://www.idrsolutions.com/jpedal/" target="_blank">PDF library JPedal</a> contains a &#8216;tools&#8217; menu in the <a href="https://www.idrsolutions.com/jpedal/java-pdf-viewer" target="_blank">Viewer</a> which allows you to make quick edits to PDF files, such as copying, rotating, cropping, and many more.</p>
<p>The menu is hidden by default so you will need to <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/viewer/customise-the-user-interface-in-the-java-pdf-viewer#tools-menu" target="_blank">update your preferences</a> to see it. You can either do this in the Viewer&#8217;s preferences window, or in the <code>properties.xml</code> file.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/12/Screenshot-2025-12-24-at-10.30.40.png"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/12/Screenshot-2025-12-24-at-10.30.40.png" alt="JPedal Preferences Window" width="712" height="587" class="aligncenter size-full wp-image-38264" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/Screenshot-2025-12-24-at-10.30.40.png 712w, https://blog.idrsolutions.com/app/uploads/2025/12/Screenshot-2025-12-24-at-10.30.40-300x247.png 300w" sizes="auto, (max-width: 712px) 100vw, 712px" /></a></p>
<p>Once enabled, you can perform the following operations:</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/12/Screenshot-2025-12-24-at-10.32.36.png"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/12/Screenshot-2025-12-24-at-10.32.36.png" alt="JPedal tools menu" width="965" height="546" class="aligncenter size-full wp-image-38265" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/Screenshot-2025-12-24-at-10.32.36.png 965w, https://blog.idrsolutions.com/app/uploads/2025/12/Screenshot-2025-12-24-at-10.32.36-300x170.png 300w, https://blog.idrsolutions.com/app/uploads/2025/12/Screenshot-2025-12-24-at-10.32.36-768x435.png 768w" sizes="auto, (max-width: 965px) 100vw, 965px" /></a></p>
<p><a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">Download a JPedal trial jar</a> and try for yourself!</p>
<h2>Resources</h2>
<p>Learn more about the <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/viewer/how-to-add-a-pdf-viewer-to-your-java-application" target="_blank">JPedal Viewer</a>.</p>
<p>Learn more about <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">manipulating PDF files</a> in Java.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/manipulate-pdf-files-in-the-jpedal-viewer/">Manipulate PDF files in the JPedal Viewer</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to remove annotations from PDF files in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-remove-annotations-from-pdf-files-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 14:45:51 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[annotate]]></category>
		<category><![CDATA[annotations]]></category>
		<category><![CDATA[clean]]></category>
		<category><![CDATA[remove]]></category>
		<category><![CDATA[sanitise]]></category>
		<category><![CDATA[sanitize]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38260</guid>

					<description><![CDATA[<p>Short answer: you can remove annotations from PDF files using JPedal. The PDF file format is very complex and contains many features to boost interactivity. One such feature is the ability for PDF files to contain annotations which allow you to draw over, highlight, label, and comment on documents without modifying the existing content. While [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-remove-annotations-from-pdf-files-in-java-tutorial/">How to remove annotations from PDF files in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Short answer: you can remove annotations from PDF files using <a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal</a>.</p>
<p>The PDF file format is very complex and contains many features to boost interactivity. One such feature is the ability for PDF files to contain annotations which allow you to draw over, highlight, label, and comment on documents without modifying the existing content.</p>
<p>While this is a useful feature, you may want to remove annotations from documents, for example to remove text highlighting that has been done with annotations.</p>
<p>Our <a href="https://www.idrsolutions.com/jpedal/" target="_blank">PDF toolkit JPedal</a> allows you to remove annotations from PDF files with only a few lines of code!</p>
<p>To do this you need to <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download a JPedal jar</a>, then run the following code:</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));<br />
pdf.removeAnnotations();<br />
pdf.apply();<br />
pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.closeDocument();<br />
</code></pre>
<p>You may also want to consider <a href="https://blog.idrsolutions.com/how-to-sanitize-pdf-files-removing-hidden-risks/" target="_blank">other sanitization options</a> to clean your documents.</p>
<h2>Resources</h2>
<p>You can <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download a trial jar</a> from our website.</p>
<p>Learn more about the <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">PDF Manipulator API</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-remove-annotations-from-pdf-files-in-java-tutorial/">How to remove annotations from PDF files in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Mastering Server-Side PDF Processing in Java</title>
		<link>https://blog.idrsolutions.com/mastering-server-side-pdf-processing-in-java/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Fri, 19 Dec 2025 15:51:51 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[enterprise software]]></category>
		<category><![CDATA[pdf application]]></category>
		<category><![CDATA[PDF extraction]]></category>
		<category><![CDATA[server jvm crash]]></category>
		<category><![CDATA[server side]]></category>
		<category><![CDATA[server side pdf processing]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38224</guid>

					<description><![CDATA[<p>The Hidden Risks in Server-Side PDF Processing PDFs are the lifeblood of enterprise document workflows, but processing them at scale on a server is a complex engineering challenge. Most developers understand the architectural strain that high-volume PDF handling puts on a backend. The Native Code Fragility Many Java PDF libraries are actually wrappers around native [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/mastering-server-side-pdf-processing-in-java/">Mastering Server-Side PDF Processing in Java</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>The Hidden Risks in Server-Side PDF Processing</h2>
<p>PDFs are the lifeblood of enterprise document workflows, but processing them at scale on a server is a complex engineering challenge. Most developers understand the architectural strain that high-volume PDF handling puts on a backend.</p>
<h3>The Native Code Fragility</h3>
<p>Many Java PDF libraries are actually wrappers around native C++ binaries (via JNI). In a desktop environment, a crash simply closes the application. On a server, a native crash is catastrophic, it bypasses Java’s exception handling and takes down the entire Java Virtual Machine (JVM).</p>
<h3>The Memory Problem</h3>
<p>PDF files are not linear; they are complex object trees. Many standard libraries attempt to load the entire document into memory to process it. When your server tries to handle 50 concurrent requests for 100MB PDFs, the heap usage spikes instantly, leading to the dreaded <code>OutOfMemoryError (OOM)</code>.</p>
<h3>Concurrency and Thread Contention</h3>
<p>A server is a multi-threaded environment by nature. If a PDF library uses static shared variables or isn&#8217;t designed for re-entrancy, concurrent threads will interfere with each other. </p>
<p>This results in &#8220;ghost&#8221; data appearing in documents or, worse, internal deadlocks that cause your CPU usage to hit 100% while processing nothing.</p>
<h2>Why JPedal for Server-Side PDF Processing?</h2>
<p><a href="https://www.idrsolutions.com/jpedal/">JPedal</a> is uniquely suited for this role because it is built on a 100% native Java codebase with zero third-party dependencies, eliminating common stability and licensing issues. </p>
<p>It provides robust tools for high-volume tasks like <a href="https://www.idrsolutions.com/jpedal/java-pdf-renderer">PDF-to-image conversion</a>, <a href="https://www.idrsolutions.com/jpedal/extract-structured-content">extraction</a>, and <a href="https://www.idrsolutions.com/jpedal/process-pdf-in-java">manipulation</a> directly on your server, ensuring cross-platform portability and simplified deployment in any Java environment (e.g., Spring Boot, Jakarta EE).</p>
<p>With JPedal you have:</p>
<ul>
<li><strong>100% Java &#038; Zero Dependencies Eliminate:</strong> JNI &#8220;black box&#8221; crashes and third-party security vulnerabilities (like Log4j). Deploy instantly on Docker, Linux, or Cloud with a single JAR, no native binaries or complex environment setup required.</li>
<li><strong>High-Throughput Performance:</strong> Engineered for speed, JPedal is on par with the leading alternatives. Its thread-safe architecture allows for seamless concurrent processing without the risk of internal state corruption or &#8220;ghost data.&#8221;</li>
<li><strong>Intelligent Resource Handling:</strong> Prevent OutOfMemoryError with random-access loading that only pulls required objects into the heap. Disk-based image caching allows your server to process massive, image-heavy PDFs using a fraction of the memory required by standard libraries.</li>
<li><strong>Commercial-Grade Stability:</strong> Get direct support from the actual developers building the library, no tiered helpdesks. JPedal offers transparent, one-time server licensing that scales with your infrastructure without per-user or per-click fees.</li>
</ul>
<table style="width:100%; border-collapse: collapse; text-align: left;">
<thead>
<tr style="background-color: #f2f2f2;">
<th style="padding: 12px; border: 1px solid #ddd;">Capability</th>
<th style="padding: 12px; border: 1px solid #ddd;">JPedal (Server SDK)</th>
<th style="padding: 12px; border: 1px solid #ddd;">Alternatives</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 12px; border: 1px solid #ddd;"><strong>Core Tech</strong></td>
<td style="padding: 12px; border: 1px solid #ddd;">100% Pure Java (No JNI)</td>
<td style="padding: 12px; border: 1px solid #ddd;">Native C++ Wrappers</td>
</tr>
<tr>
<td style="padding: 12px; border: 1px solid #ddd;"><strong>Dependencies</strong></td>
<td style="padding: 12px; border: 1px solid #ddd;">Zero (Self-contained)</td>
<td style="padding: 12px; border: 1px solid #ddd;">High (3rd-party bloat)</td>
</tr>
<tr>
<td style="padding: 12px; border: 1px solid #ddd;"><strong>Stability</strong></td>
<td style="padding: 12px; border: 1px solid #ddd;">Catchable Java Exceptions</td>
<td style="padding: 12px; border: 1px solid #ddd;">Fatal JVM Crashes</td>
</tr>
<tr>
<td style="padding: 12px; border: 1px solid #ddd;"><strong>Memory</strong></td>
<td style="padding: 12px; border: 1px solid #ddd;">Smart Random Access</td>
<td style="padding: 12px; border: 1px solid #ddd;">Full Heap Loading</td>
</tr>
<tr>
<td style="padding: 12px; border: 1px solid #ddd;"><strong>Scaling</strong></td>
<td style="padding: 12px; border: 1px solid #ddd;">Native Thread Safety</td>
<td style="padding: 12px; border: 1px solid #ddd;">Resource Locking Issues</td>
</tr>
<tr>
<td style="padding: 12px; border: 1px solid #ddd;"><strong>Deployment</strong></td>
<td style="padding: 12px; border: 1px solid #ddd;">Single JAR (Cloud-ready)</td>
<td style="padding: 12px; border: 1px solid #ddd;">Complex Native Setup</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2>Use Case: Converting PDF to Image on Large Scale</h2>
<p>Imagine a bank converting 150,000 legacy mortgage statements into high-fidelity images for a new portal over a single weekend. Processing this volume on the backend with unoptimized libraries is a recipe for disaster.</p>
<h3>Tutorial</h3>
<p>Here&#8217;s how JPedal simplifies this step-by-step:</p>
<ol>
<li>Download <a href="https://www.idrsolutions.com/jpedal/your-trial">JPedal trial jar</a>.</li>
<li>Create a File handle, InputStream or URL pointing to the PDF file</li>
<li>Include a password if file password protected</li>
<li>Open the PDF file</li>
<li>Iterate over the pages</li>
<li>Close the PDF file</li>
</ol>
<h3>The Pure Java Code&#8230;</h3>
<p><pre class='line-numbers' data-ad=JPedal><code class='language-java'>File file = new File(&quot;/path/to/document.pdf&quot;));<br />
ConvertPagesToHiResImages extract=new ConvertPagesToHiResImages(file);<br />
//extract.setPassword(&quot;password&quot;);<br />
if (extract.openPDFFile()) {<br />
int pageCount = extract.getPageCount();<br />
for (int page = 1; page &lt;= pageCount; page++) {<br />
BufferedImage img = extract.getPageAsImage(page, hasAlpha);<br />
}<br />
}<br />
extract.closePDFfile();<br />
</code></pre><br />
&nbsp;</p>
<h2>Ready to Power Your Java Backend?</h2>
<p>Choosing a library for server-side PDF processing in Java is an architectural decision. JPedal is intentionally built to remove the pain points associated with native dependencies, memory scaling, and complex licensing that plague other solutions.</p>
<p>But if you&#8217;re still unsure, <a href="https://www.idrsolutions.com/jpedal/your-trial">trial JPedal</a> yourself and test our PDF SDK in your development workflow.</p>
<p><H2>FAQs</h2>
<details>
<summary>Q: How do I manage concurrent requests without exhausting server resources?</summary>
<p>A: Use a managed thread pool rather than spawning new processes for every document. This keeps the JVM stable and allows you to set a hard limit on the number of simultaneous PDF tasks, preventing CPU and memory spikes during traffic bursts.</p>
</details>
<details>
<summary>Q: Can I process PDFs in a headless Linux or Docker environment?</summary>
<p>A: Yes, provided your library does not require a graphical display (X11) or native OS dependencies. For cloud-native deployments, choose a 100% Java implementation to ensure portability and avoid the complexity of installing native libraries in your containers.</p>
</details>
<details>
<summary>Q: Why use server-side processing instead of client-side?</summary>
<p>A: Server-side processing offers superior security (no raw files sent to the browser), consistent performance across all devices, and the ability to handle complex tasks, like high-fidelity conversion or digital signing that would crash a mobile browser.</p>
</details>
<p>The post <a href="https://blog.idrsolutions.com/mastering-server-side-pdf-processing-in-java/">Mastering Server-Side PDF Processing in Java</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to crop a PDF file in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-crop-a-pdf-file-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Thu, 18 Dec 2025 13:21:18 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[clip]]></category>
		<category><![CDATA[crop]]></category>
		<category><![CDATA[margin]]></category>
		<category><![CDATA[odf]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[scale]]></category>
		<category><![CDATA[trim]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38235</guid>

					<description><![CDATA[<p>Our Java PDF library JPedal contains a powerful PDF Manipulator which you can use to crop PDF files as well as performing other common edits. Cropping pages in a PDF document is useful if you want to remove margins, or focus on a specific section. Unlike image cropping, PDF cropping adjusts the visible area of [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-crop-a-pdf-file-in-java-tutorial/">How to crop a PDF file in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Our <a href="https://www.idrsolutions.com/jpedal/" target="_blank">Java PDF library JPedal</a> contains a powerful PDF Manipulator which you can use to crop PDF files as well as performing other common edits.</p>
<p>Cropping pages in a PDF document is useful if you want to remove margins, or focus on a specific section. Unlike image cropping, PDF cropping adjusts the visible area of the page without modifying its content.</p>
<p>You can <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download a trial copy</a> from our website.</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));

<br />pdf.cropPage(new PageRanges(&quot;1-10&quot;), 0.5f, 0.5f, ScaleMode.SCALE_BY_FACTOR);<br />
pdf.cropPage(new PageRanges(&quot;1-10&quot;), 595, 842, ScaleMode.SCALE_TO_DIMENSION);<br />
pdf.apply();

<br />pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.closeDocument();<br />
</code></pre>
<p>You can either crop the page by a scale factor, or to a specific dimension.</p>
<p>See the <a href="https://javadoc.idrsolutions.com/org/jpedal/manipulator/PdfManipulator.html#copyPage(int,int)" target="_blank">Javadoc</a> for more settings.</p>
<h2>Resources</h2>
<p>Learn more about the <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator#load-and-write-documents" target="_blank">PDF Manipulator API</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-crop-a-pdf-file-in-java-tutorial/">How to crop a PDF file in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Convert AVIF to JPG in Bulk (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-convert-avif-to-jpg-in-bulk-tutorial/</link>
		
		<dc:creator><![CDATA[Amy Pearson]]></dc:creator>
		<pubDate>Fri, 12 Dec 2025 13:49:27 +0000</pubDate>
				<category><![CDATA[AVIF]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDeli]]></category>
		<category><![CDATA[JPEG]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[avif to jpg]]></category>
		<category><![CDATA[avif to jpg java]]></category>
		<category><![CDATA[convert avif]]></category>
		<category><![CDATA[convert avif to jpg]]></category>
		<category><![CDATA[convert avif to jpg in java]]></category>
		<category><![CDATA[java avif to jpg]]></category>
		<category><![CDATA[java conversion avif to jpg]]></category>
		<category><![CDATA[java convert avif]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38211</guid>

					<description><![CDATA[<p>If you’re working with a large number of AVIF files, converting them to JPG in bulk can streamline your workflow, especially when the JPG format is required for multiple applications. You can read, write and convert AVIF files in Java with JDeli, our pure Java library. AVIF (AV1 Image File Format) is a modern image [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-convert-avif-to-jpg-in-bulk-tutorial/">How to Convert AVIF to JPG in Bulk (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/amy/">Amy Pearson</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://blog.idrsolutions.com/app/uploads/2025/12/tiff-to-jpg.png"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/12/tiff-to-jpg-300x300.png" alt="bulk convert avif to jpg" width="300" height="300" class="aligncenter size-medium wp-image-38214" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/tiff-to-jpg-300x300.png 300w, https://blog.idrsolutions.com/app/uploads/2025/12/tiff-to-jpg-150x150.png 150w, https://blog.idrsolutions.com/app/uploads/2025/12/tiff-to-jpg-120x120.png 120w, https://blog.idrsolutions.com/app/uploads/2025/12/tiff-to-jpg.png 500w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>If you’re working with a large number of AVIF files, converting them to JPG in bulk can streamline your workflow, especially when the JPG format is required for multiple applications.</p>
<p>You can <a href="https://www.idrsolutions.com/jdeli/avif">read, write and convert</a> AVIF files in Java with JDeli, our pure Java library.</p>
<p>AVIF (AV1 Image File Format) is a modern image format offering superior compression efficiency compared to JPEG and PNG. Converting images to AVIF results in significantly smaller file sizes with high visual quality. This leads to faster loading times and reduced bandwidth use on the web and other platforms.</p>
<p>In this article, I’ll show you how to convert AVIF images to JPG using Java and <a href="https://www.idrsolutions.com/docs/jdeli/tutorials/converting/jpg-converter">JDeli</a>, making your files easier to work with. JDeli stands out as one of the most powerful Java libraries for handling and manipulating images.</p>
<h2>Bulk convert AVIF to JPG using Java</h2>
<ol>
<li>Download the <a href="https://www.idrsolutions.com/jdeli/#why-buy" target="_blank" rel="noopener">JDeli trial jar.</a></li>
<li>Process image if needed (scale, sharpen, lighten, watermark, etc)</li>
<li>Write out BufferedImage as JPG image file</li>
</ol>
<pre class='line-numbers' data-ad=JDeli><code class='language-java'>BufferedImage bufferedImage = JDeli.read(new File(&quot;avifImageFile.avif&quot;));<br />
// Read AVIF image into Java

<br />bufferedImage = operations.apply(BufferedImage bufferedImage);<br />
// Process image (Optional)

<br />JDeli.write(bufferedImage, &quot;jpg&quot;, new File(&quot;jpgImageFile.jpg&quot;));<br />
// Write out BufferedImage as JPEG image file<br />
</code></pre>
<p>&nbsp;</p>
<h2>Export AVIF to JPG in one line of code</h2>
<p>With the <code>JDeli.convert()</code> method you can save PNG as JPG in just one line of code.</p>
<p><strong>Using File</strong><br />
<pre class='line-numbers' data-ad=JDeli><code class='language-java'>JDeli.convert(File inFile, File outFile);</code></pre><br />
<strong>Using InputStream and OutputStream</strong><br />
<pre class='line-numbers' data-ad=JDeli><code class='language-java'>JDeli.convert(InputStream inputStream, OutputStream outputStream, &quot;jpg&quot;);</code></pre><br />
<strong>Using byte[]</strong><br />
<pre class='line-numbers' data-ad=JDeli><code class='language-java'>byte[] outputData = JDeli.convert(byte[] inputData, &quot;jpg&quot;);</code></pre><br />
<strong>Configure Output Settings</strong><br />
You can use this option to specify an <a href="https://files.idrsolutions.com/maven/site/jdeli/apidocs/com/idrsolutions/image/jpeg/options/JpegEncoderOptions.html" target="_blank" rel="noopener">EncoderOptions</a> object for configuring output settings such as image compression.<br />
<pre class='line-numbers' data-ad=JDeli><code class='language-java'>JDeli.convert(File inFile, EncoderOptions outputOptions, File outfile);</code></pre></p>
<p>&nbsp;</p>
<h2>How to bulk convert AVIF to JPG from the command line</h2>
<p>You can turn PNG to JPG using command line or bash, bat, and PowerShell scripts. This method also enables JDeli to be invoked from any programming language that supports creating a child process.<br />
<pre class='line-numbers' data-ad=JDeli><code class='language-java'>java -jar jdeli.jar &#8211;convert jpg &quot;inputFileOrDir&quot; &quot;outputDir&quot;<br />
</code></pre></p>
<p>In this tutorial you learned how to bulk convert AVIF to JPG in bulk. JDeli has AVIF support for reading and writing as well, you read our <a href="https://www.idrsolutions.com/docs/jdeli/avif-support/">documentation</a> to find out more.</p>
<p>As experienced Java developers, we help you <a href="/working-with-images-in-java/" target="_blank" data-ec="example-category" data-ea="example-action" data-el="example-label">work with images in Java</a> and bring over a decade of hands-on experience with many image file formats.</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-convert-avif-to-jpg-in-bulk-tutorial/">How to Convert AVIF to JPG in Bulk (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/amy/">Amy Pearson</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to write AVIF image files in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-write-avif-image-files-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Mark Stephens]]></dc:creator>
		<pubDate>Wed, 10 Dec 2025 15:45:38 +0000</pubDate>
				<category><![CDATA[AVIF]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDeli]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[avif image writing in java]]></category>
		<category><![CDATA[avif java]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[write avif]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=33958</guid>

					<description><![CDATA[<p>In this article, I will cover how to write out images as AVIF files in Java. We also have a related article covering how to read AVIF files in Java. ImageIO does not write AVIF file types so you will need to use an external library. We believe that JDeli is the only pure, complete [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-write-avif-image-files-in-java-tutorial/">How to write AVIF image files in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In this article, I will cover how to write out images as <a href="https://blog.idrsolutions.com/what-is-the-avif-image-format/">AVIF</a> files in Java. We also have a related article covering how to <a href="https://blog.idrsolutions.com/how-to-read-avif-files-in-java-tutorial/">read AVIF</a> files in Java.</p>
<p>ImageIO does not write AVIF file types so you will need to use an external library. We believe that JDeli is the only pure, complete Java implementation available so we will document that.</p>
<p>If you are looking for a free solution, there is an AVIF library on <a href="https://github.com/umjammer/vavi-image-avif" target="_blank" rel="noopener noreferrer">GitHub</a> (which includes Java wrappers).</p>
<h2>How to write an image as a AVIF file</h2>
<ol>
<li>Add JDeli to your class or module path. (download the <a title="JDeli download" href="https://www.idrsolutions.com/jdeli/?mtm_campaign=Blog-trial-downloads&#038;mtm_kwd=blog%20articles&#038;mtm_campaign=BlogTrialDownloads" target="_blank" rel="noopener">trial jar</a>).</li>
<li>Create a File (or OutputStream) object</li>
<li>Pass image, AVIF type, and File (or OutputStream) object into write method</li>
</ol>
<h3>and the Java code to write AVIF…</h3>
<p><pre class='line-numbers' data-ad=JDeli><code class='language-java'>File file = new File(&quot;/path/to/outputFile.AVIF&quot;));<br />
JDeli.write(bufferedImage, &quot;AVIF&quot;, file);

<br />//In JDeli you can also use a typesafe version<br />
JDeli.write(bufferedImage, OutputFormat.AVIF, file);

<br />//or pass in a <a href=&quot;https://files.idrsolutions.com/maven/site/jdeli/apidocs/com/idrsolutions/image/avif/options/AvifEncoderOptions.html&quot;> object for more control over AVIF image output</a><br />
AVIFEncoderOptions options = new AVIFEncoderOptions();<br />
JDeli.write(bufferedImage, options, file);<br />
</code></pre><br />
&nbsp;<br />
<p>As experienced Java developers, we help you <a href="/working-with-images-in-java/" target="_blank" data-ec="example-category" data-ea="example-action" data-el="example-label">work with images in Java</a> and bring over a decade of hands-on experience with many image file formats.</p></p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-write-avif-image-files-in-java-tutorial/">How to write AVIF image files in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JDeli: The Memory-Efficient &#038; Performance Replacement for Java ImageIO</title>
		<link>https://blog.idrsolutions.com/jdeli-the-memory-efficient-performance-replacement-for-java-imageio/</link>
		
		<dc:creator><![CDATA[Amy Pearson]]></dc:creator>
		<pubDate>Tue, 09 Dec 2025 16:10:48 +0000</pubDate>
				<category><![CDATA[AVIF]]></category>
		<category><![CDATA[HEIC]]></category>
		<category><![CDATA[JDeli]]></category>
		<category><![CDATA[JPEG]]></category>
		<category><![CDATA[JPEG2000]]></category>
		<category><![CDATA[PNG]]></category>
		<category><![CDATA[TIFF]]></category>
		<category><![CDATA[WebP]]></category>
		<category><![CDATA[alternative imageio]]></category>
		<category><![CDATA[ImageIO]]></category>
		<category><![CDATA[imageio alternative]]></category>
		<category><![CDATA[imageio comparison]]></category>
		<category><![CDATA[imageio crash]]></category>
		<category><![CDATA[ImageIO issues]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38161</guid>

					<description><![CDATA[<p>JDeli is the industry-leading, high-performance replacement for the default javax.imageio.ImageIO package. It resolves common issues associated with the standard library, offering up to 7X faster image loading and significantly lower peak memory consumption, making it the definitive memory efficient Java image library. TL;DR Speed: JDeli is up to 10x faster than ImageIO (for TIFF writing) [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/jdeli-the-memory-efficient-performance-replacement-for-java-imageio/">JDeli: The Memory-Efficient &#038; Performance Replacement for Java ImageIO</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/amy/">Amy Pearson</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>JDeli is the industry-leading, high-performance replacement for the default <code>javax.imageio.ImageIO</code> package. It resolves common issues associated with the standard library, offering up to 7X faster image loading and significantly lower peak memory consumption, making it the definitive memory efficient Java image library.</p>
<h2>TL;DR</h2>
<ul>
<li>Speed: JDeli is up to 10x faster than ImageIO (for TIFF writing) and over 7x faster for standard PNG decoding.</li>
<li>Stability/Memory: JDeli is written fully in Java, preventing the notorious JVM crashes caused by native code dependencies in ImageIO and offering more stable memory management.</li>
<li>Modern Formats: Supports critical modern formats missing in core Java, including HEIC, AVIF, and JPEG XL.</li>
<li>Performance Detail: Reads JPEG 2000 files over 2.5x faster than ImageIO with the JAI plugin.</li>
</ul>
<h2>Why Replace ImageIO?</h2>
<h3>Core Issues with the Default Java ImageIO</p>
<h3>
<p><strong>Limited Modern and Complex Format Support</strong> The default library lacks native support for essential contemporary formats and complex professional formats. </p>
<p>This forces developers to rely on unstable, often deprecated third-party plugins (like JAI), which only partially address the problem. For example, ImageIO offers no native support for crucial modern formats like HEIC (used by Apple) or complex formats like JPEG 2000 and AVIF.</p>
<p><strong>Unoptimized Decoders Lead to Slow Performance</strong> ImageIO&#8217;s decoders rely on older, often unoptimized implementations, leading to a bottleneck in processing high-resolution images. This results in slow throughput, especially when processing large batches of images common in web services or data pipelines. </p>
<p>Performance benchmarks show ImageIO is often significantly slower than specialized libraries for common operations, sometimes lagging by over 7x (as seen in PNG decoding).</p>
<p><strong>Poor Memory Management and JVM Crash Risk</strong> ImageIO is notorious for its poor memory management. It frequently requires loading the entire, uncompressed image into memory using non-optimized data structures. </p>
<p>Furthermore, its reliance on unstable, platform-specific native (C/C++) code dependencies often leads to uncontrolled memory usage outside the Java Heap. This dramatically increases the risk of the dreaded OutOfMemoryError and can cause entire JVM crashes on server-side or cloud deployments.</p>
<h2>JDeli as the Superior Drop-in Replacement</h2>
<p>JDeli is engineered from the ground up to be a robust, high-performance, and stable alternative to ImageIO, designed for the demands of modern Java ecosystems.</p>
<p><strong>Structure:</strong> JDeli provides familiar reading and writing APIs that can easily replace existing ImageIO functions with minimal code changes.</p>
<p><strong>Key Feature:</strong> JDeli utilizes a completely optimized, low-level Java implementation instead of relying on the legacy Sun/Oracle code base or problematic third-party native binaries. </p>
<p>This eliminates the root cause of ImageIO’s instability and ensures superior speed and memory management across all supported platforms.</p>
<h2>JDeli vs ImageIO Overview</h2>
<p>Below you can find a comparison between JDeli and ImageIO, and how both are designed for different use cases:</p>
<table>
<thead>
<tr>
<th>Feature / Metric</th>
<th>Default Java ImageIO</th>
<th>JDeli Java Image Library</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Code Base Stability</strong></td>
<td>Relies heavily on <strong>unstable native code</strong> (C/C++), often via JAI plugins.</td>
<td><strong>100% Pure Java Core</strong> for all primary formats. Optional native acceleration is integrated and vetted.</td>
</tr>
<tr>
<td><strong>Crash Risk (OOM/JVM)</strong></td>
<td><strong>High Risk.</strong> Prone to <strong><code>OutOfMemoryError</code></strong> and <strong>JVM crashes</strong> due to unmanaged off-heap memory allocation.</td>
<td><strong>Zero Risk</strong> from unmanaged native code. Prevents heap-related <strong>JVM crashes</strong> by controlling memory usage within the Java Heap.</td>
</tr>
<tr>
<td><strong>Peak Memory Usage (PMU)</strong></td>
<td><strong>High.</strong> Loads entire uncompressed image into non-optimized <code>BufferedImage</code> structures. Lacks memory control.</td>
<td><strong>Low.</strong> Features optimized memory handling and a specific <strong>low-memory mode</strong> for significant PMU reduction.</td>
</tr>
<tr>
<td><strong>Modern Format Support</strong></td>
<td><strong>Poor.</strong> Requires unstable plugins for JPEG 2000, and generally lacks <strong>HEIC, AVIF, and JPEG XL</strong>.</td>
<td><strong>Excellent.</strong> Natively supports all critical modern formats (HEIC, AVIF, JPEG 2000, WebP).</td>
</tr>
<tr>
<td><strong>Multithreading Support</strong></td>
<td><strong>Limited</strong> and often non-thread-safe when dealing with native code dependencies.</td>
<td><strong>Full multithreading support</strong> available for concurrent image processing, aiding performance.</td>
</tr>
</tbody>
</table>
<h2>Code Example: JDeli for Memory-Efficient Image Processing</h2>
<p>This example shows how simple it is to use JDeli to read and write a HEIC image, demonstrating the replacement capability while implicitly utilizing its high-performance, memory-optimized core.</p>
<p><pre class='line-numbers' data-ad=JDeli><code class='language-java'>// Read HEIC files

<br />JDeli.read(File heicFile);

<br />JDeli.read(byte[] heicData);

<br />JDeli.read(InputStream heicStream);

<br />// Write HEIC files

<br />JDeli.write(myBufferedImage, &quot;heic&quot;);

<br />// Convert to and from HEIC files<br />
JDeli.convert(File inFile, File outFile);

<br />JDeli.convert(InputStream inStream, OutputStream outStream, String format);

<br />byte[] outputData=JDeli.convert(byte[] inputData, String format);<br />
</code></pre><br />
&nbsp;</p>
<h2>Conclusion</h2>
<p>For Java developers seeking a powerful and stable alternative, <a href="https://www.idrsolutions.com/jdeli/">JDeli</a> is the clear answer, designed to replace the outdated ImageIO. It is the definitive memory-efficient Java image library, eliminating the instability risks of native code while delivering superior speed.</p>
<h2>Benchmarks Resources</h2>
<p>The benchmarks mentioned in this post were performed using the Java Microbenchmark Harness test. If you&#8217;re curious, you can view the <a href="https://www.idrsolutions.com/docs/jdeli/tutorials/performance-comparison">detailed results of the test</a>.</p>
<p>As experienced Java developers, we help you <a href="/working-with-images-in-java/" target="_blank" data-ec="example-category" data-ea="example-action" data-el="example-label">work with images in Java</a> and bring over a decade of hands-on experience with many image file formats.</p>
<p>The post <a href="https://blog.idrsolutions.com/jdeli-the-memory-efficient-performance-replacement-for-java-imageio/">JDeli: The Memory-Efficient &#038; Performance Replacement for Java ImageIO</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/amy/">Amy Pearson</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Travelling to Istanbul by train for DevFest conference – Part 6 Completing the Orient Express</title>
		<link>https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/</link>
		
		<dc:creator><![CDATA[Mark Stephens]]></dc:creator>
		<pubDate>Wed, 03 Dec 2025 09:38:52 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38078</guid>

					<description><![CDATA[<p>After yesterday&#8217;s Bulgarian marathon, today is a much gentler last stage. The overnight sleep was the most comfortable yet with a spacious 4 bed compartment with dropdown beds. We had a very early start with a knock on the door at 4am to climb off the train with all our luggage for passport check and [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/">Travelling to Istanbul by train for DevFest conference – Part 6 Completing the Orient Express</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>After yesterday&#8217;s <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">Bulgarian marathon</a>, today is a much gentler last stage. </p>
<p>The overnight sleep was the most comfortable yet with a spacious 4 bed compartment with dropdown beds.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/img_9363/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9363-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9363-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9363-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/img_9369/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9369-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9369-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9369-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/img_9365/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9365-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9365-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9365-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>We had a very early start with a knock on the door at 4am to climb off the train with all our luggage for passport check and bag scan. There was even a small duty free shop.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3814-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3814-225x300.jpeg" alt="customs" width="225" height="300" class="aligncenter size-medium wp-image-38124" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3814-225x300.jpeg 225w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3814-768x1024.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3814-1152x1536.jpeg 1152w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3814-1536x2048.jpeg 1536w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a></p>
<p>From the train, there is a great view of the Bosphorus and the city and last minute chance to finish my book.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/img_9379/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9379-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9379-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9379-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/img_3828/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3828-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3828-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3828-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/img_3830/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3830-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3830-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_3830-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>Our overnight train took us into Istanbul and 2 stops on the Metro brought us to Sirkeci Station, traditional terminus for the Orient Express and less than 100 yards from the Bosphorus (note cat sleeping on car roof behind me).</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/12/station-scaled.jpg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/12/station-225x300.jpg" alt="" width="225" height="300" class="aligncenter size-medium wp-image-38128" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/station-225x300.jpg 225w, https://blog.idrsolutions.com/app/uploads/2025/12/station-768x1024.jpg 768w, https://blog.idrsolutions.com/app/uploads/2025/12/station-1152x1536.jpg 1152w, https://blog.idrsolutions.com/app/uploads/2025/12/station-1536x2048.jpg 1536w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a></p>
<p>It&#8217;s an emotional moment and a huge sense of accomplishment! Our hotel is just 50 yards up a side street and there is a selection of cats to welcome us to their city and our home for the next 5 nights.</p>
<h2>Reflections on &#8216;Riding the Orient Express&#8217;</h2>
<p>It has definitely been a very different type of trip to flying to Turkey. The whole journey has been surprisingly straight-forward but did involve more organisation and planning. </p>
<p>I am not sure you would choose between flying OR taking the train. The experiences are so different that your motivations would be very different. I can tell you that if you choose to take the train:-</p>
<ul>
<li>You will need a more relaxed frame of mind</li>
<li>It will cost more in cash and time and less in CO2 emissions.</li>
<li>You will have an adventure, not a trip</li>
<li>There will be the opportunity to see so much more of Europe</li>
</ul>
<p>So I think it really comes down to whether this is a trip or a journey for you&#8230;</p>
<h2>Some tips if you decide to try the train</h2>
<p>There is lots of useful information online to help you and here is my contribution for you </p>
<ul>
<li>Do you homework. There are lots of useful online resources, including <a href="https://www.seat61.com/">the Man in Seat 61</a>. If you do not feel up to it, there are agents who will plan it all for you.</li>
<li>You have total freedom so tailor the trip. If you want extra days in a city, it&#8217;s not a problem.</li>
<li>Always use common sense.</li>
<li>We found the trip generally safe but keep your valuables hidden on you</li>
<li>And lastly, always pack at least one &#8216;Gen Z&#8217; for the trip. Drop them in any random city and within a couple of minutes they will have decoded the local transport system and bought some tickets online</li>
</ul>
<p>Thanks for joining us on our trip and whether you ever do it literally, or just joined us in spirit, always enjoy the ride&#8230;. </p>
<h2>Share the whole Orient Express journey</h2>
<p>This is part of a series of articles covering our journey from London to Istanbul by train. The whole set is:-</p>
<ol>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/">Part 1 &#8211; The plan</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">Part 2 &#8211; Travelling to Prague</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">Part 3 &#8211; Onwards to Budapest</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">Part 4 &#8211; Bucharest, an unlikely holiday destination</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">Part 5 &#8211; Crossing Bulgaria</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/">Part 6 &#8211; Completing the Orient Express</a></li>
</ol>
<h2>Share the whole Orient Express journey</h2>
<p>This is part of a series of articles covering our journey from London to Istanbul by train. The whole set is:-</p>
<ol>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/">Part 1 &#8211; The plan</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">Part 2 &#8211; Travelling to Prague</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">Part 3 &#8211; Onwards to Budapest</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">Part 4 &#8211; Bucharest, an unlikely holiday destination</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">Part 5 &#8211; Crossing Bulgaria</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/">Part 6 &#8211; Completing the Orient Express</a></li>
</ol>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/">Travelling to Istanbul by train for DevFest conference – Part 6 Completing the Orient Express</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Travelling to Istanbul by train for DevFest conference – Part 5 Crossing Bulgaria</title>
		<link>https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/</link>
		
		<dc:creator><![CDATA[Mark Stephens]]></dc:creator>
		<pubDate>Tue, 02 Dec 2025 18:10:03 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38045</guid>

					<description><![CDATA[<p>After the (now unusual) experience of a night in one place, we were in Ted&#8217;s Coffee for 9.30am to collect our tickets for tonight&#8217;s Sophia Express. Mark was there early to hand them over and we had a good chat about life in Romania and how it compared with the UK. So far we have [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">Travelling to Istanbul by train for DevFest conference – Part 5 Crossing Bulgaria</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>After the (now unusual) experience of <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">a night in one place</a>, we were in Ted&#8217;s Coffee for 9.30am to collect our tickets for tonight&#8217;s Sophia Express. Mark was there early to hand them over and we had a good chat about life in Romania and how it compared with the UK.</p>
<p>So far we have taken 4 trains to cross Europe. This time of year, there is no direct train from Bucharest to Istanbul so we have 4 small day trains to take us to across the country for our final overnight train from <a href="https://en.wikipedia.org/wiki/Dimitrovgrad,_Bulgaria">Dimitrovgrad</a>. It&#8217;s a chance to catch up on work, do some reading, or simply watch the world go by.</p>
<h2>Bulgarian trains</h2>
<p>These are day trains so back to seats and carriages. Our first train had open compartments and then we have separate compartments. You will note the colourful exteriors!</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9340/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9340-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9340-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9340-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9356/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9356-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9356-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9356-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9347/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9347-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9347-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9347-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<h2>The stations</h2>
<p>We have stops at Russe, Gorna Orjahovica and Dimitrovgrad with time at each to grab some food and a drink. The stations are not as grand as previous ones and have much smaller Christmas trees. They still have a Soviet feel to them in my opinion.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9336/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9336-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9336-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9336-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9331/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9331-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9331-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9331-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9334/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9334-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9334-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9334-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9350/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9350-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9350-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9350-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9345/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9345-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9345-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9345-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9348/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9348-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9348-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9348-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<h2>The Views</h2>
<p>Green, rural, flat would be my summary in 3 words. We did have one major Geographical feature (and it&#8217;s a big one) when we crossed the River Danube.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9343/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9343-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9343-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9343-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9317/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9317-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9317-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9317-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9329-2/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9329-2-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9329-2-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9329-2-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<h2>New friends</h2>
<p>It seems to be a legal requirement for Bulgarian stations to have a cat at each station! They are clearly very much in charge and graciously allow us to make temporary use of their stations.<br />

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9353/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9353-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9353-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9353-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9354/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9354-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9354-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9354-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
</p>
<h2>Language challenges</h2>
<p>The Bulgarians use a different alphabet. Luckily I am able to resolve some difficult translation issues with some sign language and help from a local!</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9355/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9355-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9355-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9355-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/img_9349/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9349-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9349-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9349-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<h2>The last leg</h2>
<p>We will finish with our final overnight train which leaves at 11pm to take us into Turkey and Istanbul. Last task before turning in is to switch our phones to a different SIM for Turkey. And we will be woken up for a late night passport check on the border.</p>
<p>So join us tomorrow for <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/">the final instalment</a> as we complete the trip and arrive in Istanbul. We will review how the journey went and offer some advice for next time.</p>
<h2>Share the whole Orient Express journey</h2>
<p>This is part of a series of articles covering our journey from London to Istanbul by train. The whole set is:-</p>
<ol>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/">Part 1 &#8211; The plan</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">Part 2 &#8211; Travelling to Prague</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">Part 3 &#8211; Onwards to Budapest</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">Part 4 &#8211; Bucharest, an unlikely holiday destination</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">Part 5 &#8211; Crossing Bulgaria</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/">Part 6 &#8211; Completing the Orient Express</a></li>
</ol>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">Travelling to Istanbul by train for DevFest conference – Part 5 Crossing Bulgaria</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Travelling to Istanbul by train for DevFest conference – Part 4 Bucharest &#8211; an unlikely holiday destination</title>
		<link>https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/</link>
		
		<dc:creator><![CDATA[Mark Stephens]]></dc:creator>
		<pubDate>Mon, 01 Dec 2025 19:27:06 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=38013</guid>

					<description><![CDATA[<p>After enjoying our free drink in the Premium lounge at Budapest, we boarded the 7.05pm overnight train to Bucharest. Through Transylvania and the Carpathians This time it is a 3-person couchette with our own sink and a reassuring solid wooden door. I noted the doors are also locked at both ends of the carriage and [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">Travelling to Istanbul by train for DevFest conference – Part 4 Bucharest &#8211; an unlikely holiday destination</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>After <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">enjoying our free drink</a> in the Premium lounge at Budapest, we boarded the 7.05pm overnight train to Bucharest.</p>
<h2>Through Transylvania and the Carpathians</h2>
<p>This time it is a 3-person couchette with our own sink and a reassuring solid wooden door. I noted the doors are also locked at both ends of the carriage and we have our own guard.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9168/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9168-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="3-bed courchette" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9168-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9168-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9167/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9167-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="Romanian train" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9167-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9167-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>The beds are the most spacious and comfortable and we get a duvet, not sheets, but it was also the bumpiest ride. Our train does not get in until 11.35am so we get some stunning views of the Carpathians in the morning.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9172/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9172-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9172-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9172-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9171/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9171-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9171-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9171-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9170/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9170-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9170-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9170-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<h2>Exploring Bucharest</h2>
<p>The City of Bucharest may not be the first place that comes to mind as a top holiday destination but there is plenty to see and do here. Our first stop is to drop our bags at the hotel &#8211; you need to stay a night as the trains do not overlap. Then into town&#8230;</p>
<p>For lunch we found a place recommended online which turned out to be grander than we had anticipated but very nice. The food was very tasty and they were very friendly.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9196/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9196-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9196-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9196-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9190/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9190-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9190-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9190-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9194/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9194-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9194-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9194-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>Afterwards, we headed to Constitution Square where you can see the <a href="https://en.wikipedia.org/wiki/Palace_of_the_Parliament">Palace of the Parliament</a> (the World&#8217;s heaviest building). In the square we found the nicest Christmas market yet &#8211; not too crowded and a wide range of genuine gifts as well as food and drink.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9213/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9213-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9213-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9213-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9211/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9211-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9211-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9211-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9212/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9212-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9212-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9212-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>Our next stop was the old town to enjoy the sights. Be careful as the cobbled streets are very uneven. If you get cold, there are plenty of places to get a hot drink and warm up.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9217/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9217-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9217-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9217-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9220/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9220-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9220-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9220-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9216/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9216-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9216-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9216-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>Dinner was some traditional Romanian food in a warm cellar &#8211; another online recommendation.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9286-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9286-300x225.jpeg" alt="" width="300" height="225" class="aligncenter size-medium wp-image-38030" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9286-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9286-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9286-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9286-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9286-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>December 1st is Romania&#8217;s Great Union Day so there were lots of flags, buildings were lit up and we saw the start of the military torchlit procession in the evening. With all the Christmas lights as well, the city was very bright and cheery.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9288-2/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9288-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9288-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9288-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9299/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9299-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9299-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9299-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/img_9305/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9305-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9305-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9305-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<h2>A night off from the trains</h2>
<p>Tonight will be spent in a hotel &#8211; it will seem strange to wake up in the same place we went to sleep! </p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9180-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9180-300x225.jpeg" alt="" width="300" height="225" class="aligncenter size-medium wp-image-38031" srcset="https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9180-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9180-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9180-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9180-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/12/IMG_9180-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Tomorrow will be meeting our agent Mark at 9.30am to pick up our tickets for the Sofia Express (you cannot buy these online) and the rest of the day spent on Bulgarian trains including the overnight one to <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">take us into Istanbul</a> on Wednesday morning. </p>
<h2>Share the whole Orient Express journey</h2>
<p>This is part of a series of articles covering our journey from London to Istanbul by train. The whole set is:-</p>
<ol>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/">Part 1 &#8211; The plan</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">Part 2 &#8211; Travelling to Prague</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">Part 3 &#8211; Onwards to Budapest</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">Part 4 &#8211; Bucharest, an unlikely holiday destination</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">Part 5 &#8211; Crossing Bulgaria</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/">Part 6 &#8211; Completing the Orient Express</a></li>
</ol>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">Travelling to Istanbul by train for DevFest conference – Part 4 Bucharest &#8211; an unlikely holiday destination</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Travelling to Istanbul by train for DevFest conference – Part 3 onwards to Budapest</title>
		<link>https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/</link>
		
		<dc:creator><![CDATA[Mark Stephens]]></dc:creator>
		<pubDate>Sun, 30 Nov 2025 19:12:27 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37976</guid>

					<description><![CDATA[<p>Another day another night train. After a full day in Prague, it&#8217;s time for another night train&#8230;. Journey to Budapest Tonight it&#8217;s a six berth sleeper run by Czech trains. This time we have a companion as far as Bratislava &#8211; a cheerful man returning home from a fish conference. Unlike the previous night, we [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">Travelling to Istanbul by train for DevFest conference – Part 3 onwards to Budapest</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Another day another night train. After a <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">full day in Prague</a>, it&#8217;s time for another night train&#8230;.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9077-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9077-300x225.jpeg" alt="Czech sleeper train" width="300" height="225" class="aligncenter size-medium wp-image-37983" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9077-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9077-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9077-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9077-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9077-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<h2>Journey to Budapest</h2>
<p>Tonight it&#8217;s a six berth sleeper run by Czech trains. This time we have a companion as far as Bratislava &#8211; a cheerful man returning home from a fish conference.</p>
<p>Unlike the previous night, we cannot open the windows but the heating controls work better and the carriage is cooler.</p>
<p>The ticket Inspector advises us to lock our door as there have been a spate of thefts on the trains. Indeed, someone with a torch does try our (very) securely locked door at 3am! </p>
<p>We wake up to find our train following the Danube and arrive in Budapest at 8.30am today. </p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9082-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9082-300x225.jpeg" alt="Danube" width="300" height="225" class="aligncenter size-medium wp-image-37984" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9082-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9082-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9082-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9082-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9082-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Our evening train departs from a different station so our first task is to drop the luggage there and have breakfast before we head into town.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9089-4/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9089-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9089-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9089-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9163/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9163-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9163-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9163-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<h2>Sight seeing in Budapest</h2>
<p>First stop is the parliament building and a first view of the Danube. It looks impressive in pictures and even more so in real life. Budapest is really 2 cities in one with Buda on one side of the river, and Pest the other side. </p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9092/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9092-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9092-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9092-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9110/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9110-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9110-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9110-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9093/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9093-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9093-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9093-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>You can cross over the chain bridge and walk up the hill to the National gallery and Castle. There are stunning views of the city from here. We spend the morning exploring and also visit The Fisherman&#8217;s Bastion. We find a cosy bagel shop in the old town for lunch.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9107/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9107-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9107-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9107-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9115/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9115-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9115-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9115-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9119/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9119-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9119-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9119-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9116/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9116-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9116-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9116-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9128/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9128-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9128-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9128-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9125/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9125-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9125-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9125-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>After lunch, it is time to cross back over the Chain bridge back into Pest and stroll through the Christmas markets to St. Stephen&#8217;s Basilica. This is a beautiful Catholic church &#8211; light a candle to remember someone special.</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9140/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9140-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9140-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9140-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9142/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9142-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9142-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9142-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9138/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9138-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9138-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9138-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9136/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9136-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9136-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9136-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9135/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9135-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9135-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9135-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9137/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9137-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9137-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9137-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>You are probably feeling it would be nice to refeshen up after all this activity, and the <a href="https://www.szechenyibath.hu/">Széchenyi Thermal Baths</a> is just the place! This is a whole complex of indoor and outdoor pools ranging from 19-38 Celcius and several dry and wet saunas. We spent a very relaxed few hours trying them all. </p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9148/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9148-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9148-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9148-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/img_9147/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9147-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9147-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9147-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>Then there is time for dinner and back to the station for our 7pm train to Bucharest. </p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9164-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9164-300x225.jpeg" alt="timetable" width="300" height="225" class="aligncenter size-medium wp-image-38004" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9164-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9164-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9164-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9164-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9164-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Pro tip from <a href="https://www.seat61.com/" target="_blank">Man in Seat 61</a> is that your sleeper ticket gives you free access to the warm Premium lounge with free drink and food.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9166-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9166-300x225.jpeg" alt="lounge" width="300" height="225" class="aligncenter size-medium wp-image-38017" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9166-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9166-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9166-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9166-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9166-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>I hope you enjoyed our all too brief stay in this amazing city and we will meet you next in <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">Bucharest</a>&#8230;</p>
<h2>Share the whole Orient Express journey</h2>
<p>This is part of a series of articles covering our journey from London to Istanbul by train. The whole set is:-</p>
<ol>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/">Part 1 &#8211; The plan</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">Part 2 &#8211; Travelling to Prague</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">Part 3 &#8211; Onwards to Budapest</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">Part 4 &#8211; Bucharest, an unlikely holiday destination</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">Part 5 &#8211; Crossing Bulgaria</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/">Part 6 &#8211; Completing the Orient Express</a></li>
</ol>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">Travelling to Istanbul by train for DevFest conference – Part 3 onwards to Budapest</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Travelling to Istanbul by train for DevFest conference &#8211; Part 2 Travelling to Prague</title>
		<link>https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/</link>
		
		<dc:creator><![CDATA[Mark Stephens]]></dc:creator>
		<pubDate>Sat, 29 Nov 2025 20:44:49 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37942</guid>

					<description><![CDATA[<p>Welcome to Prague &#8211; I am glad you could make it after all that planning. Let&#8217;s catch-up on the trip so far&#8230; Getting to Brussels The most stressful part of the journey was the taxi to the station &#8211; everyone wanted to drive through Tonbridge today. We managed to catch our backup train but it [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">Travelling to Istanbul by train for DevFest conference &#8211; Part 2 Travelling to Prague</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Welcome to Prague &#8211; I am glad you could make it after <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/">all that planning</a>. Let&#8217;s catch-up on the trip so far&#8230;</p>
<h2>Getting to Brussels</h2>
<p>The most stressful part of the journey was the taxi to the station &#8211; everyone wanted to drive through Tonbridge today. We managed to catch our backup train but it was too close for comfort.</p>
<p>We took a local train to London where we picked up the EuroStar from a very busy St. Pancras. We thought it was Friday traffic but the staff said it was like this most days in November and December with the holiday season. </p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_8970/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8970-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="Eurostar" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8970-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8970-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_8971/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8971-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="Eurostar" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8971-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8971-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>The EuroStar was on time but none of us could get the wifi to work. So time to grab a coffee, and catch-up on some reading or sleep before we arrive at Brussels for a coffee and pick up the overnight train.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8977-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8977-300x225.jpeg" alt="train on time" width="300" height="225" class="aligncenter size-medium wp-image-37946" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8977-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8977-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8977-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8977-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8977-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<h2>The European Sleeper</h2>
<p>The Night Train takes us all the way to Prague via Rotterdam, Berlin, and Dresden.</p>
<p>It&#8217;s not the most modern train but it more than makes up for this in character and it&#8217;s warm and friendly. </p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_8981/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8981-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="Eurosleepr train" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8981-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8981-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_8982/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8982-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="Eurosleepr train inside" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8982-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8982-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_8983-2/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8983-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="Eurosleepr train carriage" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8983-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_8983-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>There is no buffet car but you can order food and drink on your phone which is brought to your carriage. I was surprised at the broad range of travellers &#8211; students, families, retirees.</p>
<p>There is no wifi but I had a strong phone signal and a steady stream of notifications from Vodafone marked the passage across borders.</p>
<p>Our carriage has 2 seats and converts into 5 beds for sleeping with fold down bunks &#8211; I think it would be a little crowded if you had 5 people in here! The type of people who take the trip are considerate and friendly.</p>
<p>There was a little noise with some young children getting off at Berlin (6.20am) but I slept really well.  Blankets and sheets are provided. </p>
<p>We ordered some coffees and ate breakfast watching the world roll by outside including a stretch following the Elbe. We arrived in Prague 30 minutes behind schedule.</p>
<p>The night train has the lowest priority on railways and both trips I have taken have arrived later. So don&#8217;t rely on a tight connection after the Night Train.</p>
<h2>Welcome to Prague</h2>
<p>Your first destination at Prague station is the left luggage lockers to deposit surplus bags. This needs a phone for pin verification to open the lockers.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9005-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9005-225x300.jpeg" alt="lockers at Prague" width="225" height="300" class="aligncenter size-medium wp-image-37960" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9005-225x300.jpeg 225w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9005-768x1024.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9005-1152x1536.jpeg 1152w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9005-1536x2048.jpeg 1536w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a></p>
<p>Then it is into Prague. The city is very walkable but there are trams if you prefer. It is cold so make sure you are dressed up warm. </p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3485-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3485-225x300.jpeg" alt="dress warm" width="225" height="300" class="aligncenter size-medium wp-image-37961" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3485-225x300.jpeg 225w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3485-768x1024.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3485-1152x1536.jpeg 1152w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3485-1536x2048.jpeg 1536w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a></p>
<p>If you do get cold, there are lots of bars and stands at the Christmas markets selling hot drinks. There are lots of Tourists here for the Christmas experience.</p>
<p>Prague is a treasure trove of cobbled streets and we have the markets and lights to see and even an ice skating rink. There are inviting smells everywhere&#8230; </p>
<p>We walked to Wenceslas Square before heading off to explore the Old Town and the Christmas markets. Make sure you are in the main square for 3pm when the Astronomical clock strikes.</p>
<p>There are lots of concerts and events being advertised. We walked into St. Nicholas&#8217;s church which was hosting multiple performing choirs from across Europe.</p>
<p>We also walked across the Charles bridge and explored the grounds of the Castle. There is also an excellent view from there of the city. There is no shortage of places to Warm up and sample the local Czech food and cakes.</p>
<p>Here is a sample of the places we saw&#8230;</p>

<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_9011/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9011-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9011-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9011-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_9013/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9013-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9013-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9013-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_9015/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9015-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9015-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9015-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_9016/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9016-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9016-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9016-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_9025/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9025-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9025-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9025-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_9026/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9026-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9026-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9026-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_9030/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9030-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9030-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9030-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_9069/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9069-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9069-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9069-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/img_9071/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9071-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9071-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9071-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>

<p>At the end of the trip we found a beer bar called Valhalla where we sampled several Czech beers and played cards until it was time to return to the station.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9073-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9073-225x300.jpeg" alt="cheers" width="225" height="300" class="aligncenter size-medium wp-image-37962" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9073-225x300.jpeg 225w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9073-768x1024.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9073-1152x1536.jpeg 1152w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9073-1536x2048.jpeg 1536w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a></p>
<p>Finally we caught our overnight train to Budapest where <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">we will next see you</a>.</p>
<h2>Share the whole Orient Express journey</h2>
<p>This is part of a series of articles covering our journey from London to Istanbul by train. The whole set is:-</p>
<ol>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/">Part 1 &#8211; The plan</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">Part 2 &#8211; Travelling to Prague</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">Part 3 &#8211; Onwards to Budapest</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">Part 4 &#8211; Bucharest, an unlikely holiday destination</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">Part 5 &#8211; Crossing Bulgaria</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/">Part 6 &#8211; Completing the Orient Express</a></li>
</ol>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">Travelling to Istanbul by train for DevFest conference &#8211; Part 2 Travelling to Prague</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Travelling to Istanbul by train for DevFest conference &#8211; Part 1 the plan</title>
		<link>https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/</link>
		
		<dc:creator><![CDATA[Mark Stephens]]></dc:creator>
		<pubDate>Fri, 28 Nov 2025 06:38:19 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37830</guid>

					<description><![CDATA[<p>This year, we decided to do something special by taking the train rather than flying to attend the DevFest conference in Istanbul. So join us on this 2,000-mile rail adventure across Europe as we follow the legendary Orient Express route&#8230; Why take the train? Our train journey is around 2,000 miles and will be taking [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/">Travelling to Istanbul by train for DevFest conference &#8211; Part 1 the plan</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/Orient_Express_Spoorwegmuseum-scaled.jpg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/Orient_Express_Spoorwegmuseum-300x225.jpg" alt="orient express" width="300" height="225" class="aligncenter size-medium wp-image-37838" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/Orient_Express_Spoorwegmuseum-300x225.jpg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/Orient_Express_Spoorwegmuseum-1024x768.jpg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/Orient_Express_Spoorwegmuseum-768x576.jpg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/Orient_Express_Spoorwegmuseum-1536x1152.jpg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/Orient_Express_Spoorwegmuseum-2048x1536.jpg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><br />
This year, we decided to do something special by taking the train rather than flying to attend the <a href="https://devfest.istanbul/" target="_blank">DevFest</a> conference in Istanbul. So join us on this 2,000-mile rail adventure across Europe as we follow the legendary <a href="https://en.wikipedia.org/wiki/Orient_Express" target="_blank">Orient Express</a> route&#8230;</p>
<h2>Why take the train?</h2>
<p>Our train journey is around 2,000 miles and will be taking us 5 days. If you flew the journey would take less than a day. It would produce at least twice the pollution. </p>
<p>You would also miss out on the chance to see some of Europe&#8217;s most beautiful cities (all decorated for Christmas) and to watch Europe out of the window. We are trading speed and some convenience for less pollution and an adventure rather than just a journey.</p>
<h2>How hard was booking?</h2>
<p>There are <a href="https://www.byway.travel/destination/europe/europe-by-train" target="_blank">travel agents</a> who will book the trip for you and take care of all the details. </p>
<p>Booking a train yourself is definitely more complex than the flying option. Luckily there are lots of resources to help you including the excellent <a href="https://www.seat61.com/" target="_blank">Man In Seat 61</a> website. </p>
<p>We are travelling second class for the journey as generally there did not seem a great benefit to the extra cost of first class. There is an interrail pass which you can purchase but it does not cover all the trains. We priced it up and discounts we gained did not cover the cost in this instance.</p>
<p>For the overnight trains there are a whole host of options ranging from a seat, a bed in a shared compartment or your own private carriage. As there are 3 of us travelling together, it was cheapest to book a cabin and we get more space. If you are a woman travelling on her own, all the train services offer the option of female only cabins.</p>
<p>We found the whole process very straightforward although the <a href="https://en.wikipedia.org/wiki/Bosphorus_Express" target="_blank">Romanian trains</a> require you to use a travel agent or intermediary and collect your tickets when you arrive in Romania (🤞). </p>
<p>On a trip like this, you can set the budget and the time to suit you. So if you want a week in one city on the way, it is easy to adapt your plans.</p>
<h2>What if I miss a connection?</h2>
<p>The biggest fear most people have with a trip like this is that they will miss a train because of a delay or cancellation. No form of travel is immune to this (you may be sitting on a comfortable train reading about an IT meltdown at Heathrow grounding all flights).</p>
<p>If we miss a train, we have some fallback plans (later trains) and worst-case scenario, we have to spend some extra time in a city. The key is to allow time in your schedule so a delay is not a disaster. </p>
<h2>Our itinerary</h2>
<p>There is no direct train service so we are going to be taking multiple trains, following one of the traditional routes of the Orient Express. We will have some time for site-seeing on the way. Here&#8217;s the summary plan:-</p>
<ol>
<li>Trains to London St. Pancras, where we pick up the <a href="https://www.eurostar.com/uk-en" target="_blank">Eurostar</a> to Brussels and then the <a href="https://www.europeansleeper.eu/" target="_blank">Eurosleeper</a> to Prague. We  will have a day to look around.
</li>
<li>Overnight train from Prague to Budapest with a day in the former imperial capital.
</li>
<li>Overnight train from Budapest to Bucharest. Due to timing we will be spending the night in the city
</li>
<li>Trains through Romania and Bulgaria, taking the overnight Sophia express and arriving next morning in Istanbul.
</li>
</ol>
<h2>Your Essential Packing List</h2>
<p>Beds and sheets are provided on the overnight parts. If you need to work or communicate, all the trains have wifi and there is a buffet car for hot drinks and snacks. Remember your EU socket for the plugs and bring a light bag for our city exploration (we can leave the luggage at the station).</p>
<p>Stunning views from the trains are included as standard in this trip and you will probably spend most of your time looking out the window as we travel across Europe and through the Balkans. I am especially looking forward to my first ride through the <a href="https://en.wikipedia.org/wiki/Carpathian_Mountains" target="_blank">Carpathians</a>. So remember your camera!</p>
<p>The European Sleeper sells a deck of cards on the train which is a great way to pass the time and get to make some new friends.</p>
<p>Turkey was not one of the 51 destinations included in my Vodaphone mobile package so I purchased a virtual SIMM to use while there.</p>
<p>It may be cold so remember to bring some warm clothes and your hat and gloves.</p>
<h2>Essential reading for the train</h2>
<p>You will probably want to bring some appropriate listening or reading material for the journey &#8211; I have packed the 2 iconic books <strong>Murder on the Orient Express</strong> and <strong>Stamboul Train</strong>. The more adventurous may prefer some <a href="https://en.wikipedia.org/wiki/Count_Dracula" target="_blank">Bram Stoker</a> or prepare for our destination with anything by <a href="https://en.wikipedia.org/wiki/Orhan_Pamuk" target="_blank">Orhan Pamuk</a>.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/books-scaled.jpg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/books-300x205.jpg" alt="Some books to read on the train" width="300" height="205" class="aligncenter size-medium wp-image-37698" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/books-300x205.jpg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/books-1024x698.jpg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/books-768x524.jpg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/books-1536x1047.jpg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/books-2048x1396.jpg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a> </p>
<h2>What should we expect in the cities?</h2>
<p>We have hit the jackpot on our stops as the European Christmas markets start this weekend. In Prague we should be able to visit the Castle, look round Wenceslas and Old Square, stroll across Charles Bridge and see the Christmas Tree Lighting ceremony. </p>
<p>In Budapest we&#8217;ll have time to stroll around both sides of the city, visit St. Stephen&#8217;s Basilica and maybe freshen up at the <a href="https://www.szechenyibath.hu/">Széchenyi Thermal Baths</a>. Remember to bring your swimming costume.</p>
<p>We will arrive in Bucharest for <a href="https://en.wikipedia.org/wiki/Great_Union_Day" target="_blank">Great Union Day</a>, which is the country&#8217;s National Holiday. So there will be lots of parades, events and yet more Christmas Markets! There is a torchlight parade at 7pm.</p>
<h2>Sit back and enjoy the ride</h2>
<p>We are now ready to set off, so get comfortable, order a drink from the buffet car and watch the world fly by our window. See you in <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">Part 2</a> where we will update you on the first leg of the trip and show you around Prague&#8230;</p>
<h2>Share the whole Orient Express journey</h2>
<p>This is part of a series of articles covering our journey from London to Istanbul by train. The whole set is:-</p>
<ol>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/">Part 1 &#8211; The plan</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-2-travelling-to-prague/">Part 2 &#8211; Travelling to Prague</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-3-onwards-to-budapest/">Part 3 &#8211; Onwards to Budapest</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-4-bucharest/">Part 4 &#8211; Bucharest, an unlikely holiday destination</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-5-crossing-bulgaria/">Part 5 &#8211; Crossing Bulgaria</a></li>
<li><a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-6-completing-the-orient-express/">Part 6 &#8211; Completing the Orient Express</a></li>
</ol>
<p>The post <a href="https://blog.idrsolutions.com/travelling-to-istanbul-by-train-for-devfest-conference-part-1-the-plan/">Travelling to Istanbul by train for DevFest conference &#8211; Part 1 the plan</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to add AI to the JPedal Viewer (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-add-ai-to-the-jpedal-viewer/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Thu, 27 Nov 2025 14:21:28 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[bard]]></category>
		<category><![CDATA[chat bot]]></category>
		<category><![CDATA[chat window]]></category>
		<category><![CDATA[chatgpt]]></category>
		<category><![CDATA[claude]]></category>
		<category><![CDATA[extensions]]></category>
		<category><![CDATA[gemini]]></category>
		<category><![CDATA[grok]]></category>
		<category><![CDATA[llama]]></category>
		<category><![CDATA[llm]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[openai]]></category>
		<category><![CDATA[pdfgpt]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37824</guid>

					<description><![CDATA[<p>The JPedal Viewer is the best Java PDF Viewer because it so easily customizable. JPedal provides access to the underlying Swing components which allows you to extend it with custom behaviour and additional UI elements. In this tutorial, I am going to show you how to add a chat window to the Viewer which allows [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-add-ai-to-the-jpedal-viewer/">How to add AI to the JPedal Viewer (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The <a href="https://www.idrsolutions.com/jpedal/java-pdf-viewer" target="_blank">JPedal Viewer</a> is the best Java PDF Viewer because it so easily customizable.</p>
<p>JPedal provides access to the underlying Swing components which allows you to extend it with custom behaviour and additional UI elements.</p>
<p>In this tutorial, I am going to show you how to add a chat window to the Viewer which allows users to ask a large language model questions about the document they have open.</p>
<p><a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">Download a JPedal trial jar</a> to try this yourself!</p>
<p>First we need to make a chat window that can be embedded in the Viewer. I won&#8217;t write the complete source code here because it is a couple hundred lines long, but you can find the full class <a href="https://github.com/idrsolutions/pdf-ai-chat/blob/main/src/main/java/com/idrsolutions/examples/ChatPanel.java" target="_blank">here</a>.</p>
<p>The important part is that we need some kind of callback to receive the messages the user sends.</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>public class ChatPanel extends JPanel {

<br />    private transient Consumer<String> sendHandler;

<br />    &#8230;

<br />    private void sendCurrentText() {<br />
        addMessage(text, true);

<br />        if (sendHandler != null) {<br />
            try {<br />
                sendHandler.accept(text);<br />
            } catch (Exception ex) {<br />
                LogWriter.warning(ex, &quot;Exception sending message: &quot; + ex.getMessage());<br />
            }<br />
        }<br />
    }

<br />}<br />
</code></pre>
<p>Now we can add this to JPedal by getting a handle to the JTabbedPane which represents the side bar in the Viewer.</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>final Viewer viewer = new Viewer();<br />
viewer.setupViewer();

<br />final ChatPanel chatPanel = new ChatPanel();

<br />final JTabbedPane sideTabBar = viewer.getSwingGUI().getSideTabBar();<br />
sideTabBar.addTab(&quot;AI&quot;, new ImageIcon(), chatPanel);<br />
</code></pre>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-26-at-12.28.58-scaled.png"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-26-at-12.28.58-scaled.png" alt="AI chat window" width="2672" height="1465" class="aligncenter size-full wp-image-37883" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-26-at-12.28.58-scaled.png 2672w, https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-26-at-12.28.58-300x164.png 300w, https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-26-at-12.28.58-1024x561.png 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-26-at-12.28.58-768x421.png 768w, https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-26-at-12.28.58-1536x842.png 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-26-at-12.28.58-2048x1123.png 2048w" sizes="auto, (max-width: 2672px) 100vw, 2672px" /></a></p>
<p>The chat window works, but it does not do anything yet so we need to add the AI capabilities.</p>
<p>Again, I won&#8217;t give the full code here (you can see it <a href="https://github.com/idrsolutions/pdf-ai-chat" target="_blank">on our GitHub</a>), but essentially we can use the callback from the chat window and pass that to the AI, along with the context from the PDF.</p>
<p>In this example, I show how to provide the text extracted from the document, and also an image of the page which some AIs may be able to use for OCR.</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>chatPanel.setSendHandler(userMessage -> new Thread(() -> {<br />
        try {<br />
            final PdfDecoderInt pdfDecoder = viewer.getPdfDecoder();<br />
            final int pageNum = viewer.getSwingGUI().getValues().getCurrentPage();

<br />            // Get the text from the current page<br />
            final PdfPageData pageData = pdfDecoder.getPdfPageData();<br />
            final String pageText = pdfDecoder.getGroupingObject().extractTextInRectangle(<br />
                    pageData.getMediaBoxX(pageNum),<br />
                    pageData.getMediaBoxY(pageNum),<br />
                    pageData.getMediaBoxWidth(pageNum),<br />
                    pageData.getMediaBoxHeight(pageNum),<br />
                    pageNum,<br />
                    false, false);

<br />            // Get the image of the current page<br />
            final BufferedImage pageImage = pdfDecoder.getPageAsImage(pageNum);

<br />            final Optional<String> response = gpt.ask(userMessage, pageText, pageImage);<br />
            chatPanel.addMessage(response.orElse(&quot;&quot;), false);<br />
        } catch (Exception ex) {<br />
            chatPanel.addMessage(&quot;Error: &quot; + ex.getMessage(), false);<br />
        }<br />
}).start());<br />
</code></pre>
<p>Here is the final result!</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-27-at-14.10.47-scaled.png"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-27-at-14.10.47-scaled.png" alt="JPedal AI chat" width="2672" height="1465" class="aligncenter size-full wp-image-37901" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-27-at-14.10.47-scaled.png 2672w, https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-27-at-14.10.47-300x164.png 300w, https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-27-at-14.10.47-1024x561.png 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-27-at-14.10.47-768x421.png 768w, https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-27-at-14.10.47-1536x842.png 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/Screenshot-2025-11-27-at-14.10.47-2048x1123.png 2048w" sizes="auto, (max-width: 2672px) 100vw, 2672px" /></a></p>
<h2>Resources</h2>
<p>You can <a href="https://github.com/idrsolutions/pdf-ai-chat" target="_blank">find all the source code on our GitHub page</a>.</p>
<p>Find out <a href="https://blog.idrsolutions.com/category/jpedal/" target="_blank">what else you can do with JPedal</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-add-ai-to-the-jpedal-viewer/">How to add AI to the JPedal Viewer (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to convert PDF to SVG in Python (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-convert-pdf-to-svg-in-python-tutorial/</link>
		
		<dc:creator><![CDATA[Leon Atherton]]></dc:creator>
		<pubDate>Fri, 14 Nov 2025 15:19:57 +0000</pubDate>
				<category><![CDATA[BuildVu]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[converting pdf to svg in python]]></category>
		<category><![CDATA[pdf to svg]]></category>
		<category><![CDATA[pdf to svg converting]]></category>
		<category><![CDATA[python convert pdf to svg]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37789</guid>

					<description><![CDATA[<p>Introduction You can easily convert PDF files to SVG with Python using the BuildVu microservice. With this tutorial you will be able to use the BuildVu cloud API, which could be either: The IDRsolutions trial and cloud-based subscription service Or using your own self-hosted BuildVu microservice Although these services can be accessed using standard HTTP [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-convert-pdf-to-svg-in-python-tutorial/">How to convert PDF to SVG in Python (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/leon/">Leon Atherton</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p>You can easily convert PDF files to SVG with Python using the BuildVu microservice. With this tutorial you will be able to use the BuildVu cloud API, which could be either:</p>
<ul>
<li>The IDRsolutions trial and cloud-based subscription service</li>
<li>Or using your own <a href="https://github.com/idrsolutions/buildvu-microservice-example/">self-hosted BuildVu microservice</a></li>
</ul>
<p>Although these services can be accessed using standard HTTP requests, this tutorial uses our open-source <a href="https://github.com/idrsolutions/idrsolutions-python-client">Python IDRCloudClient</a>, which offers a straightforward Python wrapper for the <a href="https://github.com/idrsolutions/buildvu-microservice-example/blob/master/API.md">REST API</a>.</p>
<h2>Why SVGs are better for Python</h2>
<p>SVGs can be directly rendered in web frameworks like Flask or Django, allowing seamless integration with frontend technologies and interactive dashboards. </p>
<p>Since SVGs are text-based XML, they are simple to manipulate programmatically with Python scripts, while PDFs require more complex parsing and offer less flexibility for dynamic or interactive web content.</p>
<h2>Prerequisites</h2>
<p>You can install the <a href="https://pypi.org/project/idrcloudclient/">IDRCloudClient package</a> via pip by running the following command:</p>
<pre class='line-numbers' data-ad=BuildVu><code class='language-python'>pip install IDRCloudClient<br />
</code></pre>
<p>&nbsp;</p>
<h2>Code Example</h2>
<p>Below is a simple code example for converting PDF files to SVG. Details on configuration options and advanced features are provided afterward.<br />
<pre class='line-numbers' data-ad=BuildVu><code class='language-python'><pre>
from IDRSolutions import IDRCloudClient

client = IDRCloudClient('https://cloud.idrsolutions.com/cloud/' + IDRCloudClient.BUILDVU)

try:
    result = client.convert(
        # token='Token', # Required only when connecting to the IDRsolutions trial and cloud subscription service
        input=IDRCloudClient.UPLOAD, 
        file='/path/to/exampleFile.pdf'
    )
    outputURL = result['downloadUrl']

    client.downloadResult(result, 'path/to/output/dir')

    if outputURL is not None:
        print(&quot;Download URL: &quot; + outputURL)

except Exception as error:
    print(error)
</pre>

<br /></code></pre></p>
<p>&nbsp;</p>
<h2>Return result to a callback URL</h2>
<p>The BuildVu Microservice allows you to specify a callback URL to receive the conversion <a href="https://github.com/idrsolutions/buildvu-microservice-example/blob/master/API.md#conversion-status">status</a> after processing is finished. This approach eliminates the need to keep polling the service to check for completion. Simply include the callback URL in the parameters when calling the convert method, as shown in the following example.</p>
<pre class='line-numbers' data-ad=BuildVu><code class='language-python'><pre>
result = client.convert(
    # token='Token', # Required only when connecting to the IDRsolutions trial and cloud subscription service
    input=IDRCloudClient.UPLOAD,
    callbackUrl='http://listener.url',
    file='/path/to/exampleFile.pdf'
)
</pre>

<br /></code></pre>
<p>&nbsp;</p>
<h2>Configuration Options</h2>
<p>The BuildVu API accepts a stringified JSON object containing key value pair configuration options to customise your conversion. The settings should be provided to the convert method. A full list of the configuration options to convert PDF files to HTML or SVG can be found <a href="https://www.idrsolutions.com/docs/buildvu/settings/">here</a>.<br />
<pre class='line-numbers' data-ad=BuildVu><code class='language-python'><pre>
settings='{&quot;key&quot;:&quot;value&quot;,&quot;key&quot;:&quot;value&quot;}'
</pre>

<br /></code></pre><br />
&nbsp;</p>
<h2>Upload by URL</h2>
<p>In addition to uploading a local file, you can specify a URL for the BuildVu Microservice to fetch and convert. To do this, update the input and file parameters in the convert method as shown below.<br />
<pre class='line-numbers' data-ad=BuildVu><code class='language-python'><pre>
input=IDRCloudClient.DOWNLOAD
url='http://exampleURL/exampleFile.pdf'
</pre>

<br /></code></pre><br />
&nbsp;</p>
<h2>Using Authentication</h2>
<p>If you have set up your own BuildVu Microservice and it requires authentication for PDF to HTML or SVG conversions, you must supply your username and password with every request. This is done by passing an auth variable to the convert method, as shown below.<br />
<pre class='line-numbers' data-ad=BuildVu><code class='language-python'><pre>
auth=('username', 'password'))
</pre>

<br /></code></pre></p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-convert-pdf-to-svg-in-python-tutorial/">How to convert PDF to SVG in Python (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/leon/">Leon Atherton</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to convert PDF to SVG in Javascript (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-convert-pdf-to-svg-in-javascript-tutorial/</link>
		
		<dc:creator><![CDATA[Leon Atherton]]></dc:creator>
		<pubDate>Fri, 14 Nov 2025 15:19:50 +0000</pubDate>
				<category><![CDATA[BuildVu]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[convert pdf to svg]]></category>
		<category><![CDATA[converting pdf to svg javascript]]></category>
		<category><![CDATA[pdf to svg]]></category>
		<category><![CDATA[pdf to svg javascript]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37799</guid>

					<description><![CDATA[<p>Introduction This tutorial explains how to convert PDF files to SVG in Javascript using the hosted BuildVu Cloud API, including examples such as: The IDRsolutions trial or cloud subscription service Your own self-hosted BuildVu microservice instance Although the above services can be accessed using standard HTTP requests, this tutorial uses our open-source JavaScript IDRCloudClient, which [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-convert-pdf-to-svg-in-javascript-tutorial/">How to convert PDF to SVG in Javascript (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/leon/">Leon Atherton</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p>This tutorial explains how to convert PDF files to SVG in Javascript using the hosted BuildVu Cloud API, including examples such as:</p>
<ul>
<li>The IDRsolutions trial or cloud subscription service</li>
<li>Your own <a href="https://github.com/idrsolutions/buildvu-microservice-example/">self-hosted BuildVu microservice instance</a></li>
</ul>
<p>Although the above services can be accessed using standard HTTP requests, this tutorial uses our open-source <a href="https://github.com/idrsolutions/idrsolutions-js-client">JavaScript IDRCloudClient</a>, which offers a straightforward JavaScript wrapper for the <a href="https://github.com/idrsolutions/buildvu-microservice-example/blob/master/API.md">REST API</a>.</p>
<h2>Why SVGs Work Better with JavaScript</h2>
<p>SVGs are better for JavaScript developers than PDFs for display because SVG files are native to the web, scalable without loss of quality, and can be easily styled or animated with JavaScript and CSS. </p>
<p>Developers can embed SVG directly into HTML, customize it dynamically, and create interactive or responsive graphics, while PDFs are less flexible, mainly intended for print or document preservation and not directly manipulated in-browser. </p>
<h2>Prerequisites</h2>
<p>To add the client to your project, include the file idrcloudclient.js and add the following line to enable access to it:</p>
<pre class='line-numbers' data-ad=BuildVu><code class='language-javascript'><pre>
&lt;script src=&quot;path/to/idrcloudclient.js&quot; type=&quot;text/javascript&quot;</script>&gt;
</pre>

<br /></code></pre>
<h2>Code Example</h2>
<p>Below is a simple code example showing how to convert PDF files to SVG. Additional configuration options and advanced features are detailed later in this guide.<br />
<pre class='line-numbers' data-ad=BuildVu><code class='language-javascript'><pre>
var endpoint = 'https://cloud.idrsolutions.com/cloud/' + IDRCloudClient.BUILDVU;
var parameters =  { 
    //token: 'Token', //Required only when connecting to the IDRsolutions trial and cloud subscription service
    input: IDRCloudClient.UPLOAD,
    file: 'path/to/exampleFile.pdf'
}

function progressListener(e) {
    console.log(JSON.stringify(e));
}

function failureListener(e) {
    console.log(e);
    console.log('Failed!');
}

function successListener(e) {
    console.log(JSON.stringify(e));
    console.log('Download URL: ' + e.downloadUrl);
}

IDRCloudClient.convert({
    endpoint: endpoint,
    parameters: parameters,
    
    // The below are the available listeners
    progress: progressListener,
    success: successListener,
    failure: failureListener
});
</pre>

<br /></code></pre></p>
<p>You can find an example that uses the JavaScript client <a href="https://files.idrsolutions.com/js-trial-client/buildvu/">here</a>.</p>
<h2>Return result to a callback URL</h2>
<p>The BuildVu Microservice accepts a callback url to send the <a href="https://github.com/idrsolutions/buildvu-microservice-example/blob/master/API.md#conversion-status">status</a> of a conversion on completion. Using a callback url removes the need to poll the service to determine when the conversion is complete.</p>
<p>The callback url can be provided to the parameters variable as shown below.</p>
<pre class='line-numbers' data-ad=BuildVu><code class='language-javascript'><pre>
var parameters =  {
    //token: 'Token', //Required only when connecting to the IDRsolutions trial and cloud subscription service
    input: IDRCloudClient.UPLOAD,
    callbackUrl: 'http://listener.url',
    file: 'path/to/exampleFile.pdf'
}
</pre>

<br /></code></pre>
<h2>Configuration Options</h2>
<p>The BuildVu API accepts a stringified JSON object with key-value pair configuration options to customize your conversion. These settings should be included in the parameters array. A complete list of configuration options for converting PDF files to SVG is available <a href="https://www.idrsolutions.com/docs/buildvu/settings/">here</a>.</p>
<pre class='line-numbers' data-ad=BuildVu><code class='language-javascript'><pre>
settings: '{&quot;key&quot;:&quot;value&quot;,&quot;key&quot;:&quot;value&quot;}'
</pre>

<br /></code></pre>
<h2>Upload by URL</h2>
<p>In addition to uploading a local file, you can also provide a URL for the BuildVu Microservice to download and convert. To do this, replace the input and file values in the parameters variable with the following:<br />
<pre class='line-numbers' data-ad=BuildVu><code class='language-javascript'><pre>
input: IDRCloudClient.DOWNLOAD
url: 'http://exampleURL/exampleFile.pdf'
</pre>

<br /></code></pre></p>
<h2>Using Authentication</h2>
<p>If your deployed BuildVu Microservice requires authentication to convert PDF files to SVG, you must include a username and password with each conversion request. These credentials are passed as username and password variables to the convert method, as shown below.</p>
<pre class='line-numbers' data-ad=BuildVu><code class='language-javascript'><pre>
username: 'username',
password: 'password',
</pre>

<br /></code></pre>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-convert-pdf-to-svg-in-javascript-tutorial/">How to convert PDF to SVG in Javascript (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/leon/">Leon Atherton</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to convert PDF to SVG in C# (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-convert-pdf-to-svg-in-c-tutorial/</link>
		
		<dc:creator><![CDATA[Leon Atherton]]></dc:creator>
		<pubDate>Fri, 14 Nov 2025 15:19:43 +0000</pubDate>
				<category><![CDATA[BuildVu]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[c# converting pdf to svg]]></category>
		<category><![CDATA[convert pdf to svg c#]]></category>
		<category><![CDATA[pdf to svg convert]]></category>
		<category><![CDATA[pdf to svg in c#]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37808</guid>

					<description><![CDATA[<p>Introduction This tutorial explains how to convert PDF files to SVG in C# using the hosted BuildVu Cloud API, including examples such as: The IDRsolutions trial version or cloud subscription A self-hosted BuildVu microservice instance Although the above services can be accessed via standard HTTP requests, this tutorial uses our open-source C# IDRCloudClient, which offers [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-convert-pdf-to-svg-in-c-tutorial/">How to convert PDF to SVG in C# (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/leon/">Leon Atherton</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p>This tutorial explains how to convert PDF files to SVG in C# using the hosted BuildVu Cloud API, including examples such as:</p>
<ul>
<li>The IDRsolutions trial version or cloud subscription</li>
<li>A <a href="https://github.com/idrsolutions/buildvu-microservice-example/">self-hosted BuildVu microservice</a> instance</li>
</ul>
<p>Although the above services can be accessed via standard HTTP requests, this tutorial uses our open-source <a href="https://github.com/idrsolutions/idrsolutions-csharp-client">C# IDRCloudClient</a>, which offers an easy-to-use C# wrapper for the <a href="https://github.com/idrsolutions/buildvu-microservice-example/blob/master/API.md">REST API</a>.</p>
<h2>Prerequisites</h2>
<p>Install the <a href="https://www.nuget.org/packages/idrsolutions-csharp-client/">idrsolutions-csharp-client package</a> via NuGet using the following command:<br />
<pre class='line-numbers' data-ad=BuildVu><code class='language-c#'><pre>
nuget install idrsolutions-csharp-client
</pre>

<br /></code></pre></p>
<h2>Code Example</h2>
<p>Below is a simple code example demonstrating how to convert PDF files to SVG. Additional configuration options and advanced features are described further down.</p>
<pre class='line-numbers' data-ad=BuildVu><code class='language-c#'><pre>
using System;
using System.Collections.Generic;
using idrsolutions_csharp_client;

class ExampleUsage
{
    static void Main(string[] args)
    {
        
        var client = new IDRCloudClient(&quot;https://cloud.idrsolutions.com/cloud/&quot; + IDRCloudClient.BUILDVU);

        try
        {
            Dictionary<string, string> parameters = new Dictionary<string, string>
            { 
                //[&quot;token&quot;] = &quot;Token&quot;, //Required only when connecting to the IDRsolutions trial and cloud subscription service
                [&quot;input&quot;] = IDRCloudClient.UPLOAD,
                [&quot;file&quot;] = &quot;path/to/input.pdf&quot;
            };

            Dictionary<string, string> results = client.Convert(parameters);

            String outputUrl = results.GetValueOrDefault(&quot;downloadUrl&quot;, &quot;No download URL provided&quot;);
            
            client.DownloadResult(results, &quot;path/to/output/dir&quot;);

            Console.WriteLine(&quot;Converted: &quot; + outputUrl);
        }
        catch (Exception e)
        {
            Console.WriteLine(&quot;Conversion failed: &quot; + e.Message);
        }
    }
}
</pre>

<br /></code></pre>
<h2>Return result to a callback URL</h2>
<p>The BuildVu Microservice can accept a callback URL to report the <a href="https://github.com/idrsolutions/buildvu-microservice-example/blob/master/API.md#conversion-status">status</a> of a conversion once it is complete. Using a callback URL eliminates the need to poll the service to check when the conversion has finished. You can provide the callback URL to the convert method as shown below.</p>
<pre class='line-numbers' data-ad=BuildVu><code class='language-c#'><pre>
Dictionary<string, string> parameters = new Dictionary<string, string>
{ 
    //[&quot;token&quot;] = &quot;Token&quot;, //Required only when connecting to the IDRsolutions trial and cloud subscription service
    [&quot;callbackUrl&quot;] = &quot;http://listener.url&quot;,
    [&quot;input&quot;] = IDRCloudClient.UPLOAD,
    [&quot;file&quot;] = &quot;path/to/input.pdf&quot;
};
</pre>

<br /></code></pre>
<h2>Configuration Options</h2>
<p>The BuildVu API accepts a stringified JSON object with key-value pair configuration options to customize your conversion. These settings should be included in the parameters array. A complete list of configuration options for converting PDF files to SVG is available <a href="https://www.idrsolutions.com/docs/buildvu/settings/">here</a>.</p>
<pre class='line-numbers' data-ad=BuildVu><code class='language-c#'><pre>
[&quot;settings&quot;] = &quot;{\&quot;key\&quot;:\&quot;value\&quot;,\&quot;key\&quot;:\&quot;value\&quot;}&quot;
</pre>

<br /></code></pre>
<h2>Upload by URL</h2>
<p>In addition to uploading a local file, you can provide a URL for the BuildVu Microservice to download and convert. To do this, replace the input and file values in the parameters variable with the following.<br />
<pre class='line-numbers' data-ad=BuildVu><code class='language-c#'><pre>
[&quot;input&quot;] = IDRCloudClient.DOWNLOAD
[&quot;url&quot;] = &quot;http://exampleURL/exampleFile.pdf&quot;
</pre>

<br /></code></pre></p>
<h2>Using Authentication</h2>
<p>If your self-hosted BuildVu Microservice requires a username and password to convert PDF files to SVG, you must include them with each conversion request. These credentials are passed as username and password variables to the convert method, as shown below.</p>
<pre class='line-numbers' data-ad=BuildVu><code class='language-c#'><pre>
var client = new IDRCloudClient(&quot;http://exampleURL.com/&quot; + IDRCloudClient.BUILDVU, &quot;username&quot;, &quot;password&quot;);
</pre>

<br /></code></pre>
<p>The post <a href="https://blog.idrsolutions.com/how-to-convert-pdf-to-svg-in-c-tutorial/">How to convert PDF to SVG in C# (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/leon/">Leon Atherton</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How we use dogfooding at IDRsolutions</title>
		<link>https://blog.idrsolutions.com/how-we-use-dogfooding-at-idrsolutions/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Tue, 11 Nov 2025 15:51:14 +0000</pubDate>
				<category><![CDATA[BuildVu]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[idrsolutions]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[apex]]></category>
		<category><![CDATA[archive]]></category>
		<category><![CDATA[buildvu]]></category>
		<category><![CDATA[conversion]]></category>
		<category><![CDATA[convert]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[microservice]]></category>
		<category><![CDATA[pipeline]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[salesforce]]></category>
		<category><![CDATA[servlet]]></category>
		<category><![CDATA[storage]]></category>
		<category><![CDATA[tomcat]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37649</guid>

					<description><![CDATA[<p>At IDRsolutions, we eat our own dog food! We have weekly and monthly analytics reports that help us keep track of our KPIs, and we like to save a copy of these each time they are generated. These reports come from Looker Studio, however we prefer to use Basecamp as our single source of truth [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-we-use-dogfooding-at-idrsolutions/">How we use dogfooding at IDRsolutions</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/pexels-bill-emrich-64742-230785-scaled.jpg" alt="dogfooding" width="4986" height="3420" class="aligncenter size-full wp-image-37770" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/pexels-bill-emrich-64742-230785-scaled.jpg 4986w, https://blog.idrsolutions.com/app/uploads/2025/11/pexels-bill-emrich-64742-230785-300x206.jpg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/pexels-bill-emrich-64742-230785-1024x702.jpg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/pexels-bill-emrich-64742-230785-768x527.jpg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/pexels-bill-emrich-64742-230785-1536x1054.jpg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/pexels-bill-emrich-64742-230785-2048x1405.jpg 2048w" sizes="auto, (max-width: 4986px) 100vw, 4986px" /></p>
<p>At IDRsolutions, we <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food" target="_blank">eat our own dog food</a>!</p>
<p>We have weekly and monthly analytics reports that help us keep track of our KPIs, and we like to save a copy of these each time they are generated. These reports come from Looker Studio, however we prefer to use Basecamp as our <a href="https://en.wikipedia.org/wiki/Single_source_of_truth" target="_blank">single source of truth</a> so ideally, the reports should be archived somewhere, then made available on Basecamp.</p>
<p>Up until recently, we had a manual task for somebody to login to Looker Studio, download the PDF, and upload it to Basecamp. So we did what developers do best, and automated the whole process!</p>
<p>Looker Studio has a scheduling system where it will email a PDF generated from the report at regular intervals. We enabled this so that we could receive the report PDF in Salesforce where we have an Apex trigger to detect it, which then allows us to use our <a href="https://www.idrsolutions.com/buildvu/" target="_blank">PDF to HTML converter BuildVu</a>, to convert and store the file.</p>
<p>Using techniques described in <a href="https://www.apexhours.com/governor-friendly-asynchronous-processing-from-triggers/" target="_blank">this article</a>, we pick up the PDF as it arrives in Salesforce:</p>
<pre class='line-numbers' ><code class='language-java'>// Whenever a new file arrives on Salesforce, filter it to see if it is the weekly report PDF.

<br />EmailMessage emailMessage = [SELECT Id, Subject, FromAddress, ParentId FROM EmailMessage WHERE Id = :contentDocumentLink.LinkedEntityId LIMIT 1];<br />
if (emailMessage == null || !emailMessage.Subject.contains(&#8216;Weekly Report&#8217;) || emailMessage.FromAddress != &#8216;looker-studio-noreply@google.com&#8217;) {<br />
    continue;<br />
}

<br />ContentDocument contentDocument = [SELECT Id, FileExtension FROM ContentDocument WHERE Id = :contentDocumentLink.ContentDocumentId LIMIT 1];<br />
if (contentDocument == null || contentDocument.FileExtension.toLowerCase() != &#8216;pdf&#8217;) {<br />
    continue;<br />
}<br />
</code></pre>
<p>Then we send it to our internal <a href="https://www.idrsolutions.com/docs/buildvu/tutorials/cloud/app-server/deploy-buildvu-with-tomcat" target="_blank">microservice running BuildVu</a> where the PDF is converted to HTML and a link to the conversion is posted on Basecamp:</p>
<pre class='line-numbers' ><code class='language-java'>@future(callout = true)<br />
public static void postWeeklyReport(String pdfUrl) {

<br />    // Post to storage<br />
    HttpResponse response = Utils.executePOSTRequest(&#8216;callout:IDRstorage/buildvu&#8217;, &#8216;input=download&#038;settings={&quot;org.jpedal.pdf2html.originalFileName&quot;:&quot;&#8216; + EncodingUtil.urlEncode(name, &#8216;UTF-8&#8217;) + &#8216;&quot;}&#038;url=&#8217; + EncodingUtil.urlEncode(pdfUrl, &#8216;UTF-8&#8217;));

<br />    String uuid = Utils.getValue(response.getBody(), &#8216;uuid&#8217;);

<br />    // Post to Basecamp<br />
    Utils.executePOSTRequest(&#8216;https://3.basecampapi.com/&#8217; + accountId + &#8216;/buckets/123456/message_boards/12345678/messages.json&#8217;,<br />
        &#8216;{&quot;subject&quot;:&quot;Weekly Report &#8211; &#8216; + currentDay + &#8216; &#8216; + currentMonth<br />
                + &#8216;&quot;,&quot;content&quot;:&quot;&lt;div&gt;&lt;a href=\\\&quot;https://idrstorage.idrsolutions.com/view?id=&#8217; + uuid + &#8216;\\\&quot;&gt;IDRstorage&lt;/a&gt;&lt;/div&gt;&quot;,&quot;status&quot;:&quot;active&quot;,&quot;category_id&quot;:&quot;12345678&#8243;}&#8217;);<br />
}<br />
</code></pre>
<p>Dogfooding the latest builds of BuildVu has surfaced multiple product enhancements that wouldn&#8217;t have emerged without firsthand use.</p>
<h2>Download BuildVu</h2>
<p>Download a <a href="https://www.idrsolutions.com/buildvu/your-trial" target="_blank">BuildVu trial jar</a> so you can add a clean, modern PDF to HTML converter to your document processing pipeline.</p>
<h2>Resources</h2>
<p>Learn more about how the <a href="https://www.idrsolutions.com/docs/buildvu/tutorials/cloud/languages/access-buildvu-using-curl" target="_blank">BuildVu API</a> works.</p>
<p>Curious to learn more about <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">how PDF files work</a>?</p>
<p>The post <a href="https://blog.idrsolutions.com/how-we-use-dogfooding-at-idrsolutions/">How we use dogfooding at IDRsolutions</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>IDRsolutions: A DevFest Introspective</title>
		<link>https://blog.idrsolutions.com/idrsolutions-a-devfest-introspective/</link>
		
		<dc:creator><![CDATA[Nadir]]></dc:creator>
		<pubDate>Mon, 10 Nov 2025 16:39:51 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[devfest]]></category>
		<category><![CDATA[devfest istanbul]]></category>
		<category><![CDATA[istanbul]]></category>
		<category><![CDATA[software conference]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37516</guid>

					<description><![CDATA[<p>For more than a decade GDG Istanbul has held a special place in the story of IDRsolutions. What began as a single visit to connect with like-minded developers has evolved into an annual tradition that reflects our commitment to collaboration and community engagement. How it all began In 2013 in San Francisco, 2 shy Turkish [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/idrsolutions-a-devfest-introspective/">IDRsolutions: A DevFest Introspective</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/nadir/">Nadir</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>For more than a decade <a href="https://devfest.istanbul/">GDG Istanbul</a> has held a special place in the story of IDRsolutions. What began as a single visit to connect with like-minded developers has evolved into an annual tradition that reflects our commitment to collaboration and community engagement.</p>
<h2>How it all began</h2>
<p>In 2013 in San Francisco, 2 shy Turkish developers (<a href="https://www.linkedin.com/in/nilaycskn/">Nilay Coskun</a> and <a href="https://www.linkedin.com/in/muratyener/">Murat Yener</a>) made their way round all the stands at the JavaOne Conference looking for speakers for the new DevFest conference they were trying to start in Istanbul.</p>
<p>From our stand, Mark watched them gallantly take rejection from stand after stand and overheard their pitch. They finally arrived on the IDRsolutions stand and before they even had a chance to speak, Mark said &#8220;I am free then. I would love to be involved if you would like to invite me&#8221;.</p>
<p>They looked slightly bewildered and said &#8220;But we don&#8217;t even have a date yet&#8221;.</p>
<p>Mark continued &#8220;The 2 great passions in my life are IT and  History. I love sharing my passion for software development and I have never had the chance to visit the city and see all the sites I studied as part of my Mediaeval History course. So whatever the date it is, I will be there if you would like to invite me&#8221;</p>
<p>And so it all began&#8230;.</p>
<h2>The Spirit of DevFest</h2>
<p>DevFest Istanbul isn’t your typical tech conference. It’s a place where developers, engineers, students, and tech enthusiasts meet to share ideas and learn from each other.</p>
<p>What makes it great is the open and curious atmosphere. People genuinely want to explore new things and push limits together. That’s something we really connect with, because we believe progress starts with open minds and candid conversations.</p>
<h2>Engaging with the Developer Community</h2>
<p>Every year, DevFest offers us the chance to engage directly with a diverse audience which includes students taking their first steps into the industry to veterans tackling complex challenges. </p>
<p>These conversations not only keep us grounded in the realities of software development but also help understand how our tools can better serve those building the next generation of applications.</p>
<p>Listening to the community remains one of the most valuable parts of our DevFest experience.</p>
<h2>Delivering Technical Talks</h2>
<p>Our technical talks at DevFest are designed to be more than guides. We aim to share problems developers face with PDFs and how we are solving these problems, using the latest development tools.<br />
&nbsp;<br />
<a href="https://blog.idrsolutions.com/app/uploads/2025/11/2023.jpg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/2023.jpg" alt="" width="367" height="460" class="aligncenter size-full wp-image-37598" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/2023.jpg 367w, https://blog.idrsolutions.com/app/uploads/2025/11/2023-239x300.jpg 239w" sizes="auto, (max-width: 367px) 100vw, 367px" /></a><br />
Through these sessions, we showcase what we have built but also learn how others approach similar problems. The dialogue that follows is what makes each talk worthwhile.</p>
<p>Since we have been returning to DevFest Istanbul for so many years, we have a <a href="https://www.linkedin.com/posts/idrsolutions_chika-emebo-mark-stephens-how-to-display-activity-7386359717377527808-gZNO?utm_source=share&#038;utm_medium=member_desktop&#038;rcm=ACoAACzfWOIBQP1gQ-AHDoObhjiEYQI7FpNNBc8">collection of talks</a> from the past which you can watch to get an idea of what to expect.</p>
<h2>Empowering New Hires</h2>
<p>DevFest is also an important part of our internal culture. New hires at IDR Solutions are encouraged to join us in Istanbul as part of their professional growth. </p>
<p>For many, it’s their first experience at a large-scale tech event and a chance to engage with ideas beyond the confines of day-to-day work. It also gives placement students opportunities to contribute fresh perspectives, enriching our team with <a href="https://blog.idrsolutions.com/worlds-collide-generational-diversity-is-your-superpower/">generational diversity</a>.<br />
&nbsp;<br />
<a href="https://blog.idrsolutions.com/app/uploads/2025/11/devfest-2024.jpg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/devfest-2024-913x1024.jpg" alt="" width="913" height="1024" class="aligncenter size-large wp-image-37604" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/devfest-2024-913x1024.jpg 913w, https://blog.idrsolutions.com/app/uploads/2025/11/devfest-2024-267x300.jpg 267w, https://blog.idrsolutions.com/app/uploads/2025/11/devfest-2024-768x861.jpg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/devfest-2024.jpg 1167w" sizes="auto, (max-width: 913px) 100vw, 913px" /></a></p>
<p>This exposure fosters both technical curiosity and confidence and has been an important aspect of our <a href="https://blog.idrsolutions.com/top-strategies-for-employee-retention/">retention strategy</a> over the years.</p>
<h2>Beyond the Conference</h2>
<p>While DevFest itself is a highlight, the city of Istanbul adds another layer to the experience. Between sessions, our team takes time to explore its rich history, architecture, and cuisine.</p>
<p>Besides, it&#8217;s not every day that you see <em>cats in the streets, cats in the shops and cats in every other place you can possibly imagine!</em> Be wary though, they only accept the highest quality food or you are simply not worthy&#8230;</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/cat.jpg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/cat.jpg" alt="" width="612" height="408" class="aligncenter size-full wp-image-37601" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/cat.jpg 612w, https://blog.idrsolutions.com/app/uploads/2025/11/cat-300x200.jpg 300w" sizes="auto, (max-width: 612px) 100vw, 612px" /></a></p>
<p>These shared moments away from the conference hall <a href="https://blog.idrsolutions.com/team-building-through-work-activities/">strengthen our team spirit</a> and remind us that creativity thrives when you step outside the familiar.</p>
<p>We&#8217;re looking to continue tradition and visit to the Turkish Bath house, Hürrem Sultan Hamamı for the <a href="https://blog.idrsolutions.com/experience-the-best-2-hours-of-your-life-in-istanbul/">best 2 hours of our life!</a>. A definite highlight is joining fellow <a href="https://devfest.istanbul/speakers">Speakers</a> (new and old) on the Speaker&#8217;s tour of the hotspots in Istanbul.</p>
<h2>The journey is part of the adventure</h2>
<p>This year, Mark has decided to travel in style and <a href="https://blog.idrsolutions.com/riding-the-orient-express-to-devfest-istanbul/">will be taking the &#8216;Orient Express&#8217;</a>, which will not only help reduce our <a href="https://files.idrsolutions.com/Examples/IDRViewer/IDR_Carbon_Footprint_Report/index.html?page=1">carbon output</a> but also give an opportunity to experience hotspots like Brussels, Budapest, Vienna and Bucharest. </p>
<p>It&#8217;s a 5 day journey so he has obtained some suitable reading material from his favourite Indy bookshop.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/books-scaled.jpg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/books-300x205.jpg" alt="Some books to read on the train" width="300" height="205" class="aligncenter size-medium wp-image-37698" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/books-300x205.jpg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/books-1024x698.jpg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/books-768x524.jpg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/books-1536x1047.jpg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/books-2048x1396.jpg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<h2>Conclusion</h2>
<p>DevFest Istanbul is one of our favourite conferences and we aim to return for a long time to come. It is not just the excellent talks, the beauty of Istanbul or the sense of being part of a movement, what makes this conference special are the people!</p>
<p>The post <a href="https://blog.idrsolutions.com/idrsolutions-a-devfest-introspective/">IDRsolutions: A DevFest Introspective</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/nadir/">Nadir</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>7 things to do while you are attending DevFest Istanbul</title>
		<link>https://blog.idrsolutions.com/7-things-to-do-while-you-are-attending-devfest-istanbul/</link>
		
		<dc:creator><![CDATA[Mark Stephens]]></dc:creator>
		<pubDate>Mon, 10 Nov 2025 15:42:06 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37739</guid>

					<description><![CDATA[<p>If you are attending DevFest Istanbul on Sunday 7th December 2025, you are guaranteed a great time! It&#8217;s an amazingly friendly event, with lots of speakers to hear and stands to visit (remember to drop by the IDRsolutions stand and grab your free stickers). But you are also in Istanbul &#8211; the capital city of [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/7-things-to-do-while-you-are-attending-devfest-istanbul/">7 things to do while you are attending DevFest Istanbul</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>If you are attending <a href="https://devfest.istanbul/">DevFest Istanbul</a> on Sunday 7th December 2025, you are guaranteed a great time! It&#8217;s an amazingly friendly event, with lots of speakers to hear and stands to visit (remember to drop by the IDRsolutions stand and grab your free stickers).</p>
<p>But you are also in Istanbul &#8211; the capital city of the world for much of its history (and still considered unrivalled by many). So set aside some extra time and arrive early to enjoy the city. Here are 7 ideas from us to do as well as attend the event.</p>
<h2>1. Shop in the Egyptian Bazaar</h2>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/bazaar-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/bazaar-225x300.jpeg" alt="Egyptian Bazaar" width="225" height="300" class="aligncenter size-medium wp-image-37740" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/bazaar-225x300.jpeg 225w, https://blog.idrsolutions.com/app/uploads/2025/11/bazaar-768x1024.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/bazaar-1152x1536.jpeg 1152w, https://blog.idrsolutions.com/app/uploads/2025/11/bazaar-1536x2048.jpeg 1536w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a><br />
You could all too easily get lost in this huge, covered maze of shops. It is full of sights, sounds and smells to dazzle the senses and a great place to get some unique presents. </p>
<h2>2. Cruise along the Bosphorus</h2>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/cruise-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/cruise-300x225.jpeg" alt="cruise" width="300" height="225" class="aligncenter size-medium wp-image-37751" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/cruise-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/cruise-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/cruise-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/cruise-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/cruise-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><br />
One of the best ways to see the city is from the water. Get comfortable and enjoy the ride.</p>
<h2>3. Descend into the underground Cistern</h2>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/cistern-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/cistern-225x300.jpeg" alt="cistern" width="225" height="300" class="aligncenter size-medium wp-image-37741" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/cistern-225x300.jpeg 225w, https://blog.idrsolutions.com/app/uploads/2025/11/cistern-768x1024.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/cistern-1152x1536.jpeg 1152w, https://blog.idrsolutions.com/app/uploads/2025/11/cistern-1536x2048.jpeg 1536w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a><br />
Built originally as a Mediaeval water store for the city, the Basilica Cistern was rediscovered in the 16th Century. It has been used as a location in the James Bond film &#8216;From Russia with Love&#8217; and is now restored and lit up. Walk round its 336 columns but watch out for the Medusa&#8217;s head.</p>
<h2>4. Get your photo at Topkapi Palace</h2>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/topaki-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/topaki-300x225.jpeg" alt="topaki" width="300" height="225" class="aligncenter size-medium wp-image-37742" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/topaki-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/topaki-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/topaki-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/topaki-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/topaki-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><br />
There are lots of stunning views to see and take photos so remember your camera. This is the speakers tour at the Topkapi Palace &#8211; the Sultan obviously has the best views from his residence.</p>
<h2>5. Walk along the seafront at Night</h2>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/sea-night-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/sea-night-300x225.jpeg" alt="night" width="300" height="225" class="aligncenter size-medium wp-image-37743" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/sea-night-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/sea-night-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/sea-night-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/sea-night-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/sea-night-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><br />
Istanbul is always buzzing and spectacular, especially at night. Walk along the seafront and take in the light show.</p>
<h2>6. Visit Troy</h2>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/trojan-horse.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/trojan-horse-262x300.jpeg" alt="trojan horse" width="262" height="300" class="aligncenter size-medium wp-image-37700" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/trojan-horse-262x300.jpeg 262w, https://blog.idrsolutions.com/app/uploads/2025/11/trojan-horse-895x1024.jpeg 895w, https://blog.idrsolutions.com/app/uploads/2025/11/trojan-horse-768x879.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/trojan-horse-1342x1536.jpeg 1342w, https://blog.idrsolutions.com/app/uploads/2025/11/trojan-horse-1789x2048.jpeg 1789w, https://blog.idrsolutions.com/app/uploads/2025/11/trojan-horse.jpeg 1826w" sizes="auto, (max-width: 262px) 100vw, 262px" /></a><br />
It&#8217;s a full day trip which takes you along the Bosphorus and you also sail across the Hellespont. It&#8217;s the mythical city of Homer&#8217;s Iliad (the original blockbuster) and you can really imagine Brad Pitt&#8217;s Achilles walking on the same ground. It&#8217;s also a real place and the birthplace of Archaeology.  </p>
<h2>7. Say hello to the cats</h2>
<p>
<a href='https://blog.idrsolutions.com/7-things-to-do-while-you-are-attending-devfest-istanbul/cats-2/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/cats-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/cats-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/cats-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<a href='https://blog.idrsolutions.com/7-things-to-do-while-you-are-attending-devfest-istanbul/art/'><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.idrsolutions.com/app/uploads/2025/11/art-150x150.jpeg" class="attachment-thumbnail size-thumbnail" alt="cats" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/art-150x150.jpeg 150w, https://blog.idrsolutions.com/app/uploads/2025/11/art-120x120.jpeg 120w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>
<br />
Istanbul is home to a large number of cats. You can&#8217;t miss them so introduce yourself.</p>
<p>The post <a href="https://blog.idrsolutions.com/7-things-to-do-while-you-are-attending-devfest-istanbul/">7 things to do while you are attending DevFest Istanbul</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How history suggests the AI revolution will play out&#8230;</title>
		<link>https://blog.idrsolutions.com/how-history-suggests-the-ai-revolution-will-play-out/</link>
		
		<dc:creator><![CDATA[Mark Stephens]]></dc:creator>
		<pubDate>Fri, 07 Nov 2025 15:58:13 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37715</guid>

					<description><![CDATA[<p>What can the old-fashioned printing press teach us about AI? More than you might think&#8230; How History might show the future Yesterday, I was lucky enough to attend the TURING x SYSTM Growth Summit. All the talks were brilliant, and choosing your favourite is like choosing your favourite child. But as a History graduate, the [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-history-suggests-the-ai-revolution-will-play-out/">How history suggests the AI revolution will play out&#8230;</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>What can the old-fashioned printing press teach us about AI? More than you might think&#8230;</p>
<h2>How History might show the future</h2>
<p>Yesterday, I was lucky enough to attend the <a href="https://turingfest.com/turingxsystm/" target="_blank">TURING x SYSTM Growth Summit</a>. All the talks were brilliant, and choosing your favourite is like choosing your favourite child. </p>
<p>But as a History graduate, the one which struck a real chord with me was Matt Learner&#8217;s look at how previous revolutions have played out, and what this might look like with the AI revolution. History never repeats but it often rhymes.</p>
<p>The talk looked at comparable technological revolutions and Matt focussed on the invention of Printing and the Internet. Both have followed 4 specific phases.</p>
<h2>A revolution in 4 stages</h2>
<p>The revolution starts with <strong>infrastructure</strong>, which is initially <strong>applied to existing practices</strong> before <strong>enabling radical new ideas</strong> and <strong>business models</strong>. </p>
<p>For example, the print revolution began with Gutenberg trying to produce bibles faster and cheaper, and eventually led to modern innovations like on-demand printing of Pokemon cards.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/printing-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/printing-300x225.jpeg" alt="print revolution" width="300" height="225" class="aligncenter size-medium wp-image-37716" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/printing-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/printing-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/printing-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/printing-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/printing-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>The internet followed the same pattern: starting with laying cables and protocols (infrastructure), then digitizing existing media like newspapers (application to existing models), followed by social networks and user-generated content (radical new ideas), and finally subscription services and the creator economy (new business models).</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/internet-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/internet-300x225.jpeg" alt="internet revolution" width="300" height="225" class="aligncenter size-medium wp-image-37717" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/internet-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/internet-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/internet-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/internet-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/internet-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Matt then applied this same framework to where we are with AI today.</p>
<h2>Lessons for the AI era</h2>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/ai-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/ai-300x225.jpeg" alt="AI revolution phases diagram" width="300" height="225" class="aligncenter size-medium wp-image-37719" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/ai-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/ai-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/ai-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/ai-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/ai-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Judging by the soaring valuation of Nvidia stock, we are still at phase one. So the key thing we need to do is spot what has changed and which constraints no longer apply. For instance, AI removes the constraint that quality content requires human expertise and time—anyone can now generate professional-level writing, images, or code in seconds.</p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/constraint-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/constraint-300x225.jpeg" alt="constraints" width="300" height="225" class="aligncenter size-medium wp-image-37720" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/constraint-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/constraint-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/constraint-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/constraint-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/constraint-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<h2>What does it all mean?</h2>
<p>We&#8217;re at the infrastructure stage, watching the foundations being laid. The big opportunities won&#8217;t come from better AI models—they&#8217;ll come from figuring out which impossible things are now possible.</p>
<p>Figure that out and you could have the next Unicorn&#8230;</p>
<p>The post <a href="https://blog.idrsolutions.com/how-history-suggests-the-ai-revolution-will-play-out/">How history suggests the AI revolution will play out&#8230;</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Working with Images in Java</title>
		<link>https://blog.idrsolutions.com/working-with-images-in-java/</link>
		
		<dc:creator><![CDATA[Amy Pearson]]></dc:creator>
		<pubDate>Fri, 07 Nov 2025 14:32:43 +0000</pubDate>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[BMP]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[DICOM]]></category>
		<category><![CDATA[EMF]]></category>
		<category><![CDATA[GIF]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[HEIC]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDeli]]></category>
		<category><![CDATA[JPEG]]></category>
		<category><![CDATA[JPEG2000]]></category>
		<category><![CDATA[JPEGXL]]></category>
		<category><![CDATA[PNG]]></category>
		<category><![CDATA[PSD]]></category>
		<category><![CDATA[SGI]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[TIFF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WebP]]></category>
		<category><![CDATA[WMF]]></category>
		<category><![CDATA[images java developer]]></category>
		<category><![CDATA[java image library]]></category>
		<category><![CDATA[java image manipulation]]></category>
		<category><![CDATA[java image processing]]></category>
		<category><![CDATA[java tutorials]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37620</guid>

					<description><![CDATA[<p>Java developers working with Image files have limited options. Since starting the company in 1999, we’ve been frustrated by the limited options available for image handling in Java. Libraries like ImageIO often fell short, with restricted format support and occasional JVM crashes, making pure Java workflows difficult to maintain. Which is why in 2015, we [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/working-with-images-in-java/">Working with Images in Java</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/amy/">Amy Pearson</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Java developers working with Image files have limited options. Since starting the company in 1999, we’ve been frustrated by the limited options available for image handling in Java.</p>
<p>Libraries like ImageIO often fell short, with restricted format support and occasional JVM crashes, making pure Java workflows difficult to maintain.</p>
<p>Which is why in 2015, we decided to compile all of our knowledge into <strong><a href="https://www.idrsolutions.com/jdeli/">JDeli</a></strong>, our <strong>pure Java Image Library</strong>. You can <a href="https://www.idrsolutions.com/jdeli/#why-buy">trial JDeli</a> yourself, and use this <strong>java-ready library</strong> to solve your image processing needs.</p>
<p>This post serves as a repository of all the knowledge we have compiled over the years, around the most commonly used image formats and image related processes.</p>
<h2>Learn about Image Formats</h2>
<p>Discover the key characteristics, use cases, and advantages of popular image formats. This section explains how each format works so you can choose the right one for your application or workflow.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/what-is-jpeg-xl/">What is JPEG XL?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-jbig2/">What is JBIG2?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-the-avif-image-format/">What is AVIF image format?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-sgi-file-format/">What is SGI file format?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-dicom/">What is a Dicom File?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-tiff/">What is TIFF?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-gif/">What is GIF?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-jpeg-2000/">What is JPEG 2000?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-psd/">What is PSD?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-png/">What is PNG?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-jpeg/">What is JPEG?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-bmp/">What is BMP?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-heic/">What is Heic?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-webp-image-format/">What is a WebP file?</a></li>
</ul>
<h2>Read Image Formats</h2>
<p>Learn how to read and decode different image formats in Java. Each tutorial provides step-by-step guidance using JDeli to access and process image data efficiently.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-read-avif-files-in-java-tutorial/">How to read AVIF files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-psd-images-in-java/">How to read PSD images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-wmf-images-in-java/">How to read WMF images in Java</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-jpeg-xl-images-in-java/">How to read JPEG XL images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-emf-files-in-java/">How to read EMF files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-webp-files-in-java/">How to read WebP files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-gif-files-in-java/">How to read GIF files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-jpeg2000-in-java/">How to Read JPEG 2000 in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-exif-metadata-from-image-files/">How to read EXIF metadata from Image files</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-jpeg-images-in-java/">How to read JPEG images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-tiff-images-in-java/">How to read TIFF images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-png-files-in-java/">How to read PNG files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-bmp-images-in-java/">How to read BMP images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-heic-files-in-java/">How to read Heic files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-sgi-images-in-java/">How to read SGI images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-read-dicom-files-in-java/">How to read DICOM Image files in Java (Tutorial)</a></li>
</ul>
<h2>Write File Formats</h2>
<p>Understand how to create and export images in multiple formats using Java. These tutorials show how to write images to disk or streams while controlling compression, colour profiles, and metadata.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-write-avif-image-files-in-java-tutorial/">How to write AVIF images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-write-tiff-images-in-java/">How to write TIFF images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-write-heic-image-files-in-java/">How to write HEIC image files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-write-gif-image-files-in-java/">How to write GIF image files in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-write-webp-images-in-java/">How to write WebP images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-write-out-png-images-in-java/">How to write PNG Images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-write-jpeg2000-images-in-java/">How to write JPEG 2000 Images in Java</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-write-jpeg-images-in-java/">How to write JPEG Images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-write-bmp-images-in-java/">How to write BMP images in Java (Tutorial)</a></li>
</ul>
<h2>Convert Image Formats</h2>
<p>Find out how to convert images between different formats in bulk or individually. These guides demonstrate practical Java examples for format conversion, optimizing workflows for speed and quality.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-mass-convert-bmp-to-jpg-tutorial/">How to mass convert BMP to JPG (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-mass-convert-tiff-to-jpg-tutorial/">How to mass convert TIFF to JPG (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-mass-convert-png-to-jpg-tutorial/">How to mass convert PNG to JPG (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-bulk-convert-webp-to-jpg-tutorial/">How to bulk convert WebP to JPG (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-convert-heic-to-jpg-in-bulk-tutorial/">How to convert HEIC to JPG in bulk (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-convert-wmf-files-to-svg-in-java-with-jdeli/">How to convert WMF files to SVG in Java with JDeli</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-convert-emf-files-to-svg-in-java/">How to convert EMF files to SVG in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-convert-an-image-to-a-pdf-in-java/">How to convert an image to a PDF in Java (Tutorial)</a></li>
</ul>
<h2>Image Manipulation in Java</h2>
<p>Explore how to perform common image manipulation tasks directly in Java. Learn to crop, resize, blur, scale, and rotate images programmatically using JDeli for fast and accurate results.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-to-manipulate-images-in-java-using-jdeli/">How to Manipulate Images in Java using JDeli</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-blur-an-image-in-java-with-code-examples/">Blurring Images in Java: Simple &#038; Gaussian Blur Code Examples</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-crop-an-image-in-java/">How to crop an image in Java</a></li>
<li><a href="https://blog.idrsolutions.com/scaling-images-in-java-with-jdeli/">Scaling Images in Java with JDeli</a></li>
<li><a href="https://blog.idrsolutions.com/how-to-resize-images-in-java/">How to resize images in Java (Tutorial)</a></li>
<li><a href="https://blog.idrsolutions.com/image-rotation-in-java/">Image Rotation In Java</a></li>
</ul>
<h2>Compression in Java</h2>
<p>Get an overview of the compression methods used in image processing. This section explains various algorithms and compares their performance to help you select the most efficient option for your needs.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/what-is-lzw-compression/">What is LZW compression?</a></li>
<li><a href="https://blog.idrsolutions.com/what-is-ccitt-compression/">What is CCITT compression?</a></li>
<li><a href="https://blog.idrsolutions.com/how-does-ccitt-compress-image-data/">How does CCITT compress image data?</a></li>
<li><a href="https://blog.idrsolutions.com/comparing-webp-compression-algorithms/">Comparing WebP compression algorithms</a></li>
<li><a href="https://blog.idrsolutions.com/comparing-png-compression-algorithms/">Comparing PNG Compression Algorithms</a></li>
<li><a href="https://blog.idrsolutions.com/comparing-tiff-compression-algorithms/">Comparing TIFF Compression Algorithms</a></li>
<li><a href="https://blog.idrsolutions.com/ccitt-compression-guide/">CCITT Compression Guide</a></li>
</ul>
<h2>How Java Handles Images and ColorSpaces</h2>
<p>Understand how Java processes images and manages color spaces across different libraries and APIs. This series explains key concepts behind Java’s image representation, manipulation, and color handling mechanisms.</p>
<ul>
<li><a href="https://blog.idrsolutions.com/how-does-java-handle-different-images-and-colorspaces-part-1/">How does Java handle different Images and ColorSpaces – Part 1</a></li>
<li><a href="https://blog.idrsolutions.com/how-does-java-handle-different-images-and-colorspaces-part-2/">How does Java handle different Images and ColorSpaces – Part 2</a></li>
<li><a href="https://blog.idrsolutions.com/how-does-java-handle-different-images-and-colorspaces-part-3-introducing-the-bufferedimage/">How does Java handle different Images and ColorSpaces – Part 3 Introducing the BufferedImage</a></li>
<li><a href="https://blog.idrsolutions.com/how-does-java-handle-different-images-and-colorspaces-part-4-imageio-and-other-image-libraries/">How does Java handle different Images and ColorSpaces – Part 4 ImageIO and other image libraries</a></li>
</ul>
<p>The post <a href="https://blog.idrsolutions.com/working-with-images-in-java/">Working with Images in Java</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/amy/">Amy Pearson</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PDF processing with Spring Boot (Tutorial)</title>
		<link>https://blog.idrsolutions.com/pdf-processing-with-spring-boot-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Fri, 07 Nov 2025 11:55:02 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[convert]]></category>
		<category><![CDATA[converter]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[jpedal]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[PNG]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring boot]]></category>
		<category><![CDATA[spring.io]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37619</guid>

					<description><![CDATA[<p>What is Spring Boot? Spring Boot is a framework for efficiently building production level Java apps. It builds on top of the Spring framework by offering out of the box configuration and setup. It allows developers to build and deploy microservices and APIs with minimal tweaking required. How to process PDF files? JPedal is our [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/pdf-processing-with-spring-boot-tutorial/">PDF processing with Spring Boot (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>What is Spring Boot?</h2>
<p><a href="https://spring.io/projects/spring-boot" target="_blank">Spring Boot</a> is a framework for efficiently building production level Java apps. It builds on top of the Spring framework by offering out of the box configuration and setup. It allows developers to build and deploy microservices and APIs with minimal tweaking required.</p>
<h2>How to process PDF files?</h2>
<p><a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal</a> is our Java PDF SDK which enables developers to <a href="https://www.idrsolutions.com/jpedal/java-pdf-renderer" target="_blank">convert</a>, <a href="https://www.idrsolutions.com/jpedal/manipulate-pdf-pages-in-java" target="_blank">manipulate</a>, <a href="https://www.idrsolutions.com/docs/jpedal/printing/" target="_blank">print</a>, and <a href="https://www.idrsolutions.com/jpedal/java-pdf-viewer" target="_blank">view</a> PDF files within Java applications. It provides APIs for <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/convert-images/convert-pdf-to-bufferedimage" target="_blank">rendering PDFs to images</a>, <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/extract-text/extract-structured-content-from-structured-pdf-files" target="_blank">extracting text and metadata</a>, <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator#load-and-write-documents" target="_blank">manipulating pages</a>, and much more! JPedal supports both server side and desktop use cases, making it suitable for integrating PDF functionality into web applications, or document processing pipelines.</p>
<h2>Spring Boot PDF processing</h2>
<p>Combining JPedal with Spring Boot allows developers to build web services which require processing PDFs. For example, a Spring Boot REST API could use JPedal to convert uploaded PDFs into images.</p>
<p>This provides the following benefits:</p>
<ul>
<li><strong>Scalability</strong>: Spring Boot handles concurrency and deployment, while JPedal manages the PDF processing</li>
<li><strong>Simplicity</strong>: Minimal configuration for both the web layer (Spring Boot) and document layer (JPedal)</li>
<li><strong>Extensibility</strong>: Easy to integrate with databases or other cloud services</li>
</ul>
<p>Together, JPedal and Spring Boot form a robust stack for creating PDF driven Java applications with web capabilities.</p>
<h2>How to set up a Spring Boot project with JPedal</h2>
<p>Now we are going to make a simple microservice which converts PDFs into PNGs.</p>
<p>First, visit <a href="https://start.spring.io/" target="_blank">Sprint Initializr</a> and create a new project. Add &#8216;Spring Web&#8217; as a dependency.</p>
<p>Second, you will need to <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download a JPedal jar</a>, and <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/add-jpedal-as-a-maven-dependency" target="_blank">add it to your Java project</a>.</p>
<p>Next, create a service class which will perform the PDF to PNG conversion:</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>@Service<br />
public class PdfService {

<br />    public File renderPdfToImage(final File pdfFile, final int page) throws Exception {<br />
        final File outputDir = new File(&quot;output&quot;);<br />
        if (!outputDir.exists()) {<br />
            outputDir.mkdirs();<br />
        }

<br />        final ConvertPagesToImages convert = new ConvertPagesToImages(pdfFile.getAbsolutePath());

<br />        if (!convert.openPDFFile()) {<br />
            convert.closePDFfile();<br />
        }

<br />        final BufferedImage bi = convert.getPageAsImage(page);

<br />        final File out = Paths.get(outputDir.getAbsolutePath(),<br />
                pdfFile.getName() + &quot;-&quot; + page + &quot;.png&quot;).toFile();

<br />        final PngEncoderOptions options = new PngEncoderOptions();<br />
        JDeli.write(bi, options, out);

<br />        convert.closePDFfile();

<br />        return out;<br />
    }

<br />}<br />
</code></pre>
<p>Then create a new controller class which will handle the REST requests:</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>@RestController<br />
@RequestMapping(&quot;/pdf&quot;)<br />
public class PdfController {

<br />    private final PdfService pdfService;

<br />    public PdfController(final PdfService pdfService) {<br />
        this.pdfService = pdfService;<br />
    }

<br />    @PostMapping(value = &quot;/convert&quot;, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)<br />
    public ResponseEntity<Resource> convertPdf(@RequestParam(&quot;file&quot;) final MultipartFile file,<br />
            @RequestParam(&quot;page&quot;) final int page) throws Exception {

<br />        final File temp = File.createTempFile(&quot;upload&quot;, &quot;.pdf&quot;);<br />
        file.transferTo(temp);<br />
        final File output = pdfService.renderPdfToImage(temp, page);

<br />        final InputStreamResource resource = new InputStreamResource(new FileInputStream(output));<br />
        return ResponseEntity.ok()<br />
                .header(HttpHeaders.CONTENT_DISPOSITION, &quot;attachment; filename=\&quot;&quot; + output.getName() + &quot;\&quot;&quot;)<br />
                .contentLength(output.length())<br />
                .contentType(MediaType.APPLICATION_OCTET_STREAM)<br />
                .body(resource);<br />
    }

<br />}<br />
</code></pre>
<p>Finally, update the <code>application.properties</code> file to include the following settings:</p>
<pre class='line-numbers' ><code class='language-java'>spring.servlet.multipart.enabled=true<br />
spring.servlet.multipart.max-file-size=20MB<br />
spring.servlet.multipart.max-request-size=20MB<br />
</code></pre>
<p>Now you can start the microservice using:</p>
<pre class='line-numbers' ><code class='language-java'>./mvnw spring-boot:run<br />
</code></pre>
<p>Once the build completes, you can send a PDF to the microservice and have it converted:</p>
<pre class='line-numbers' ><code class='language-java'>curl -X POST http://localhost:8080/pdf/convert -F file=@/Users/Shared/inputFile.pdf -F page=1 -o output.png<br />
</code></pre>
<h2>Source code</h2>
<p>All of the code in this article can be found on our GitHub: <a href="https://github.com/idrsolutions/jpedal-springboot-example" target="_blank">jpedal-springboot-example</a>.</p>
<h2>Download JPedal now</h2>
<p>You may <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download a trial copy of JPedal</a> to get familiar with how it works.</p>
<p></p>
<h2>Learn more</h2>
<p>Find out <a href="https://blog.idrsolutions.com/category/jpedal/" target="_blank">what else you can do with JPedal</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/pdf-processing-with-spring-boot-tutorial/">PDF processing with Spring Boot (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to interleave merge PDFs in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-interleave-merge-pdfs-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Thu, 06 Nov 2025 16:35:14 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[Merge]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[combine]]></category>
		<category><![CDATA[document]]></category>
		<category><![CDATA[documents]]></category>
		<category><![CDATA[interlace]]></category>
		<category><![CDATA[interleave]]></category>
		<category><![CDATA[merge]]></category>
		<category><![CDATA[weave]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37682</guid>

					<description><![CDATA[<p>The Java PDF library JPedal allows developers to merge PDF files using interleaving. Download a JPedal trial jar to try it out! What is interleaving? To interleave two or more PDF files means to combine them into a single document where the output file contains alternating pages from each input file. For example, say you [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-interleave-merge-pdfs-in-java-tutorial/">How to interleave merge PDFs in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The <a href="https://www.idrsolutions.com/jpedal/" target="_blank">Java PDF library JPedal</a> allows developers to merge PDF files using interleaving. <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">Download a JPedal trial jar</a> to try it out!</p>
<h2>What is interleaving?</h2>
<p>To interleave two or more PDF files means to combine them into a single document where the output file contains alternating pages from each input file.</p>
<p>For example, say you have document A with 4 pages, and document B with 5 pages. The result would look like: <code>A1, B1, A2, B2, A3, B3, A4, B4, B5</code>.</p>
<p>One example of when you might want to use this would be merging multiple copies of the same form with different answers filled in. Using an interleave merge here would make it a lot easier to compare the different answers.</p>
<h2>How to merge with interleaving in Java</h2>
<p>Once you have downloaded a <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">JPedal jar</a>, and <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/add-jpedal-as-a-maven-dependency" target="_blank">added it to your Java project</a>, you can use the following lines of code:</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>final ArrayList<MergeOption> options = new ArrayList<>();<br />
options.add(MergeOption.INTERLEAVE);

<br />PdfMerge.mergeFiles(new File(&quot;inputFile1.pdf&quot;), new File(&quot;inputFile2.pdf&quot;), new File(&quot;outputFile.pdf&quot;), options);<br />
</code></pre>
<h2>Download JPedal now</h2>
<p>You may <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download a trial copy of JPedal</a> to get familiar with how it works.</p>
<p></p>
<h2>Learn more</h2>
<p>Learn more about the <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/merge-pdfs" target="_blank">PDF Merge API</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-interleave-merge-pdfs-in-java-tutorial/">How to interleave merge PDFs in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to set the initial view of a PDF in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-set-the-initial-view-of-a-pdf-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Wed, 05 Nov 2025 09:26:14 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Viewer]]></category>
		<category><![CDATA[destination]]></category>
		<category><![CDATA[initial view]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[open action]]></category>
		<category><![CDATA[openaction]]></category>
		<category><![CDATA[page layout]]></category>
		<category><![CDATA[page mode]]></category>
		<category><![CDATA[pagelayout]]></category>
		<category><![CDATA[pagemode]]></category>
		<category><![CDATA[viewer]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37641</guid>

					<description><![CDATA[<p>What is initial view? A PDF document may have an initial view which determines how the document opens in PDF viewing software like Adobe Acrobat or JPedal Viewer. The initial view can dictate which page the document should be opened on, the layout of the pages, and even which interactive panels should be open (e.g. [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-set-the-initial-view-of-a-pdf-in-java-tutorial/">How to set the initial view of a PDF in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>What is initial view?</h2>
<p>A PDF document may have an initial view which determines how the document opens in PDF viewing software like Adobe Acrobat or <a href="https://www.idrsolutions.com/jpedal/java-pdf-viewer" target="_blank">JPedal Viewer</a>.</p>
<p>The initial view can dictate which page the document should be opened on, the layout of the pages, and even which interactive panels should be open (e.g. the page thumbnails panel).</p>
<h2>What is JPedal?</h2>
<p><a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal</a> is our Java PDF library which we have been developing for over 20 years! It comes with a rich feature set and robust support for all kinds of PDF files.</p>
<h2>How to set the initial view with JPedal?</h2>
<p>First, you will need to download a JPedal jar and <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/add-jpedal-as-a-maven-dependency" target="_blank">add it to your Java project</a>. You can <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">get a trial</a> copy from our website.</p>
<p>Next, you need to create an instance of <a href="https://javadoc.idrsolutions.com/org/jpedal/manipulator/PdfManipulator.html" target="_blank">PdfManipulator</a>, load the desired PDF, and use the <a href="https://javadoc.idrsolutions.com/org/jpedal/manipulator/PdfManipulator.html#setInitialView(int,org.jpedal.constants.Destination,org.jpedal.constants.PageLayout,org.jpedal.constants.PageMode)" target="_blank">set initial view command</a>.</p>
<p>The example code below sets the initial view of a PDF to open on page 3, using a two page view mode, with the thumbnails panel open.</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));<br />
pdf.setInitialView(3, new Destination.Fit(),<br />
        PageLayout.TWO_PAGE_LEFT,<br />
        PageMode.USE_THUMBS);<br />
pdf.apply();<br />
pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.closeDocument();<br />
</code></pre>
<p></p>
<h2>Download JPedal</h2>
<p>You can get a <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">JPedal trial jar</a> to test setting the initial view of PDF files.</p>
<h2>Resources</h2>
<p>Learn more about the <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">PDF Manipulator API</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-set-the-initial-view-of-a-pdf-in-java-tutorial/">How to set the initial view of a PDF in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to add a link to a PDF in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-add-a-link-to-a-pdf-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Wed, 05 Nov 2025 08:33:44 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[annotate]]></category>
		<category><![CDATA[annotation]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[hyperlink]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[resources]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[website]]></category>
		<category><![CDATA[www]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37509</guid>

					<description><![CDATA[<p>Hyperlinks in PDF documents allow you to specify websites or external resources that users can visit for more information. (Though they can also be a source of phishing!) Our Java PDF toolkit JPedal contains a powerful PDF manipulation API which you can use to add links to PDF files Download JPedal You can get a [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-add-a-link-to-a-pdf-in-java-tutorial/">How to add a link to a PDF in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hyperlinks in PDF documents allow you to specify websites or external resources that users can visit for more information. (Though they can also be <a href="https://blog.idrsolutions.com/how-to-remove-links-from-pdf-files-in-java-tutorial/" target="_blank">a source of phishing</a>!)</p>
<p>Our <a href="https://www.idrsolutions.com/jpedal/" target="_blank">Java PDF toolkit JPedal</a> contains a powerful PDF manipulation API which you can use to add links to PDF files</p>
<pre class='line-numbers' data-ad=jpedal><code class='language-java'>final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));

<br />final Annotation[] annotations = new Annotation[2];<br />
// Hyperlink annotation with blue color.<br />
annotations[0] = new Link(new float[] {200, 600, 300, 700}, new float[] {0.0f, 0.0f, 1.0f}, &quot;https://idrsolutions.com/&quot;);<br />
// Hyperlink annotation with red color.<br />
annotations[1] = new Link(new float[] {200, 300, 300, 400}, new float[] {1.0f, 0.0f, 0.0f}, &quot;https://www.idrsolutions.com/docs/&quot;);

<br />pdf.addAnnotation(1, annotations);

<br />pdf.apply();<br />
pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.closeDocument();<br />
</code></pre>
<p></p>
<h2>Download JPedal</h2>
<p>You can get a <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">JPedal trial jar</a> to test adding links to PDF files.</p>
<h2>Resources</h2>
<p>Learn more about the <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">PDF Manipulator API</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-add-a-link-to-a-pdf-in-java-tutorial/">How to add a link to a PDF in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Experience the &#8216;best 2 hours of your life&#8217; in Istanbul</title>
		<link>https://blog.idrsolutions.com/experience-the-best-2-hours-of-your-life-in-istanbul/</link>
		
		<dc:creator><![CDATA[Mark Stephens]]></dc:creator>
		<pubDate>Tue, 04 Nov 2025 14:36:09 +0000</pubDate>
				<category><![CDATA[idrsolutions]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37591</guid>

					<description><![CDATA[<p>In Sultanahmet square (Istanbul), there is a non-descript building between the Blue Mosque and Hagia Sophia. Most people just walk past it&#8230;. When I visit for the Devfest conference, I always take the time to visit (and I invite anyone on our team to attend as well). There are actually 2 entrances to the Hagia [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/experience-the-best-2-hours-of-your-life-in-istanbul/">Experience the &#8216;best 2 hours of your life&#8217; in Istanbul</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3052-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3052-300x225.jpeg" alt="Ayasofya bathhouse" width="300" height="225" class="aligncenter size-medium wp-image-37611" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3052-300x225.jpeg 300w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3052-1024x768.jpeg 1024w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3052-768x576.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3052-1536x1152.jpeg 1536w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_3052-2048x1536.jpeg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><br />
In Sultanahmet square (Istanbul), there is a non-descript building between the Blue Mosque and Hagia Sophia. Most people just walk past it&#8230;.</p>
<p>When I visit for the <a href="https://devfest.istanbul/" target="_blank">Devfest conference</a>, I always take the time to visit (and I invite anyone on our team to attend as well).</p>
<p>There are actually 2 entrances to the <a href="https://en.wikipedia.org/wiki/Hagia_Sophia_Hurrem_Sultan_Bathhouse" target="_blank">Hagia Sophia Hurrem Sultan Bathhouse</a> as there is a strict divide between women and men. I have only seen inside the men&#8217;s section but I am told they are identical. Inside you find a reception which looks like something out of <a href="https://en.wikipedia.org/wiki/One_Thousand_and_One_Nights" target="_blank">One thousand and one Arabian nights</a> complete with a fountain. </p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9752-scaled.jpeg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9752-225x300.jpeg" alt="Ayasofya bathhouse" width="225" height="300" class="aligncenter size-medium wp-image-37609" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9752-225x300.jpeg 225w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9752-768x1024.jpeg 768w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9752-1152x1536.jpeg 1152w, https://blog.idrsolutions.com/app/uploads/2025/11/IMG_9752-1536x2048.jpeg 1536w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a></p>
<p>Here you are given a private changing room to slip into a pair of disposable pants and a towel before sitting in the reception area to await your attendant (always the same sex as you). They will lead you into the heated section. Here you will be washed down with warm water and scrubbed to remove old skin and then covered in clay. Some time to sit and ponder life&#8230;. </p>
<p><a href="https://blog.idrsolutions.com/app/uploads/2025/11/250px-Hurrem_Sultan_Hamam_Roxelana_Bath_Interior.jpg"><img loading="lazy" decoding="async" src="https://blog.idrsolutions.com/app/uploads/2025/11/250px-Hurrem_Sultan_Hamam_Roxelana_Bath_Interior-200x300.jpg" alt="Inside Ayasofya" width="200" height="300" class="aligncenter size-medium wp-image-37612" srcset="https://blog.idrsolutions.com/app/uploads/2025/11/250px-Hurrem_Sultan_Hamam_Roxelana_Bath_Interior-200x300.jpg 200w, https://blog.idrsolutions.com/app/uploads/2025/11/250px-Hurrem_Sultan_Hamam_Roxelana_Bath_Interior.jpg 250w" sizes="auto, (max-width: 200px) 100vw, 200px" /></a></p>
<p>The clay is washed off and you are led to the heated raised section in the middle where you lie on the heated surface. You will be covered in bubbles and massaged from head to foot. You choose how vigourous this is!</p>
<p>You probably need a bit of a rest after all that, so you will be taken back to reception where you lie on your own couch, drinking tea or fruit juice and eating fresh fruit or Turkish delight. Your session is completed with a massage upstairs and a face mask and you return to your changing room and reality feeling amazing!</p>
<p>The experience is definitely not cheap (300 Euros) but I think it worth every penny. I describe it as &#8216;the best two hours of your life&#8217;, and no-one I have taken along has ever disagreed&#8230;</p>
<p>The post <a href="https://blog.idrsolutions.com/experience-the-best-2-hours-of-your-life-in-istanbul/">Experience the &#8216;best 2 hours of your life&#8217; in Istanbul</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/markee/">Mark Stephens</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to remove links from PDF files in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-remove-links-from-pdf-files-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Tue, 04 Nov 2025 12:43:22 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[annotations]]></category>
		<category><![CDATA[clean]]></category>
		<category><![CDATA[delete]]></category>
		<category><![CDATA[document]]></category>
		<category><![CDATA[hyperlinks]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[manipulate]]></category>
		<category><![CDATA[phishing]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[remove]]></category>
		<category><![CDATA[sanitize]]></category>
		<category><![CDATA[xss]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37493</guid>

					<description><![CDATA[<p>The PDF file format is very complex and contains many features to boost interactivity. One such feature is the ability for PDF files to contain links to external web pages or other resources. While useful, this functionality introduces risks! Bad actors can embed malicious hyperlinks which can be a source of phishing or cross-site scripting [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-remove-links-from-pdf-files-in-java-tutorial/">How to remove links from PDF files in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
The PDF file format is very complex and contains many features to boost interactivity. One such feature is the ability for PDF files to contain links to external web pages or other resources.
</p>
<p>
While useful, this functionality introduces risks! Bad actors can embed malicious hyperlinks which can be a source of phishing or cross-site scripting (XSS) attacks.
</p>
<p>
Our <a href="https://www.idrsolutions.com/jpedal/" target="_blank">PDF toolkit JPedal</a> allows you to remove links from PDF documents and sanitize files, removing the risk of malicious links.
</p>
<p>
To do this you need to <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download a JPedal jar</a>, then run the following code:
</p>
<pre class='line-numbers' data-ad=JPedal><code class='language-java'>final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));<br />
pdf.removeLinks();<br />
pdf.apply();<br />
pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.closeDocument();<br />
</code></pre>
<p>
Additionally, you may want to consider <a href="https://blog.idrsolutions.com/how-to-sanitize-pdf-files-removing-hidden-risks/">other sanitization options</a> to secure your documents.
</p>
<p><h2>Resources</h2>
<p>You can <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">download a trial jar from our website</a>.
</p>
<p>Learn more about the <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">PDF Manipulator API</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-remove-links-from-pdf-files-in-java-tutorial/">How to remove links from PDF files in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to add bookmarks to PDF files in Java (Tutorial)</title>
		<link>https://blog.idrsolutions.com/how-to-add-bookmarks-to-pdf-files-in-java-tutorial/</link>
		
		<dc:creator><![CDATA[Jacob Collins]]></dc:creator>
		<pubDate>Mon, 03 Nov 2025 16:48:41 +0000</pubDate>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPedal]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[bookmarks]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[outline]]></category>
		<guid isPermaLink="false">https://blog.idrsolutions.com/?p=37502</guid>

					<description><![CDATA[<p>Bookmarks are a useful way to outline the structure of a PDF file, acting like a table of contents. Many viewers will display bookmarks in a panel alongside the document which allows users to navigate between different pages. Our PDF SDK, JPedal, provides an API to create bookmarks programmatically. You can create arbitrarily complex bookmark [&#8230;]</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-add-bookmarks-to-pdf-files-in-java-tutorial/">How to add bookmarks to PDF files in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Bookmarks are a useful way to outline the structure of a PDF file, acting like a table of contents.</p>
<p>Many viewers will display bookmarks in a panel alongside the document which allows users to navigate between different pages.</p>
<p>Our PDF SDK, <a href="https://www.idrsolutions.com/jpedal/" target="_blank">JPedal</a>, provides an API to create bookmarks programmatically.</p>
<p>You can create arbitrarily complex bookmark structures and add them to any PDF file using the following code:</p>
<p><pre class='line-numbers' data-ad=jpedal><code class='language-java'>final PdfManipulator pdf = new PdfManipulator();<br />
pdf.loadDocument(new File(&quot;inputFile.pdf&quot;));

<br />final Bookmarks root = new Bookmarks();<br />
final Bookmark b = root.addChild(&quot;1&quot;, 1)<br />
        .addChild(&quot;1.1&quot;, 2)<br />
        .addChild(&quot;1.1.1&quot;, 3);<br />
b.addChild(&quot;1.1.1.a&quot;, 4);<br />
b.addChild(&quot;1.1.1.b&quot;, 5);<br />
b.addChild(&quot;1.1.1.c&quot;, 6);<br />
Bookmark b2 = b.addChild(&quot;1.1.1.d&quot;, 7);<br />
b2.addChild(&quot;1.1.1.d.A&quot;, 8);<br />
b2.addChild(&quot;1.1.1.d.B&quot;, 9);<br />
root.addChild(&quot;2&quot;, 11)<br />
        .addChild(&quot;2.1&quot;, 13);

<br />pdf.addBookmarks(root);<br />
pdf.apply();

<br />pdf.writeDocument(new File(&quot;outputFile.pdf&quot;));<br />
pdf.closeDocument();<br />
</code></pre><br />
</p>
<p>
Warning, calling the addBookmarks() method will erase any existing bookmarks.</p>
<h2>Download JPedal</h2>
<p>You can get a <a href="https://www.idrsolutions.com/jpedal/your-trial" target="_blank">JPedal trial jar</a> to test adding bookmarks to PDF files.</p>
<h2>Learn more</h2>
<p>Learn more about the <a href="https://www.idrsolutions.com/docs/jpedal/tutorials/pdf-manipulation/pdf-manipulator" target="_blank">PDF Manipulator API</a>.</p>
<p>We can help you <a href="https://blog.idrsolutions.com/understanding-the-pdf-file-format/" target="_blank">better understand the PDF format</a> as developers who have been working with the format for more than 2 decades!</p>
<p>The post <a href="https://blog.idrsolutions.com/how-to-add-bookmarks-to-pdf-files-in-java-tutorial/">How to add bookmarks to PDF files in Java (Tutorial)</a> appeared first on <a href="https://blog.idrsolutions.com">Java PDF Blog</a> and was written by <a href="https://blog.idrsolutions.com/author/jacob-collins/">Jacob Collins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
